お題
GKEを理解するために、実際に自分でアプリ作って乗せてみる。
まずは、適当なWebアプリ(golangで実装)を作ってdockerコンテナとしてローカルでrunしてアクセスできるところまで確認する。
環境
# OS
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="17.10 (Artful Aardvark)"
# Golang
$ go version
go version go1.10 linux/amd64
# Docker
$ sudo docker version
Client:
Version: 18.06.1-ce
API version: 1.38
Go version: go1.10.3
Git commit: e68fc7a
Built: Tue Aug 21 17:25:03 2018
OS/Arch: linux/amd64
Experimental: false
Server:
Engine:
Version: 18.06.1-ce
API version: 1.38 (minimum version 1.12)
Go version: go1.10.3
Git commit: e68fc7a
Built: Tue Aug 21 17:23:27 2018
OS/Arch: linux/amd64
Experimental: false
# gcloud
$ gcloud version
Google Cloud SDK 216.0.0
app-engine-go
app-engine-java 1.9.64
app-engine-python 1.9.75
beta 2018.07.16
bigtable
bq 2.0.34
cbt
cloud-build-local
cloud-datastore-emulator 2.0.2
cloud_sql_proxy
container-builder-local
core 2018.09.07
docker-credential-gcr
gsutil 4.33
kubectl 2018.08.17
pubsub-emulator 2018.02.02
実践
アプリ作り
■Web Framework
【echo】https://echo.labstack.com/
■ソース
まあ、適当です。(一応、後にStackdriverLoggingでログレベル別の表記となる仕掛けだけしておく)
https://github.com/sky0621/go-webapi-for-gke-study/blob/master/main.go
■Dockerfile
https://github.com/sky0621/go-webapi-for-gke-study/blob/master/Dockerfile
マルチステージビルドにして、実行時のベースイメージはscratch使う。とても軽量。
コンパイル時のベースイメージは、あらかじめGoのベースイメージにdepを加えておいたものをdockerhubに上げておいたので、それを使う。
https://hub.docker.com/r/sky0621dhub/dockerfile-gowithdep/
# step 1. compile
FROM "sky0621dhub/dockerfile-gowithdep" AS builder
COPY . /go/src/github.com/sky0621/go-webapi-for-gke-study
WORKDIR /go/src/github.com/sky0621/go-webapi-for-gke-study
RUN dep ensure
RUN go test ./...
RUN CGO_ENABLED=0 go build -o go-webapi-for-gke-study github.com/sky0621/go-webapi-for-gke-study
# -----------------------------------------------------------------------------
# step 2. build
FROM scratch
COPY --from=builder /go/src/github.com/sky0621/go-webapi-for-gke-study/ .
EXPOSE 80
ENTRYPOINT [ "./go-webapi-for-gke-study" ]
Docker Build
マルチステージにしたこともあって、ステップ多い・・・。
$ sudo docker build -t sky0621/go-webapi-for-gke-study:v0.1 .
Sending build context to Docker daemon 6.675MB
Step 1/10 : FROM "sky0621dhub/dockerfile-gowithdep" AS builder
---> 34ac64e9d330
Step 2/10 : COPY . /go/src/github.com/sky0621/go-webapi-for-gke-study
---> c849642eda5d
Step 3/10 : WORKDIR /go/src/github.com/sky0621/go-webapi-for-gke-study
---> Running in 4d7fc8ed246f
Removing intermediate container 4d7fc8ed246f
---> 1fc4e493dccd
Step 4/10 : RUN dep ensure
---> Running in 80e12ada08ba
Removing intermediate container 80e12ada08ba
---> 5b87dcf45beb
Step 5/10 : RUN go test ./...
---> Running in 094a6c185bbe
? github.com/sky0621/go-webapi-for-gke-study [no test files]
Removing intermediate container 094a6c185bbe
---> 8eaea36ad745
Step 6/10 : RUN CGO_ENABLED=0 go build -o go-webapi-for-gke-study github.com/sky0621/go-webapi-for-gke-study
---> Running in 167eb50e01f0
Removing intermediate container 167eb50e01f0
---> 5c950d0e57c0
Step 7/10 : FROM scratch
--->
Step 8/10 : COPY --from=builder /go/src/github.com/sky0621/go-webapi-for-gke-study/ .
---> e3f3efd1e244
Step 9/10 : EXPOSE 80
---> Running in 821d3bc99430
Removing intermediate container 821d3bc99430
---> 13b86f517dde
Step 10/10 : ENTRYPOINT [ "./go-webapi-for-gke-study" ]
---> Running in dad600e6aa43
Removing intermediate container dad600e6aa43
---> 29c44a061658
Successfully built 29c44a061658
Successfully tagged sky0621/go-webapi-for-gke-study:v0.1
できあがったDockerイメージの確認
14MB、軽い。ベースイメージがubuntuだったら800MBくらいになる。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sky0621/go-webapi-for-gke-study v0.1 29c44a061658 6 seconds ago 14MB
Docker Run
80番ポートでEXPOSEしてあるので、とりあえず内と外を同じポートでつなぐ。
$ sudo docker run -p 80:80 sky0621/go-webapi-for-gke-study:v0.1
____ __
/ __/___/ / ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v3.3.6
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
O\
⇨ http server started on [::]:80
Postman使ってcurl叩く
「200 OK」返り、「Hello, Go World!」出てるので疎通成功。
アクセスログも出てる。
{"level":"info","ts":1536766652.7998405,"caller":"go-webapi-for-gke-study/main.go:21","msg":"INFO LEVEL with severity","severity":"INFO"}
まとめ
単体としてコンテナ外からアクセス可能なDockerコンテナアプリの出来上がり。
次回は、GKEクラスタ作ったり、GCRにイメージプッシュするためのdeployment.yaml書いたり、Cloud Buildも絡めてみたり?
とにかく、GKEの理解につながるところまで試したい。