😺
【Golang】GoのHttpServerをDockerで起動する
dockerからgoのhttp serverを立てるコードの例と、ポイントを解説します。
goのクマって虫コナーズのクマに似てますよね
ディレクトリ構成
最終的なディレクトリ構成は下記のようになりました
構成自体は、下記のStandard Go Project Layoutを参考にしています。
Docker
docker-compose.yml
goを動かすappコンテナと、mysqlを動かすdbコンテナを立てます。
version: "3"
services:
app:
container_name: go_container
build:
context: ./app
ports:
- 8080:8080
tty: true
volumes:
- ./app:/go/src/app
db:
container_name: go_db_container
image: mysql:8.0
ports:
- 3307:3307
volumes:
- go-db-volume:/var/lib/mysql
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
MYSQL_USER: ${USER}
MYSQL_ROOT_PASSWORD: ${ROOT_PASSWORD}
MYSQL_PASSWORD: ${PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
volumes:
go-db-volume:
Dockerfile
ポイントを番号を振って下で解説しています。
FROM golang:1.20-bullseye
# 1
ENV ROOT=/go/src/app
WORKDIR ${ROOT}
# 2
RUN apt update \
&& apt clean \
&& rm -r /var/lib/apt/lists/*
RUN apt install git && \
apt install curl
# 3
COPY go.mod go.sum ./
# 4
RUN go mod download
# 5
RUN go get -u github.com/go-sql-driver/mysql
COPY . .
EXPOSE 8080
# 6
CMD ["go", "run", "main.go"]
- ENV ROOTを設定しないとコンテナ内でpermission errorが出るので設定
- apt cleanしないとbuild時にwarningが出る
- go mod downloadの実行に必要なファイルをローカルからコピー
- go module(依存関係の解決に必要)をコンテナ内でダウンロード
- mysqlとgoの接続に必要なパッケージをインストール
- コンテナ内の
main.go
でhttp serverを設定し、go runで実行
Go
main.go
main.goファイルでhttp serverを設定し、Dockerfileから実行することでコンテナを起動する
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello golang")
})
http.ListenAndServe(":8080", nil)
}
サーバの立ち上げが確認できました。
Discussion