DockerでGoのWebサーバーを起動する


ミニマムにやっておかないと忘れがちなのでメモ

サンプル用Goサーバを作成する

package main
import (
"encoding/json"
"net/http"
)
type User struct {
FirstName string `json:"firstName"`
LastName  string `json:"lastName"`
}
func users(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "application/json")
user := User{
FirstName: "John",
LastName: "Doe",
}
var users []User
users = append(users, user)
json.NewEncoder(w).Encode(users)
}
func main() {
http.HandleFunc("/users", users)
http.ListenAndServe(":8002", nil)
}

普通に起動して動作確認をします。

$ go run main.go

http://localhost:8002/usersにアクセスするとJSON結果が出力されます。

[
{
"firstName": "John",
"lastName": "Doe"
}
]

Dockerfile

Dockerfileを作成します。alpineをつけるとよりミニマムなイメージができます。参考(https://hub.docker.com/_/golang?tab=description

FROM golang:1.14
#FROM golang:1.14-alpine
# コンテナログイン時のディレクトリ指定
WORKDIR /opt/sandbox-docker-go
# ホストのファイルをコンテナの作業ディレクトリにコピー
COPY . .
# ADD . .
# ビルド
RUN go build -o app main.go
# 起動
CMD ["/opt/sandbox-docker-go/app"]

構成

$ tree
.
├── Dockerfile
└── main.go

ビルド

$ docker build -t sandbox-docker-go .
[+] Building 3.0s (9/9) FINISHED
=> [internal] load build definition from Dockerfile                                                                                                                                                                               0.0s
=> => transferring dockerfile: 361B                                                                                                                                                                                               0.0s
=> [internal] load .dockerignore                                                                                                                                                                                                  0.0s
=> => transferring context: 2B                                                                                                                                                                                                    0.0s
=> [internal] load metadata for docker.io/library/golang:1.14                                                                                                                                                                     1.8s
=> [1/4] FROM docker.io/library/golang:1.14@sha256:d31a307a7e42116adb00d8d70971dbf228460904dd9b6217e911d088aa4b650c                                                                                                               0.0s
=> [internal] load build context                                                                                                                                                                                                  0.0s
=> => transferring context: 605B                                                                                                                                                                                                  0.0s
=> CACHED [2/4] WORKDIR /opt/sandbox-docker-go                                                                                                                                                                                    0.0s
=> [3/4] COPY . .                                                                                                                                                                                                                 0.0s
=> [4/4] RUN go build -o app main.go                                                                                                                                                                                              1.0s
=> exporting to image                                                                                                                                                                                                             0.1s
=> => exporting layers                                                                                                                                                                                                            0.1s
=> => writing image sha256:b59f0afdb5a50873182e88aa7e65836b15049b8a8e3d8a3644a856cc438e3610                                                                                                                                       0.0s
=> => naming to docker.io/library/sandbox-docker-go   

Dockerイメージが作成されました。

$ docker images
REPOSITORY                                   TAG                 IMAGE ID            CREATED             SIZE
sandbox-docker-go                            latest              b59f0afdb5a5        30 seconds ago      817MB

コンテナ起動

$ docker run -p 8002:8002 -td --name sandbox-docker-go b59f0afdb5a5<br>8fe6ad253218c6c700eb91f458eed99cc8bfbd0ea03423d21a6a42d851268409

プロセスチェック

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
8fe6ad253218        b59f0afdb5a5        "/opt/sandbox-docker…"   26 seconds ago      Up 26 seconds                           infallible_williams

http://localhost:8002/usersにアクセスして動作確認をします。

[
{
"firstName": "John",
"lastName": "Doe"
}
]

コンテナ再起動

$ docker restart cb8f814837cf

コンテナ停止

$ docker stop cb8f814837cf

コンテナ起動

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
cb8f814837cf        b59f0afdb5a5        "/opt/sandbox-docker…"   3 minutes ago       Exited (2) 52 seconds ago                        reverent_snyder
$ docker start cb8f814837cf

コンテナプロセスkill

$ docker kill cb8f814837cf

コンテナ削除

$ docker rm cb8f814837cf

イメージ削除

$ docker images
REPOSITORY                                   TAG                 IMAGE ID            CREATED             SIZE
sandbox-docker-go                            latest              b59f0afdb5a5        13 minutes ago      817MB
$ docker rmi b59f0afdb5a5

カテゴリー: Go

関連記事