Wildcardな雑記

なんか書く

Docker(docker-compose)でMySQLの環境構築をする覚書

はじめに

最近Dockerの使い方を勉強している.MySQLの導入のために環境構築の仕方を試してみた.

特に参考にしたのが以下

やったこと

基本的なことだが,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.sql02_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もうちょっと勉強したほうがいいかも.