【GCP入門編・第8回】 Container Registry での Docker イメージの使用方法!
投稿日:2017/08/09
この記事では、 Container Registry に自分で作成したコンテナイメージを登録し、 Google Container Engine にデプロイする方法を解説します。
この記事の目的
- hello-world アプリケーションの Dockerfile を作成する
- Docker イメージをContainer Registry に登録する
- hello-world アプリケーションをGKEで動かす
Container Registry とは
Container Registry は、 Google が GCP のサービスの一部として提供するプライベートな Docker registry です。Docker Hub のように、イメージのアップロードやダウンロードを行うことができ、かつプロジェクトの外からはアクセスすることができないため、自前で Docker イメージを作成してデプロイする、といった作業をする際に必要となるサービスです。
Container Registry は、”コンテナイメージを登録する”、”Google Container Engine で使用する”といった基本的な機能に加え、 Jenkins や CircleCI, drone.io といった人気のある CI サービスとの統合もサポートしています。このため、 CI サーバーでビルドが通ったら自動的にコンテナイメージをデプロイする、という継続的デリバリーにも使用することが可能です。
Container Registry に自分の Docker イメージを登録する
今回は、自分で作った Docker イメージを Container Engine 上で使用する方法を解説します。まず、こちらの【GCP入門編・第5回】Google App Engine (GAE) でのアプリケーション起動方法!で作成した、 hello-world アプリケーションが動作するコンテナイメージを作成します。次に、ローカルの環境で動作を確認したのちに、 Container Registry にアップロードします。最後に、 Google Container Engine 上でクラスターを立ち上げ、アップロードしたイメージをデプロイします。
それでは、カスタムの Docker イメージを作成していきましょう。まず【GCP入門編・第5回】Google App Engine (GAE) でのアプリケーション起動方法!を参考に、ローカルの環境に hello-world アプリケーションを作成します。作成が終了した時点で、 hello-world アプリケーションのフォルダは以下のようになっているかと思います。
このディレクトリに、 Dockerfile を設置し、 docker コマンドでイメージを作成していきます。お使いの環境に Docker Engine がインストールされていない場合は、こちらを参考に Docker をインストールしましょう。
Docker Engine のインストールが完了したら、 hello-world アプリケーションのディレクトリに Dockerfile を設置します。お好きなエディタを使って、以下の内容の Dockerfile を作成します。
FROM library/ubuntu:trusty
LABEL description="Hello World Application"
RUN apt-get update && \
apt-get -y install python gunicorn python-flask
RUN mkdir /srv/hello-world
COPY . /srv/hello-world
WORKDIR /srv/hello-world
EXPOSE 8000
ENTRYPOINT ["/usr/bin/gunicorn", "-b", ":8000", "main:app"]
Dockerfile という名前で保存したら、ターミナル画面に戻り、イメージのビルドを行います。以下のコマンドでイメージのビルドが開始されます。
$ docker build -t hello-world-container .
“Successfully build …” というメッセージが表示されたら、イメージの作成は完了です。ローカル環境で試しに動かしてみましょう。
$ docker run -p 8000:8000 hello-world-container
コンテナが起動し、8000番ポートで gunicorn が動きましたでしょうか。ブラウザで、 http://127.0.0.1:8000/ にアクセスしてみましょう。
上記の画面のように、メッセージが表示されていれば、イメージの作成は完了です。次にこちらのイメージを Container Registry に登録していきましょう。
コンテナイメージの Container Registry への登録は、 gcloud コマンドを利用します。
まず、 Container Registry のタグについて説明します。 Container Registry のタグは以下の構成となっています。
gcr.io/プロジェクトID/コンテナイメージの名前
今回使うイメージは hello-world-container ですので、タグは以下の通りです。
gcr.io/プロジェクトID/hello-world-container
このタグをイメージに付与することによって、 gcloud コマンドでの Container Registry への登録が可能になります。まず、イメージにタグをつけます。
$ docker tag hello-world-container gcr.io/プロジェクトID/hello-world-container
特に出力はありません。下記のコマンドで、タグがつけられたことがわかります。
$ docker image ls
次に、このコンテナイメージを Container Registry にアップロードします。
$ gcloud docker -- push gcr.io/プロジェクトID/hello-world-container
アップロードが完了すると、上記のような出力がなされます。
コンソールの Container Engine のページにある、 Container Registry から、登録したイメージを参照することが可能です。
さて、それでは登録したイメージを使ってコンテナを起動してみましょう。
コンソールを開き、メニューの Container Engine をクリックし、クラスターの起動画面を開きます。
Zone は asia-northeast1-a, Size は1を指定し、 [Create] をクリックします。
クラスターが起動したら、ターミナルに戻ります。認証情報を取得します。
$ gcloud container clusters get-credentials cluster-1
次に、 kubectl で Pod を起動します。 –image の引数には、先ほどアップロードしたコンテナイメージのタグを入力します。
$ kubectl run hello-world --image=gcr.io/プロジェクトID/hello-world-container --port=8000
Pod の起動が完了したら、 Service を作成して外部からのアクセスが可能なようにします。
$ kubectl expose deployment hello-world --type=LoadBalancer
起動が完了したら、以下のコマンドで IP を確認しましょう。
$ kubectl describe services hello-world
Events: の項目に ”Created Load balancer” と表示されれば、サービスへのアクセスが可能になります。ブラウザで、 http://LoadBalancer Ingress の IPアドレス:8000/ を開きましょう。
下の図のように、 App Engine にデプロイした hello-world アプリケーションと同じものが見えると思います。
おわりに
いかがでしたでしょうか。 Container Registry を使うことで、自分で作成したコンテナイメージを簡単にプライベートなレジストリにアップロードし、 Google Container Engine にデプロイすることが可能です。この方法では開発環境と同じイメージを本番環境で使うため、開発環境と本番環境の差も少なく、よりシームレスに開発とデプロイを行えるのではないでしょうか。
同じシリーズの記事
-
【GCP入門編・第22回】 Stackdriver Logging で収集したログに対して、フィルタの実行や警告を設定しよう!
-
【GCP入門編・第21回】 Stackdriver Logging でアプリケーションのログを収集しよう!
-
【GCP入門編・第20回】 手間いらずでログ管理ができる Stackdriver Logging のご紹介!
-
【GCP入門編・第19回】 Stackdriver Monitoring でメールや Slack による通知を設定しよう!
-
【GCP入門編・第18回】 Stackdriver Monitoring で Google App Engine の監視をしよう!
-
【GCP入門編・第17回】 Stackdriver Monitoring で Google Compute Engine を監視しよう!
-
【GCP入門編・第16回】アプリのパフォーマンスを視覚的に確認できる Stackdriver Monitoring を紹介!
-
【GCP入門編・第15回】 GCP から AWS までモニタリングできる Google Stackdriver を紹介!
-
【GCP入門編・第14回】 Cloud Functions を使ってサーバレスアーキテクチャを体験しよう!
-
【GCP入門編・第13回】 Cloud Datalab でデータの可視化を行ってみよう!
-
【GCP入門編・第12回】 BigQuery を使って気軽にビッグデータの解析を行ってみよう!
-
【GCP入門編・第11回】 Google Cloud Dataproc を使ってデータを解析しよう!
-
【GCP入門編・第10回】スケーラブルな NoSQL データベースサービス Cloud Bigtable を使ってみよう!
-
【GCP入門編・第9回】 Cloud Shell で、いつでもどこでも Google Cloud Platform (GCP) が操作可能に!
-
【GCP入門編・第8回】 Container Registry での Docker イメージの使用方法!
-
【GCP入門編・第7回】知らなきゃ損! Google Container Engine (GKE) での Dockerイメージを使ったコンテナの起動方法!
-
【GCP入門編・第6回】これは簡単! Google App Engine での Cloud Datastore の利用方法!
-
【GCP入門編・第5回】 Google App Engine の魅力とは? Google App Engine (GAE) でのアプリケーション起動方法!
-
【GCP入門編・第4回】すぐ出来なくても大丈夫!サンプルアプリで Google Compute Engine (GCE) の動作練習!
-
【GCP入門編・第3回】難しくない! Google Compute Engine (GCE) でのインスタンス起動方法!
-
【GCP入門編・第2回】まずは、ここから!知らないと恥ずかしい Google Cloud Platform (GCP) の事前準備!
-
【GCP入門編・第1回】エンジニア必読!今さら聞けない、Google Cloud Platform (GCP) とは?