🐋
Udemy講座のサンプルをGo言語で書き直してみた Docker編
はじめに
前回にひきつづき、「Linux とネットワークの基礎から学ぶ Docker 入門」のGo言語化です。
今回はこの講座のテーマであるDockerコンテナ化しました。
次回から、本格的にWebアプリを作っていこうと思います。
Dockerfile
dockerhub-golangのサンプル通りに作成しました。あらかじめgo.modとgo.sumをコンテナにコピーし、ライブラリをダウンロードする処理が必要です。
FROM golang:1.23
WORKDIR /usr/src/app
COPY ./go.mod ./go.sum ./
RUN go mod download && go mod verify
Makefile
コマンドを打つのがたいへんなので、Makefile
をつくりました。
make run
で起動し、bashからプログラムを動作させるスタイルです。
run:
docker run -it \
--rm \
-v $(CURDIR):/usr/src/app \
-w /usr/src/app \
-p 4567:4567 \
-i \
--name golang-d \
golang_console:dockerfile \
bash
exec:
docker exec -it golang-d bash
echo:
echo ${PWD}
stop:
docker stop golang-d
docker rm golang-d
rm:
docker rm golang-d
build:
docker build -t golang_console:dockerfile
docker-compose
docker-composeではUdemy講座のように、nginxやmysqlも動作するようにしました。
苦労した点としては、mysqlコンテナが起動してから、goコンテナを実行するため、depends_on:mysqlとしていましたが、mysql接続を失敗してしまうため、healthcheckを追加しました。
docker-compose.yml
version: "3"
services:
nginx:
image: nginx:1.21.6
ports:
- "8000:80"
volumes:
- ./nginx/html:/usr/share/nginx/html
- ./nginx/conf.d:/etc/nginx/conf.d
depends_on:
- golang
golang:
build: ./golang
command: "go run ."
ports:
- "4567:4567"
volumes:
- ./golang/src:/usr/src/app
depends_on:
mysql:
condition: service_healthy
mysql:
image: mysql:8.0.29
platform: linux/x86_64
environment:
MYSQL_ROOT_PASSWORD: rootpassword
healthcheck:
test:
[
"CMD-SHELL",
'mysqladmin ping -h 127.0.0.1 --password="$$(cat /run/secrets/db-password)" --silent',
]
interval: 3s
retries: 5
start_period: 30s
ports:
- "3306:3306"
volumes:
- ./mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
- ./mysql/conf.d/charset.cnf:/etc/mysql/conf.d/charset.cnf
- ./mysql/data:/var/lib/mysql
Discussion