メニュー

【GCP入門編・第8回】 Container Registry の魅力とは!? Container Registry での Docker イメージの使用方法!

【GCP入門編・第8回】 Container Registry での Docker イメージの使用方法!

GCP

記事投稿 | 2017.08.09

【GCP入門編・第8回】 Container Registry の魅力とは!? Container Registry での Docker イメージの使用方法!

この記事では、 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 アプリケーションのフォルダは以下のようになっているかと思います。

01.jpg

このディレクトリに、 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 .

02.jpg

“Successfully build …” というメッセージが表示されたら、イメージの作成は完了です。ローカル環境で試しに動かしてみましょう。

$ docker run -p 8000:8000 hello-world-container

03.jpg

コンテナが起動し、8000番ポートで gunicorn が動きましたでしょうか。ブラウザで、 http://127.0.0.1:8000/ にアクセスしてみましょう。

04.jpg

上記の画面のように、メッセージが表示されていれば、イメージの作成は完了です。次にこちらのイメージを 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

05.png

次に、このコンテナイメージを Container Registry にアップロードします。

$ gcloud docker -- push gcr.io/プロジェクトID/hello-world-container

06.png

アップロードが完了すると、上記のような出力がなされます。

コンソールの Container Engine のページにある、 Container Registry から、登録したイメージを参照することが可能です。

07.png

さて、それでは登録したイメージを使ってコンテナを起動してみましょう。

コンソールを開き、メニューの Container Engine をクリックし、クラスターの起動画面を開きます。

08.jpg

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

09.png

Pod の起動が完了したら、 Service を作成して外部からのアクセスが可能なようにします。

$ kubectl expose deployment hello-world --type=LoadBalancer

10.png

起動が完了したら、以下のコマンドで IP を確認しましょう。

$ kubectl describe services hello-world

11.png

Events: の項目に ”Created Load balancer” と表示されれば、サービスへのアクセスが可能になります。ブラウザで、 http://LoadBalancer Ingress の IPアドレス:8000/ を開きましょう。

下の図のように、 App Engine にデプロイした hello-world アプリケーションと同じものが見えると思います。

12.png

おわりに

いかがでしたでしょうか。 Container Registry を使うことで、自分で作成したコンテナイメージを簡単にプライベートなレジストリにアップロードし、 Google Container Engine にデプロイすることが可能です。この方法では開発環境と同じイメージを本番環境で使うため、開発環境と本番環境の差も少なく、よりシームレスに開発とデプロイを行えるのではないでしょうか。

PAGE TOP