技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

Docker-Compose【Docker】

Docker-Composeは、複数のコンテナを管理する仕組みです。

いくつかのファイルにコンテナにまつわる設定を記述することで、コンテナのコマンド実行時にその内容を基にして処理されます。この仕組みがないと、各コンテナの設定をコマンド実行の都度指定する必要があります。コンテナの数が増えたり、何度もコマンドを実行するほどその作業は面倒に感じられるでしょう。

アプリケーション用のコンテナとSQLデータベース用のコンテナに対する環境構築は、よくあるケースかと思います。

設定ファイル

docker-compose.yml
複数コンテナのcomposeに関する設定を記述します。

version: "3"

volumes:
  vendor:

services:
  api:
    build: ./api
    volumes:
      - ./api/src:/<ソースコードのディレクトリ>
    ports:
      - "3001:3001"
    environment:
      - ENV=develop
      - CLOUDSQL_CONNECTION_NAME=...
      - CLOUDSQL_USER=...
      - CLOUDSQL_PASSWORD=...
      - CLOUDSQL_DATABASE=..
  db:
    build: ./mysql
    volumes:
      - ./mysql/initdb.d:/docker-entrypoint-initdb.d
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql
    ports:
      - "3306:3306"
    environment:
      TZ: "Asia/Tokyo"
      MYSQL_ROOT_PASSWORD: ...
      # MYSQL_ALLOW_EMPTY_PASSWORD: "true"
      # MYSQL_USER: ...
      # MYSQL_PASSWORD: ...
      MYSQL_DATABASE: ...

services以下にapi(アプリケーションとして)とdbのコンテナを用意し、下記の設定を記述しています。

build:Dockerfileの場所を記述
volumes:「ホスト:コンテナ」でマウント(コンテナとホストを同期)する内容を記述
ports:「ホスト:コンテナ」でコンテナの公開ポートを記述
environment:コンテナにおける環境変数を記述

volumesに記述されたディレクトリは、ローカルとコンテナで同じ1つのファイル(ローカルのファイル)を参照していますので、 コンテナを起動した状態で、コンテナ内でファイルの編集(go mod のgo mod tidyなどのコマンドを実行するなど)を行うと、ローカルのファイルが編集されます。

ただし、docker-compose.yamlでread only属性を指定することで、コンテナ内での編集ができないよう指定することもできます。


他にも、imageやdepends_onなどの設定項目が存在します。

volumesに記述した内容はそれぞれ次の意味を持っています。

  db:
    build: ./mysql
    volumes:
      - ./mysql/initdb.d:/docker-entrypoint-initdb.d
→ compose upした時に実行されるsqlファイル群のマウントを指定
      - ./mysql/conf:/etc/mysql/conf.d
→ MySQLの文字コードやログの出力先など、各種設定を記述したファイルのマウントを指定
      - ./mysql/data:/var/lib/mysql
→ MySQLが保存するデータのマウント(データの永続化)を指定

他にも「- ./log/mysql:/var/log/mysql」でログをマウントするなどがあります。

フォルダ階層

compose-up実行後のフォルダ階層の一例を示します。(dataフォルダ、confフォルダ以外のフォルダ、ファイルは用意する必要があります。)

project
    api
        Dockerfile
        src
    mysql
        conf
        data
            (MySQLのデータをマウント)
        Dockerfile
        initdb.d
            01-create_db.sql
            02-create_table.sql
            03-insert_master.sql
        my.cnf


initdb.dではサンプルとしてdatabaseのcreate文を記述したsqlファイル、tableのcreate文を記述したsqlファイル、初期設定として必要なinsert文を記述したsqlファイルを格納することとしました。「01-」とというようにファイル名を指定することで、ファイルを実行する順番を指定することができます。

コマンド

コンテナ起動関連のコマンド

$ docker-compose build
// ビルド

$ docker-compose up
// 起動

$ docker-compose down
// コンテナ削除

起動後 「Ctrl + C」で停止することはできますが、downにより削除することで、前のコンテナが立ち上がってしまうことを回避することができ、確実性があります。


コンテナ内に入るためのコマンド

$ docker ps
// コンテナの一覧を取得

$ docker exec -it <コンテナID> /bin/bash
// コンテナ内に入る (bashを使う)


MySQL関連

$ mysql -u <ユーザー名> -p
→ ユーザーを指定してmysqlを実行

$show databases
→ データベースの一覧を表示

$ use <データベース名>
→ 利用するデータベースを指定


docker-compose.yml内の環境変数に指定したデータベースを選択し、SQLで中身を確認すると、initdb.d内のsqlファイルに指定した内容が反映されているかと思います。