2 minutes
[GCP] GoのコンテナをContainerRegistryに登録して使う
お世話になっております。
しゃまとんです。
KubernetesでGoを使いたいのですが、そのままコードを配置みたいな感じではなく、
Dockerの様にコンテナイメージを作成してPodとして配置するような形式をとります。
(勿論、やり方はコレ以外にもありそう?)
GCPにはDockerhubのようなコンテナのホスティングサービス(Container Registry)があり、 yamlからアップロード済みイメージを利用することができるようになっています。
イメージを作成して、それを配置するだけとなると運用も楽ですしデプロイもRollingUpdateをいい感じにしてくれるみたいなので、 それを前提にして考えたいと思います。
まずは簡単にテスト用のコードを用意します。
アドレスで簡単な返答をするサンプルです。
package main
import (
"fmt"
"net/http"
)
type String string
func (s String) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, s)
}
func main() {
http.Handle("/", String("ok"))
http.Handle("/sample", String("sample"))
http.ListenAndServe("localhost:9999", nil)
}
次にこれをコンテナイメージにしていきます。
Dockerfileを下記のような感じで作成しておきます。
これをビルドしてイメージが作成されたら、Container Registryにアップロードしましょう。
(your-project-idは置き換えてください)
FROM golang:1.9.2-alpine
MAINTAINER shamaton
# copy source
COPY main.go main.go
# port
EXPOSE 9999
CMD ["go", "run", "main.go"]</pre>
<pre class="lang:default decode:true"># イメージ作成
docker build -t sample-web-app:ver1.0.0 .
# タグつけ
docker tag sample-web-app:ver1.0.0 asia.gcr.io/your-project-id/sample-web-app:ver1.0.0
# container registryにpush
gcloud docker -- push asia.gcr.io/your-project-id/sample-web-app:ver1.0.0
イメージが存在しているかコンソールから確認してみましょう。
以下のようにsample-web-appが追加されていますね。
試しにローカルにpullして確認してみます。一応手元のビルドしたものを削除してしまいます。
# 手元のイメージを削除
docker rmi sample-web-app:ver1.0.0
docker rmi gcr.io/your-project-id/sample-web-app:ver1.0.0
# container registryから取得
gcloud docker -- pull gcr.io/your-project-id/sample-web-app:ver1.0.0
# コンテナ起動
docker run --name sample-app --rm -p 9999:9999 -t gcr.io/your-project-id/sample-web-app:ver1.0.0
アクセスすると…
同じように使えますね!Kubernetesからも同じように動作して使えますが、 Dockerと一緒で使い捨てされることを考慮しておかないといけないので、 運用の際には用途を決めておく必要がありそうです。
以上です。
■ 参考