GCEでdocker-composeでウェブサービスを立ち上げる

GCE(Google Compute Engine)上でdocker-composeを使ってウェブサービスの環境を作成し、ブラウザからアクセスするまでをまとめました。

GCEのインスタンスを汚したくないため、ソースコードなどウェブサービスに必要なものは全てイメージ化・コンテナ化します。よってイメージはGCR(Google Container Registry)から取ってくるようにします。

この方法を取ると何がいいかと言うと、ローカルで作った環境がそのまま本番サーバ上に簡単に作成できるという点だと思います。

前提

  • Google Cloud Platformにプロジェクトがある
  • すでにdocker-composeで起動可能なプロジェクトがある
  • ホストPCはMacOS
  • ホストPCでgcloudコマンドが使える
  • pull可能なイメージがGCR上にある

GCEインスタンス

まずはGoogle Compute Engineのインスタンスを立ち上げます。

今回は費用を抑えるべく、小さなインスタンスを使います。また、OSはコンテナに最適化されたものを使用します。

マシンタイプ: f1-micro
ゾーン: us-central1-a
オペレーティングシステム: Container Optimized OS

これでインスタンスを作成します。ちなみにこの設定だと月々のインスタンス料金は約500円です。

インスタンスは15秒ほどで立ち上がります。

インスタンスが立ち上がったらにsshで入ります。

$ gcloud compute ssh インスタンス名 --zone=ゾーン名
(例: gcloud compute ssh docker-compose-test --zone=us-central1-a)

(ここから先のコマンドは全てGCE上での実行になります)

Docker

dockerは最初から入っています。

$ which docker
/usr/bin/docker

docker-compose

docker-composeをインストールします。

$ docker run docker/compose:1.24.0 version

GCR認証

GCRからイメージを取得するようにします。

デフォルトだと権限がありませんよと言われてしまいます。

unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication

以下の手順で権限を取得します。

$ git clone https://github.com/GoogleCloudPlatform/docker-credential-gcr.git
$ docker-credential-gcr configure-docker
/home/ユーザ名/.docker/config.json configured to use this credential helper for GCR registries

この時点で、以下のようなファイルが生成されます。

$ cat ~/.docker/config.json
{
	"auths": {},
	"credHelpers": {
		"asia.gcr.io": "gcr",
		"eu.gcr.io": "gcr",
		"gcr.io": "gcr",
		"staging-k8s.gcr.io": "gcr",
		"us.gcr.io": "gcr"
	}
}

次のコマンドを実行してください。

$ docker-credential-gcr gcr-login

ここでURLが表示されると思いますので、そのURLをブラウザで叩いて進んで行ってください。

するとこんな画面が出てきますので許可ボタンを押下します。

すると、認証コードが出てきますので、そのコードをターミナルに入力します。

これでGCR認証は完了です。

イメージをpull

GCRにアップされているイメージを下記コマンドで取得する

$ docker pull gcr.io/プロジェクト名/タグ:バージョン

docker-compose修正

$ docker images

上記コマンドを実行すると、dockerイメージのリストが出てきます。必要なイメージのIDをコピーして、docker-compose.ymlの image に指定します。

version: '3.7'
services:
  django:
    image: イメージID
    volumes: 

この作業が結構面倒なので、どうにかして簡略化できたらいいなと思っています。

docker-compose up

DockerイメージのIDをdocker-compose.ymlに貼り付けたら準備完了です。

以下コマンドを実行してみましょう。

$ docker-compose up

ブラウザでアクセス

ブラウザでGCPコンソースのGCEインスタンス一覧画面の 外部IP にアクセスしてみてください。

サイトに遷移できたら成功です。

ちなみに今回僕が構築したのはこのサイトです。

http://twinspector.nothing-behind.com/

docker-composeの構成はこんな感じです。

  • Django(python)
  • MySQL
  • Redis
  • Nginx

まだSSL設定してませんが今後やっていきたいと思います。

Related Posts