🐋

Udemy講座のサンプルをGo言語で書き直してみた Docker編

2025/01/29に公開

はじめに

前回にひきつづき、「Linux とネットワークの基礎から学ぶ Docker 入門」のGo言語化です。
https://www.udemy.com/course/docker-from-linux-and-networking/

今回はこの講座のテーマである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