Docker上でGo-WebServer

2021/09/18に公開

Docker上でGo-WebServer

概要

Docker上でGoのWebServerを起動します。
Dockerを初めて触るのでいちいち説明を入れます。くどいですがご了承ください。

全体の流れ

  • Dockerfileとsrc/main.goを作り、中身を書いていきます。
  • イメージを立ち上げコンテナを動かします。
  • コンテナ内で webserver を動かします。
    (おまけ)main.goを書き換えて、反映されるかテストします。
  • 問題なく動作したら、またDockerfileの中身を書き換えます。
  • 新しくコンテナを立ち上げ直し動かします。
  • おわり!

説明

Dockerfileとsrc/main.go

ディレクトリ構造

dockertest % tree   
.
├── Dockerfile
└── src
    └── main.go

1 directory, 2 files

Dockerfile

FROM golang:1.16.5

WORKDIR /testdir

COPY ./src /testdir

CMD ["/bin/bash"]

FROM golang:1.16.5
ベースイメージに、1.16.5バージョンのGoを指定。


WORKDIR /testdir
カレントディレクトリの指定


COPY ./src /testdir
ローカル上の./srcを、Docker上の/testdirにコピー


CMD ["/bin/bash"]
コンテナ起動直後bashを起動。

main.go

package main

import (
	"fmt"
	"net/http"
)

func handler(writer http.ResponseWriter, _ *http.Request) {
	fmt.Fprint(writer, "Hello World")
}

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8000", nil)
}

net/httpパッケージを使います。


main関数
http.HandleFunc("/", handler)はパス/をトリガーにhandler()を実行します。
つまりhttp://localhost:8000/に接続すると自動でhandler()を実行します。


http.ListenAndServe(":8000", nil)でポート8000にサーバーを起動します。


handler関数
"Hello World"を表示します。今回はリクエストを使用しません。

イメージを立ち上げコンテナを動かす

docker image build -t sample/webtest:latest .
docker container run -it -p 8000:8000 --name webtest -v 
${PWD}/src:/app sample/webtest:latest

※一行に収まらなかったので改行しました。
main.goがあるか確認。

root@aab3108d162f:/app# ls
main.go

サーバーを動かします。

root@aab3108d162f:/app# go run main.go

local:8000にアクセス。

main.goを書き換えて、反映されるかテスト

root@aab3108d162f:/app# cat main.go 
package main

import (
        "fmt"
        "net/http"
)

func handler(writer http.ResponseWriter, _ *http.Request) {
        fmt.Fprint(writer, "Hello World")
}

func main() {
        http.HandleFunc("/", handler)
        http.ListenAndServe(":8000", nil)
}

main.goを書き換え。
"Hello World" -> "change print"

root@aab3108d162f:/app# cat main.go 
package main

import (
        "fmt"
        "net/http"
)

func handler(writer http.ResponseWriter, _ *http.Request) {
        fmt.Fprint(writer, "change print")
}

func main() {
        http.HandleFunc("/", handler)
        http.ListenAndServe(":8000", nil)
}
root@aab3108d162f:/app# go run main.go

local:8000にアクセス。
Hello World から change print に書き変わっていることを確認。
exitでコンテナから抜けます。

Dockerfileの中身を書き換え

無事起動出来たので、DocekrfileのCMDをgo run main.goに書き換えます。

FROM golang:1.16.5

WORKDIR /app

COPY ./src /app

CMD ["go", "run", "main.go"]

新しくコンテナを立ち上げ直し動かす

webtestコンテナを削除

docker container rm webtest

もう一度、イメージを作りコンテナを動かします。

docker image build -t sample/webtest:latest .
docker container run -d -p 8000:8000 --name webtest -v 
${PWD}/src:/app sample/webtest:latest

-dオプションをつけることでコンテナをバックグラウンドで実行出来ます。
docker container lsで動いていることが確認できます。

dockertest % docker container ls
CONTAINER ID   IMAGE                   COMMAND            CREATED          
STATUS          PORTS                                       NAMES
2daf7ca3ea67   sample/webtest:latest   "go run main.go"   32 sec
onds ago   Up 31 seconds   0.0.0.0:8000->8000/tcp, :::8000->800
0/tcp   webtest

local:8000にアクセス。
無事表示されました。

片付け

コンテナの停止

docker container stop webtest

コンテナの消去

docker container rm webtest

イメージの消去

docker image rm webtest

おわり!

Discussion