docker-composeを使ってmysql dockerコンテナを起動する

docker-composeを使ってmysql dockerコンテナを起動する
目次

前回の記事で docker build からの docker run コマンドを使用することでmysqlのdockerコンテナの起動ができました。

個人的にはcliのオプション指定が長くなっていくのがあまり好きではないので、今回はdocker-composeを使用して、もう少しお手軽に起動にこぎつけたいと思います。

docker-compose をインストールする

以下のサイトからdocker-toolboxをインストールしましょう。 その中にdocker-composeも含まれています。

そもそもdocker-composeは複数のコンテナ管理を容易に行う機能を提供してくれるものです。今回はmysqlコンテナでしか利用しませんが、システムコンポーネントの設定や起動順序の制御をyamlファイルに記載するだけで良いので、可読性が高く、VCSでも管理がしやすいです。

例えば、以下のようなDockerfileがあったとします。

 1FROM mysql:latest
 2
 3RUN { \
 4   echo '[mysqld]'; \
 5   echo 'character-set-server=utf8'; \
 6   echo 'collation-server=utf8_general_ci'; \
 7   echo '[client]'; \
 8   echo 'default-character-set=utf8'; \
 9} > /etc/mysql/conf.d/charset.cnf
10
11EXPOSE 3306
12CMD ["mysqld"]

それを呼び出すdocker-compose.ymlを作成します。

 1mysql:
 2  build: .
 3  dockerfile: Dockerfile
 4  ports:
 5    - "3306:3306"
 6  environment:
 7    - MYSQL_ROOT_USER=root
 8    - MYSQL_ROOT_PASSWORD=root
 9    - MYSQL_DATABASE=soudegesu
10    - MYSQL_USER=soudegesu
11    - MYSQL_PASSWORD=soudegesu
12  volumes:
13    - ./init.d:/docker-entrypoint-initdb.d

dockerfileの箇所に作成したDockerfileを指定しておくことで、起動時にimageをビルドし、そのイメージを使ってコンテナを起動します。

なお、mysqlの公式のコンテナの場合、コンテナ内のdocker-entrypoint-initdb.dをホスト上の任意のディレクトリを対象としてアタッチすることで、起動時にディレクトリ配下のsqlを流し込んで初期化してくれます。

docker-compose で起動する

それでは起動してみましょう。

 1docker-compose up
 2
 3Starting soudegesu_mysql_1
 4Attaching to soudegesu_mysql_1
 5mysql_1  | 2017-01-31T07:09:28.026908Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
 6mysql_1  | 2017-01-31T07:09:28.038354Z 0 [Note] mysqld (mysqld 5.7.17) starting as process 1 ...
 7mysql_1  | 2017-01-31T07:09:28.053912Z 0 [Note] InnoDB: PUNCH HOLE support available
 8mysql_1  | 2017-01-31T07:09:28.054031Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
 9mysql_1  | 2017-01-31T07:09:28.054043Z 0 [Note] InnoDB: Uses event mutexes
10mysql_1  | 2017-01-31T07:09:28.054055Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
11〜以下略〜

mysqlコマンドで接続してみます。

 1mysql -h 127.0.0.1 -P 3306 -u root -proot
 2mysql: [Warning] Using a password on the command line interface can be insecure.
 3Welcome to the MySQL monitor.  Commands end with ; or \g.
 4Your MySQL connection id is 3
 5Server version: 5.7.17 MySQL Community Server (GPL)
 6
 7Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
 8
 9Oracle is a registered trademark of Oracle Corporation and/or its
10affiliates. Other names may be trademarks of their respective
11owners.
12
13Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
14
15mysql>

できました。 起動時のsqlファイルの実行結果も確認しましょう。

 1mysql> show databases;
 2+--------------------+
 3| Database           |
 4+--------------------+
 5| information_schema |
 6| soudegesu              |
 7| mysql              |
 8| performance_schema |
 9| sys                |
10+--------------------+
 1mysql> use soudegesu;
 2Reading table information for completion of table and column names
 3You can turn off this feature to get a quicker startup with -A
 4
 5Database changed
 6mysql> show tables;
 7+-----------------+
 8| Tables_in_soudegesu |
 9+-----------------+
10| aaaa            |
11| bbbb            |
12+-----------------+
132 rows in set (0.00 sec)

ちなみに

既存のimageを使用して docker-compose up を実行することも可能です。場合に応じて設定を変更してください。

 1mysql:
 2  image: mysql:latest ←これ
 3  ports:
 4    - "3306:3306"
 5  environment:
 6    - MYSQL_ROOT_USER=root
 7    - MYSQL_ROOT_PASSWORD=root
 8    - MYSQL_DATABASE=soudegesu
 9    - MYSQL_USER=soudegesu
10    - MYSQL_PASSWORD=soudegesu
11  volumes:
12    - ./init.d:/docker-entrypoint-initdb.d