Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

【Docker-Compose/Go/MySQL】Go、MySQL環境をdocker-composeで構築する

More than 1 year has passed since last update.

環境

  • Go 1.13
  • MySQL 5.7
  • docker-compose 3

docker-composeファイル

完成したdocker-composeファイルが下記になります。

version: '3'
services:
  backend:
    build:
      context: .
      dockerfile: "Dockerfile.dev"
    volumes:
      - ./:/go/src/github.com/test/go-src
    ports:
      - "8080:8080"
    depends_on:
      - db
    environment:
      - DATABASE_HOST=db
      - DATABASE_PASSWORD=hogehoge
      - DATABASE=dev
      - DATABASE_USERNAME=root
    tty: true
    stdin_open: true

  db:
    image: mysql:5.7
    restart: always
    volumes:
      - ./db/mysql/my.cnf:/etc/mysql/conf.d/my.cnf # mysqlの設定
    environment:
      MYSQL_ROOT_PASSWORD: hogehoge # 初期で設定されるパスワード
      MYSQL_DATABASE: dev # docker-compose構築時に作成されるデータベース
    ports:
      - "3400:3306" # ローカルのMySQLのportと被らないように設定する

細かいところを下記より見ていきたいと思います。

Docker環境でのMySQLの環境変数

docker環境でのMySQLでは環境変数を準備してくれています。
それを使用することで、簡単にMySQLの環境も構築することができます。
Supported tags and respective Dockerfile links

主に使用するのは、下記3つかなと思います。
MYSQL_ROOT_PASSWORD
パスワードを設定

MYSQL_DATABASE
docker起動時に作成するデータベース名を設定

MYSQL_ALLOW_EMPTY_PASSWORD
パスワードを空にする設定

docker-compose でMySQL環境簡単構築
docker-composeでmysql使うとき初回起動時に複数のDBを作る方法

Hostの指定

DATABASE_HOSTに関しては、どうやって指定しようか悩みましたが、
docker-composeを立ち上げる時に、全てのサービス間にリンクされる仕様になっているようです。
Go側の環境変数にMySQL側のservice名(上記だとdb)を指定すると接続できるようになりました。

version2ではcomposeファイルに書かれた全てのサービス間に自動的にリンクを張る仕様になったため、linksとわざわざ書く必要がなくなったそうです。depends_onで繋げたとしても、[サービス名]や[エイリアス名]で接続できます。

docker-compose depends_onとlinksの違い
Docker Compose - docker-compose.yml リファレンス

my.cnf

my.cnfに関しては、下記記事を参考にしました。
特にこの記事では触れません。

MacにMySQL5.7をインストール。開発用my.cnfも公開
MySQLパフォーマンスチューニング -my.cnfの見直し-
my.cnf についてまとめた
MySQL 5.7 インストールと設定メモ
MySQLのログに出力されるタイムスタンプがおかしい件

GoのDockerfile

ローカル開発環境用のDockerfileは下記のように作成しました。

FROM golang:1.13

WORKDIR /go/src/github.com/test/go-src
ADD . /go/src/github.com/test/go-src

ENV GO111MODULE=on

RUN go get github.com/pilu/fresh && \
    go get github.com/jinzhu/gorm/dialects/mysql && \
    go get -v github.com/rubenv/sql-migrate/...

EXPOSE 8080

CMD ["fresh"]

ホットリロード

docker-compose環境でも、ホットリロードできるようにfreshを使用しています。
その際には、volumesを設定する必要があります。
Golang + Nuxt.js + Kubernetes でWebサービスを作る - その①
Go v1.11 + Docker + fresh でホットリロード開発環境を作って愉快なGo言語生活

volumes:
  - ./:/go/src/github.com/test/go-src

Docker、ボリューム(Volume)について真面目に調べた

docker-compose基礎コマンド

下記などを参考にしました。
docker-compose コマンドまとめ
docker-compose コマンド概要

docker compose version3

version3のリファレンスは下記が参考になります。
Compose file version3のリファレンス

マイグレーション

方針として、docker-compose upコマンド後に、マイグレーションを実施していきます。
現状だとsql-migrateを使用しているので、これwとdockerコマンドを組み合わせていきます。
下記コマンドでマイグレーションを実施できます。
docker exec -it [コンテナID] sql-migrate up --env=container

環境の指定

docker用にGoからDBに接続するためのyamlを作成しました。
datasource: root:hogehoge@tcp(db:3306)/dev?parseTime=trueがキモになっており、ユーザー名:パスワード(Host:Port)/DB名の順になっています。

container:
    dialect: mysql
    datasource: root:hogehoge@tcp(db:3306)/dev?parseTime=true
    dir: db/migrations
    table: migrations

sql-migrate

Seed管理

マイグレーションが終了したので、Seedデータを投入していきます。
下記コマンドを実行すればSeedデータが投入されるはず。
docker exec -it [コンテナID] mysql -u root -p dev -e"$(cat db/seed/seed.sql)"

db/seed/seed.sqlは、sqlファイルがあるところを指定してください。

Docker MySQL公式イメージを使用してDBに初期データを流し込む
Dockerコンテナ内に入らずにMySQL公式コンテナの中にSQL等を実行するメモ

sanoyo
自衛隊からソフトウェアエンジニア
https://note.com/yokosano
engineerlife
技術力をベースに人生を謳歌する人たちのコミュニティです。
https://community.camp-fire.jp/projects/view/280040
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away