Dockerを使用してGoサーバーを展開する

はじめに



今週、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の束を使ってさらに多くのことができます。



アンドリュー・ジェラン



翻訳者から:翻訳の正確性、スペル、スタイルに関するすべてのコメントは、個人的なメッセージで送信してください。 修正させていただきます。



All Articles