私のDocker+Go環境構築手順を資料化しておきます。
キャッシュでコケたりしていたのでできるだけ簡単にできそうな手順を作ってみた。
対象者
・Web開発初学者
・他分野でのプログラミング経験者
・Linuxコマンドはまぁまぁわかる人
実施環境
・Mac M2 Sonoma 14.6.1
・Docker for Mac 4.40.0
・Docker 28.0.4
・Go 1.21
Docker環境構築
こちらのページのDocker部分のみ利用
プロジェクト予定構造
Goのプロジェクト構成は以下の通り作成する
※初学者はここまで行う必要がない
参考資料
予定プロジェクト階層
<Root>
┣━Project名/
┃ ┣━cmd
┃ ┃ ┣━main.go
┃ ┗━docker
┃ ┗━Dockerfile
┗━docker-compose.yml
ファイル用意
Dockerfile...
// use golang version
FROM golang:1.21
// これ移行Docker上では/app以下で扱う
WORKDIR /app
// 現在のローカルのルートからコンテナのルート(/app)へコピー
// ignore未設定なので全データコピー?
COPY . .
RUN go mod init sampleapp
RUN go get github.com/go-sql-driver/mysql
RUN go build -o main ./cmd
EXPOSE 8080
CMD ["./main"]
docker-compose.yml
services:
app:
build:
context: .
dockerfile: ./docker/Dockerfile
ports:
- "8080:8080"
depends_on:
- mysql
environment:
- DB_HOST=mysql
- DB_PORT=3306
- DB_USER=user
- DB_PASSWORD=password
- DB_NAME=testdb
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: testdb
MYSQL_USER: user
MYSQL_PASSWORD: password
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
main.go
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello from Go Web Service in Docker!")
}
func main() {
http.HandleFunc("/", handler)
fmt.Println("Server running on port 8080")
http.ListenAndServe(":8080", nil)
}
ビルド、実行
Rootの位置で以下コマンドを叩く
ターミナル.
sampleapp% docker compose build
sampleapp% docker compose up
以下URLを叩いて動作を確認する
今回やれていないこと
・env等の外部設定化
・キャッシュや開発効率化を考えた実装
・その他、大規模開発を考慮した設計
・Dockerの詳細な使い方
