Docker上でGo-WebServer
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