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設定してませんが今後やっていきたいと思います。