LoginSignup
3
4

More than 5 years have passed since last update.

GKE試行(その1:「乗せるアプリを作ってdocker runするところまで」)

Last updated at Posted at 2018-09-12

お題

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叩く

postman.png

「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の理解につながるところまで試したい。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4