えんじにあ雑記!

開発していて学んだことをまとめていきます!

Go + MySQL + Dockerで環境構築やってみた

f:id:flat-M_M:20200702153936j:plain

Go + MySQL + Dockerを使って、環境構築をやってみた際に作成したDockerfileやdocker-compose.ymlの解説です。

はじめに

オリジナルゲームの開発を始めて、サーバサイドの環境構築にdockerを用いたので、その時の方法を説明していきます。

環境

ディレクトリ構成

プロジェクトのディレクトリ構成は現状このように構成しています。

.
├── README.md
├── api
│   ├── Dockerfile
│   └── src
├── db
│   ├── Dockerfile
│   └── sql
├── docker-compose.yml
└── my.cnf

api

apiディレクトリ以下には、Golangで実装されているサーバサイド プログラムがあります。

db

dbディレクトリ以下には、MySQLコンテナ起動のためのDockerfileと初期化時に実行するSQLを保管しておくsqlディレクトリがあります。

docker-compose.yml

GolangサーバのDockerコンテナと、MySQLコンテナを起動するためのdocker-composeファイルになります。

my.cnf

MySQLサーバにアクセスする際の機密情報や、環境設定を記したファイルになります。

GolangサーバのDockerfile

FROM golang:1.13 AS builder

# 作業ディレクトリを作成する
RUN mkdir /go/src/github.com && mkdir /go/src/github.com/<アカウント名> && mkdir /go/src/github.com/<アカウント名>/<プロジェクト名>

# Move all files and dirs to workdir
COPY ./src/ /go/src/github.com/<アカウント名>/<プロジェクト名>/
WORKDIR /go/src/github.com/<アカウント名>/<プロジェクト名>/
ENV GO111MODULE=on
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o /main .

FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY --from=builder /main ./
RUN chmod +x ./main
EXPOSE 1323
ENTRYPOINT ["./main"]

MySQLのDockerfile

FROM mysql:latest

COPY sql /docker-entrypoint-initdb.d

RUN apt-get update
RUN apt-get install -y locales
RUN rm -rf /var/lib/apt/lists/*
RUN echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen
RUN locale-gen ja_JP.UTF-8

ENV LC_ALL ja_JP.UTF-8

CMD ["mysqld"]

MySQLコンテナを立ち上げた時に、初期化として実行したいSQLがある場合は

docker-entrypoint-initdb.d

以下にsqlコマンドを記入したファイルをコピーすることで、実行してくれます。

今回もsqlディレクトリ以下のファイルを全てコピーしてコンテナ起動時にSQLを実行するようにしています。

docker-compose.yml

version: '3'
services:
  db:
    container_name: <DBコンテナ名>
    build:
      context: db
    volumes:
      - <DBボリューム名>:/var/lib/mysql
      - ./db/sql/:/docker-entrypont-initdb.d
      - ./my.cnf:/etc/mysql/conf.d/my.cnf
    ports:
      - "3306:3306"
    restart: always
    tty: true
    environment:
      - MYSQL_ROOT_PASSWORD
      - TZ
  web:
    container_name:<APIサーバコンテナ名>
    build:
      context: api
    privileged: true
    ports:
      - "1323:1323"
    links:
      - db
    depends_on:
      - db
    volumes:
      - ./src:/go/src/github.com/<アカウント名>/<プロジェクト名>/api/src
    restart: always
    tty: true
volumes:
  <DBボリューム名>:

さいごに

Go + MySQL + Dockerの環境構築メモのような記事ですが、ひとまず自分の手元の環境に合わせてアカウント名やプロジェクト名、ポート番号などを書き換えていただければ動作すると思います。

今後は、dockerコンテナとして起動したGolangサーバと、MySQLサーバのコンテナ間通信などを解説する記事を書いていこうと思います。