Docker(docker-compose)でMySQLの環境構築をする覚書
はじめに
最近Dockerの使い方を勉強している.MySQLの導入のために環境構築の仕方を試してみた.
特に参考にしたのが以下
"サンプルデータがあらかじめ入った MySQL を Docker で作成する (https://www.xlsoft.com/jp/blog/blog/2019/10/09/post-7617/)"
"[Docker] Mac に docker-compose で MySQL 環境を構築する (https://blog.hiros-dot.net/?p=10469)"
やったこと
基本的なことだが,mysqlのサーバをDockerで立ち上げて,作成したサンプルのデータベースにmysqlクライアントでアクセスするまでを行った.
やったことの手順
- (1) まずベースとなるMySQLのイメージを以下のようにpullした
docker pull mysql:8.0
(2) 最終的にイメージをビルドするのに必要なファイル(
docker-compose.yml
, etc.)を作成(3) イメージをビルド,コンテナを起動
(4) mysqlクライアントでアクセスし,データベースを操作して遊んでみる
フォルダ構成
環境構築は以下の構成で進める.
[~/Code/Project/proj_y2021/proj1229/project-docker/docker-mysql] % tree . . ├── docker-compose.yml └── mysql ├── Dockerfile ├── db │ ├── 01_init_db.sql │ └── 02_insert_data.sql └── my.cnf 2 directories, 5 files
コンテナ起動時に実行される".sql"ファイルについて
本実験では簡単なデータベースを作成してmysqlクライアントでアクセスするまでをやりたかった.
コンテナ内のdocker-entrypoint-initdb.d
に配置されて実行される.sqlファイルは参考サイトで取り上げられていた01_init_db.sqlと02_insert_data.sqlが良さげだったので,今回はこれらを使うことにした.
作成した各ファイルについて
docker-compose.yml
[~/Code/Project/proj_y2021/proj1229/project-docker/docker-mysql] % cat docker-compose.yml version: "3" services: mysqldb: container_name: hello-mysql-db build: ./mysql volumes: - ./mysql/db:/docker-entrypoint-initdb.d/ ports: - "3307:3306"
mysql/db
にはコンテナ起動時に実行したい.sqlファイル群が置かれているが,これらはdocker-entrypoint-initdb.d
にマウントされ,コンテナ起動時に実行されることとなる.
コンテナを起動後にローカルPCの3307ポートからアクセスする予定だったので,上記の"ports:"の設定にした.
Dockerfile
[~/Code/Project/proj_y2021/proj1229/project-docker/docker-mysql] % cat mysql/Dockerfile FROM mysql:8.0 ENV MYSQL_ROOT_PASSWORD=secretpw ADD ./my.cnf /etc/mysql/conf.d/my.cnf
my.cnf
[~/Code/Project/proj_y2021/proj1229/project-docker/docker-mysql] % cat mysql/my.cnf [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci [client] default-character-set=utf8mb4
Dockerイメージのビルドとコンテナの起動
以下のようにしてビルド
[~/Code/Project/proj_y2021/proj1229/project-docker/docker-mysql] % docker-compose build Building mysqldb [+] Building 0.1s (7/7) FINISHED => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 36B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/mysql:8.0 0.0s => [internal] load build context 0.0s => => transferring context: 27B 0.0s => [1/2] FROM docker.io/library/mysql:8.0 0.0s => CACHED [2/2] ADD ./my.cnf /etc/mysql/conf.d/my.cnf 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:c5da021b5c42d0ef0edf95c1a4c162675ede9c927420f3a6ced8694860fd72d4 0.0s => => naming to docker.io/library/docker-mysql_mysqldb 0.0s Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
コンテナの起動
[~/Code/Project/proj_y2021/proj1229/project-docker/docker-mysql] % docker-compose up -d Creating network "docker-mysql_default" with the default driver Creating hello-mysql-db ... done
MySQLサーバにクライアントでアクセスしてデータベースで遊んでみる
ローカルのポート(今回は3307)からアクセスする.
[~] % mysql -h 127.0.0.1 -P 3307 -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.27 MySQL Community Server - GPL Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
コンテナ起動時に作成されたデータベースへのアクセス
サンプルとして作成したデータベースからデータが読めるのを確認.
mysql> use jpaddress Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> SELECT * FROM city WHERE Zip LIKE '108007%'; +-------+---------+---------------+---------+--------------------------------------+------------+-----------+-------------------------------+ | ID | Zip | JP-Prefecture | JP-City | JP-Address | Prefecture | City | Address | +-------+---------+---------------+---------+--------------------------------------+------------+-----------+-------------------------------+ | 37960 | 1080075 | 東京都 | 港区 | 港南 (次のビルを除く) | Tokyo To | Minato Ku | Konan (次のビルを除く) | | 38064 | 1080072 | 東京都 | 港区 | 白金 | Tokyo To | Minato Ku | Shirokane | | 38065 | 1080071 | 東京都 | 港区 | 白金台 | Tokyo To | Minato Ku | Shirokanedai | | 38068 | 1080074 | 東京都 | 港区 | 高輪 | Tokyo To | Minato Ku | Takanawa | | 38389 | 1080073 | 東京都 | 港区 | 三田 (次のビルを除く) | Tokyo To | Minato Ku | Mita (次のビルを除く) | +-------+---------+---------------+---------+--------------------------------------+------------+-----------+-------------------------------+ 5 rows in set (0.09 sec) mysql>
試しにデータベースを作ってみる
データベースsample_db
を作成.
mysql> CREATE DATABASE sample_db; Query OK, 1 row affected (0.01 sec)
新規作成したデータベースを使用(use)する.
mysql> use sample_db Database changed
テーブルの作成とデータの追加
mysql> CREATE TABLE test_tbl ( -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> name TEXT NOT NULL); Query OK, 0 rows affected (0.02 sec) mysql> INSERT INTO test_tbl (name) VALUES ("HIRO"),("Steve"),("michel"); Query OK, 3 rows affected (0.02 sec) Records: 3 Duplicates: 0 Warnings: 0
作成したテーブルからデータを読めるのを確認した.
mysql> select * from test_tbl; +----+--------+ | id | name | +----+--------+ | 1 | HIRO | | 2 | Steve | | 3 | michel | +----+--------+ 3 rows in set (0.01 sec) mysql>
(最後に) 後片付け
今回は環境構築の仕方を試しに色々実験しただけだったので,終わった後は後片付けとして作成されたコンテナやボリュームを削除して終わりとする.
以下を実行し,docker-composeで起動したコンテナは終了され,ボリュームも削除されたことを確認した.
docker-compose down --rmi all --volumes
今回はここまでにする.SQLもうちょっと勉強したほうがいいかも.