開発環境のテストを自動化するため、ローカルで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ファイルを初めて書きましたが、今回試した設定以外にも色々できそうなので、より詳しく学んでいきたいと思います。
Sign up here with your email
1 コメント:
Write コメントI AM A BLOGGER
ReplyPale Moon Crack
ConversionConversion EmoticonEmoticon