LoginSignup
4
5

More than 3 years have passed since last update.

docker-composeで Golang、 Mysqlの環境構築

Posted at

docker-composeでGo、Mysqlの環境構築をしました。

ディレクトリ構成

sample-docker-compose/
├── docker
│   ├── golang
│   │   └── Dockerfile
│   └── mysql
│       ├── Dockerfile
│       ├── init
│       │   └── create_db_table.sql
│       └── my.conf
├── docker-compose.yml
├── main.go
└── start_app.sh

Golangのdockerfile

FROM golang:1.8
RUN apt-get update -qq && \
    apt-get install -y mysql-client vim

WORKDIR /go/src/sample_docker_compose

ADD . .
RUN go build

mysqlのdockerfile

FROM mysql:5.7
docker-compose.yml
# docker-composeのバージョン
version: '3'
# services配下に各コンテナの情報を記載する
services:
  # ここからはmysqlのコンテナに関する情報
  # "mysql"はサービス名(任意につけてok)
  mysql:
    # コンテナに名前をつけることもできる
    container_name: mysql
    # Dockerfileのあるディレクトリのパスを指定する
    build:
      context: .
      dockerfile: ./docker/mysql/Dockerfile
    # mysqlのホスト名を決める
    hostname: mysql
    # 外部に公開するポートを指定する
    # これがないと外部からアクセスできない
    ports:
      - "3306:3306"
    # mysqlの設定
    environment:
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: password
    # docker-compose run実行時に実行される
    # オプションは日本語文の字化けに対するおまじない
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci --skip-character-set-client-handshake
    # パスをボリュームとしてマウント
    # :の左側がホストディレクトリ、:の右側がコンテナ上のディレクトリ
    volumes:
      - "db-data:/var/lib/mysql"
      # 初期設定を読み込む
      - "./docker/mysql/my.conf:/etc/mysql/my.conf"
      # MySQL起動時にDBを作成する
      - "./docker/mysql/init/:/docker-entrypoint-initdb.d"
  # ここからはGolangのアプリケーションに対する情報
  sample_docker_compose:
    # mysqlのコンテナとリンク付けする
    # mysqlコンテナを起動してからsample_docker_composeを起動してくれるようになる
    links:
      - mysql
    build:
      context: .
      dockerfile: ./docker/golang/Dockerfile
    container_name: sample_docker_compose
    ports:
      - "8080:8080"
    volumes:
      - .:/go/src/sample_docker_compose
    # docker-compose run実行時に実行される
    command: sh ./start_app.sh
# トップレベルでvolumesを定義すると、各サービスからボリュームを参照できる
volumes:
  db-data:
    driver: local      

main.go
package main

import(
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, from Docker container!")
}
my.conf
[client]
port            = 3306
default-character-set=utf8mb4

[mysqld_safe]
nice            = 0

[mysqld]
skip-host-cache
skip-name-resolve
user            = mysql
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
bind-address    = 192.168.0.88
innodb_data_home_dir            = ibdata
innodb_log_group_home_dir       = iblog
lc-messages-dir = /usr/share/mysql
character-set-server=utf8mb4
log-error      = /var/log/mysql/error.log
symbolic-links = 0
innodb_force_recovery = 3
!includedir /etc/mysql/conf.d/

[mysqldump]
default-character-set=utf8

create_db_table.sql
SET CHAESET UTF8;
DROP DATABASE IF EXIST sample_docker_compose;
CREATE DATABASE IF NOT EXISTS sample_docker_compose DEFAULT CHARACTER SET utf8;

start_app.sh
# !/bin/bash

# MySQLサーバーが起動するまでmain.goを実行せずにループで待機する
until mysqladmin ping -h mysql --silent; do
  echo 'waiting for mysqld to be connectable...'
  sleep 2
done

echo "app is starting...!"
exec go run main.go

疑問

dockerfileやdocker-compose.ymlでタブでネストするとエラーが出てしまうのですが、
ネストの際のスペースなどにも決まりがあるのでしょうか...?
もっと勉強いたします...!

参考資料

@yu-crocoさんQiita 今日から始めるDocker【docker-composeを使ってGo & Mysqlをよしなに起動しよう編】

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5