Docker + MySQLで開発環境用DBの作成



開発環境のテストを自動化するため、ローカルでDBの初期データを入れたり破棄したりできるDockerを使ってMySQLの環境を作成してみました。
シェルを使ったりする方法もありましたが、今回はdocker-composeを使う方法にしました。


*環境

  • MacOS
  • Docker :18.03.1
  • docker-compose:1.21.0
  • MySQL:8.0


*DockerのMySQLイメージを取得

Docker HubでMySQLイメージが公開されているので、Dockerを起動した状態で下記コマンドを実行してMySQLイメージを取得します。
今回は最新のバージョンを使ったのでlatestとしています。
$ docker pull mysql:latest

取得したイメージを確認します。
$ docker images

REPOSITORY  TAG IMAGE ID  CREATED SIZE
mysql latest  8d65ec712c69  9 days ago  445MB


*<補足>DockerコンテナからMySQLを起動

docker-composeを使うので最終的にこのコマンドは使いませんが、基本的な操作として書き残しておきます。
MySQLイメージを使ってコンテナを作成します。
dオプションを付けるとデーモンとして実行するデタッチドモードで起動することができます。(バックグラウンド実行)
$ docker run --name {コンテナ名} -e MYSQL_ROOT_PASSWORD={rootのパスワード} -d -p {ポート} {イメージ名:タグ}

今回は下記コマンドを実行して起動させました。
$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql

$ docker ps

CONTAINER ID  IMAGE COMMAND  CREATED STATUS  PORTS  NAMES
a939cd4979eb  mysql "docker-entrypoint.s…" 33 seconds ago  Up 32 seconds 0.0.0.0:3306->3306/tcp mysql

作成したコンテナに接続します。
itの後にコンテナID、またはイメージ名を指定します。
$ docker exec -it a939cd4979eb bash

root@a939cd4979eb:/# 

コンテナからMySQLに接続します。
パスワードはコンテナ作成時に設定したパスワードです。
root@a939cd4979eb:/# mysql -u root -p mysql

mysql>


*docker-composeに必要なファイルを作成

docker_mysqlというディレクトリを作成し、その配下は下記構成にしました。
docker_mysql
├── docker-compose.yml    #Dockerの起動設定
└── mysql
    ├── Dockerfile        #Dockerイメージやポートの設定
    ├── db
    │   └── init.sql      #DBの初期値データとして実行するSQL
    └── my.cnf            #MySQLの設定

*docker-compose.yml

Dockerの起動、Docker起動時の読込ファイル、環境変数の設定をします。
version: '3'
services:
  mysql:
    build: ./mysql/    #Dockerfileからビルドすることを示す
    volumes:
      - ./mysql/db:/docker-entrypoint-initdb.d  #初期データ
    environment:
      - MYSQL_ROOT_PASSWORD=root   #環境変数

volumesでは、指定したディレクトリ配下のSQLファイルをコンテナ内のdocker-entrypoint-initdb.dに配置することで、起動時に実行してくれます。シェル等も実行することができます。

*Dockerfile

Dockerイメージやポート、MySQL設定ファイルの読込を指定します。
#Dockerfile

#使うDockerイメージ
FROM mysql

#ポートを開ける
EXPOSE 3306

#MySQL設定ファイルをイメージ内にコピー
ADD ./my.cnf /etc/mysql/conf.d/my.cnf

#docker runに実行される
CMD ["mysqld"]

*my.cnf

MySQLの文字コードの設定をします。
[mysqld]
character-set-server=utf8

[mysql]
default-character-set=utf8

[client]
default-character-set=utf8

*init.sql

初期値として作成したいテーブルやDBデータをSQLコマンドで書きます。
CREATE DATABASE sample_db;
use sample_db;

CREATE TABLE users (
  id int(10) unsigned not null auto_increment,
  name varchar(255) not null,
  created_time datetime not null default current_timestamp,
  updated_time datetime not null default current_timestamp on update current_timestamp,
  primary key (id)
);


*docker-composeの起動

ymlファイルで指定したイメージをビルドします。
$ docker-compose build

Building mysql
Step 1/4 : FROM mysql
 ---> 8d65ec712c69
Step 2/4 : EXPOSE 3306
 ---> Using cache
 ---> 80dc8210d58a
Step 3/4 : ADD ./my.cnf /etc/mysql/conf.d/my.cnf
 ---> Using cache
 ---> 87d91a6440b4
Step 4/4 : CMD ["mysqld"]
 ---> Using cache
 ---> 70ae5e9a7103
Successfully built 70ae5e9a7103
Successfully tagged docker_mysql_mysql:latest

コンテナを作成して起動します。
-dオプションを付けるとバックグラウンド実行してくれます。
$ docker-compose up -d

Creating network "docker_mysql_default" with the default driver
Creating docker_mysql_mysql_1 ... done

作成したコンテナを確認して接続します。
$ docker ps
CONTAINER ID  IMAGE  COMMAND  CREATED STATUS  PORTS NAMES
ef213a95a802  docker_mysql_mysql "docker-entrypoint.s…" 39 seconds ago  Up 44 seconds 3306/tcp  docker_mysql_mysql_1

#コンテナに接続
$ docker exec -it ef213a95a802 bash

コンテナからMySQLに接続して、初期テーブルが作成されていることを確認します。
MySQL接続パスワードは、docker-compose.ymlで指定したrootパスワードです。
#コンテナ内のMySQLに接続
root@ef213a95a802:/# mysql -u root -p

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample_db          |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql> use sample_db;

mysql> show tables;
+---------------------+
| Tables_in_sample_db |
+---------------------+
| users               |
+---------------------+
1 row in set (0.00 sec)


開発環境のテスト後など、DBのデータを初期化したい場合は、コンテナを削除すると初期化されます。
$ docker-compose down


*所感

docker runコマンドのオプションで環境変数や読込ファイルを指定することもできますが、同じ設定を何回も使いたい場合は、docker-composeコマンドを叩くだけにしておいたほうが便利だと思いました。
今回はDBの初期化をしたかったためデータの永続化はしていませんが、永続化の設定も可能なようです。
Dockerfileやymlファイルを初めて書きましたが、今回試した設定以外にも色々できそうなので、より詳しく学んでいきたいと思います。

Previous
Next Post »

1 コメント:

Write コメント

人気の投稿