はじめに
今週、Dockerチームは Goおよびその他の主要言語の公式ベースイメージを発表し、開発者にGoプログラムのコンテナを作成する簡単で信頼性の高い方法を提供しました。
この記事では、Goでの単純なWebアプリケーション用のDockerコンテナーの作成と、このコンテナーのGoogle Compute Engineへのデプロイについて説明します。 Dockerを初めて使用する場合は、さらに読む前にDockerについての記事を読んでください。
デモアプリ
この例では、Goサンプルリポジトリの outyetプログラムを使用します 。これは、Goの次のバージョンがリリースされたかどうかを報告する単純なWebサーバーです。 このプログラムには標準ライブラリ以外の依存関係はなく、実行時に追加のデータファイルを必要としません。
「go get」を使用して、outyetを作業環境にダウンロードしてインストールします。
$ go get github.com/golang/example/outyet
Dockerfileを作成する
outyetディレクトリに次の内容のDockerfileというファイルを作成します。
# Start from a Debian image with the latest version of Go installed # and a workspace (GOPATH) configured at /go. FROM golang # Copy the local package files to the container's workspace. ADD . /go/src/github.com/golang/example/outyet # Build the outyet command inside the container. # (You may fetch or manage dependencies here, # either manually or with a tool like "godep".) RUN go install github.com/golang/example/outyet # Run the outyet command by default when the container starts. ENTRYPOINT /go/bin/outyet # Document that the service listens on port 8080. EXPOSE 8080
このDockerfileは、基本的な依存関係(GoがインストールされたDebianシステム、 公式のgolangイメージ )から始めて、完全に実行されるコンテナーの構築方法を示します。 そして、未完成のソースコード、そのアセンブリ、そして最後に打ち上げで終わります。
手順ADD、RUN、およびENTRYPOINTは、すべてのGoプロジェクトに共通です。 より簡単なオプションがあります。golangイメージからonbuildを実行すると、パッケージのソースコードが自動的にコピーされ、アプリケーションの依存関係が読み込まれ、プログラムがコンパイルされ、起動時に起動するように設定されます。
onbuildオプションを使用すると、Dockerfileがはるかに簡単になります。
FROM golang:onbuild EXPOSE 8080
イメージをビルドして実行する
アプリケーションディレクトリからdockerを呼び出して、Dockerfileからイメージをビルドします。
$ docker build -t outyet .
この場合、golang Docker Hubのベースイメージが取得され、アプリケーションのコンテンツがそこにコピーされます。 結果の画像はoutyetタグでタグ付けされます。
作成されたイメージでコンテナを起動するには、次のコマンドを実行します:
$ docker run --publish 6060:8080 --name test --rm outyet
--publish
フラグは、ホストシステムの6060コンテナーからポート8080を転送する必要があることをDockerに
--publish
ます。
--name
フラグは、コンテナーをさらに処理しやすくするために、コンテナーに指定された名前を付けます。
--rm
フラグは、コンテナが終了したら削除する必要があることを示します。
コンテナーを起動し、ブラウザーでlocalhostアドレス:6060 /を開きます。 次のようなものが表示されるはずです。
(Dockerが別のマシン(または仮想マシン)で実行されている場合、localhostをこのマシンのアドレスに置き換える必要があります。OSXまたはWindowsでboot2dockerを使用する場合、
boot2docker ip
を使用してこのアドレスを検索できます。
イメージが機能することを確認したので、別のターミナルウィンドウから作業コンテナを閉じましょう。
$ docker stop test
Docker Hubでリポジトリを作成する
以前にgolangイメージを取得したコンテナリポジトリであるDocker Hubには、GitHubまたはBitBucketのリポジトリからイメージを収集できる自動ビルド機能があります。
リポジトリにDockerfileをコミットし、そのための自動ビルドを作成した後、Dockerがインストールされているユーザーは、1つのコマンドでイメージをダウンロードして実行できます。 (次のセクションでこれがどれほど役立つかを見ていきます。)
自動アセンブリを構成するには、GitHubまたはBitBucketのリポジトリにDockerfileをコミットし、Docker Hubでアカウントを作成し、自動アセンブリを作成するためのすべての指示に従う必要があります。
すべての準備ができたら、自動アセンブリの名前を使用してコンテナを起動できます。
$ docker run goexample/outyet
(goexample / outyetを、作成した自動アセンブリの名前に置き換えてください)
Google Compute Engineでコンテナーをデプロイする
Googleは、 コンテナに最適化されたGoogle Compute Engineイメージを提供します。これにより、任意のDockerコンテナで動作する仮想マシンを簡単に選択できます。 起動時に、実行中のプログラムは構成ファイルを読み取り、実行するコンテナーを決定し、コンテナーのイメージを取得して起動します。
実行するDockerイメージと転送するポートを定義するcontainer.yamlファイルを作成します。
version: v1beta2 containers: - name: outyet image: goexample/outyet ports: - name: http hostPort: 80 containerPort: 8080
8080コンテナのポートを、HTTPトラフィックを提供するためのデフォルトポートである外部80ポートに転送することに注意してください。 また、goexample / outyetを自動ビルドの名前に置き換える必要があります。
gcloudを使用して、コンテナの仮想マシンインスタンスを作成します。
$ gcloud compute instances create outyet \ --image container-vm-v20140826 \ --image-project google-containers \ --metadata-from-file google-container-manifest=containers.yaml \ --tags http-server \ --zone us-central1-a \ --machine-type f1-micro
最初の引数(outyet)はインスタンスの名前を指定します。これは後で管理目的で便利に使用されます。
--image
および
--image-project
フラグは、コンテナに最適化された特別なシステムイメージを指定します(これらのフラグをそのままコピーします)。
--metadata-from-file
フラグは、containers.yamlファイルを仮想マシンに転送します。
--tags
フラグは、VMインスタンスをHTTPサーバーとしてマークし、ポート80を開くようファイアウォールに指示します。
フラグ
--zone
および
--machine-type
フラグは、VMを起動するゾーンと
--machine-type
を示します。 (マシンタイプとゾーンのリストを表示するには、
gcloud compute machine-types
)
完了すると、gcloudチームは作成されたインスタンスに関する情報を表示する必要があります。 出力で、
networkInterfaces
セクションを見つけます
networkInterfaces
インスタンスのIPアドレスがそこに表示されます。 数分後、ブラウザでこのIPを開き、「Go 1.4がまだリリースされていますか?」と表示されるはずです。
(仮想マシンで何が起こるかを確認するには、
gcloud compute ssh outyet
を使用してSSH経由で接続でき
gcloud compute ssh outyet
。そこで、
sudo docker ps
gcloud compute ssh outyet
sudo docker ps
を試して、どのDockerコンテナが機能するかを確認してください)
追加情報
私たちがしたことは氷山の一角に過ぎず、Go、Docker、Google Compute Engineの束を使ってさらに多くのことができます。
- Dockerの詳細については、 詳細なドキュメントを参照してください。
- Docker and Goの詳細については、Docker Hubの公式golangリポジトリをご覧ください 。
- DockerとGoogle Compute Engineの詳細については、 コンテナに最適化されたVMページとgoogle / docker-registryリポジトリをご覧ください。
アンドリュー・ジェラン
翻訳者から:翻訳の正確性、スペル、スタイルに関するすべてのコメントは、個人的なメッセージで送信してください。 修正させていただきます。