DokerでMySQLを使うことが多いので、設定方法などをメモします。
ソースコードはGitHub🐱でも公開しています。
🌱 環境
- macOS Monterey 12.4
- docker-compose 1.29.2
🗂 ディレクトリ構成
mysql
├── README.md
├── docker-compose.yml
└── sql
├── data
├── tmp
├── init
└── myconf
└── my.cnf
🐳 手順
① docker-compose.ymlファイルを用意
ルートディレクトリにdocker-compose-ymlを作成し以下をコピペします。
docker-compose.yml
version: "3.1"
services:
my-mysql:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
container_name: my-mysql
volumes:
# 永続化用のマウント先
- ./sql/data:/var/lib/mysql
# 初期データ
# - ./sql/init/:/docker-entrypoint-initdb.d
# my.cnf
- ./sql/myconf/my.cnf:/etc/mysql/conf.d/my.cnf
environment:
MYSQL_USER: user
MYSQL_PASSWORD: user
MYSQL_ROOT_PASSWORD: pass
ports:
- "3306:3306"
解説
-
version
: docker-composeのバージョンです。 -
my-mysql
: このサービスの名前です。適当でOKです。 -
command
: 認証方法を設定しています。 -
container_name
: コンテナ名です。 - volumes:
-
./sql/data
: コンテナを停止してもデータが消えないように/var/lib/mysql
のデータを./sql/dataで保存するように設定しています。 -
./sql/init/
: 初期データがあればここにおきます(今回はないのでコメントアウトです)。 -
./sql/myconf/my.cnf
: mysqlの設定ファイルの置き場所です。
-
- environment
-
MYSQL_USER
: 作成するユーザ名を設定します -
MYSQL_PASSWORD
: 作成するユーザのパスワードを設定します -
MYSQL_ROOT_PASSWORD
: ルートユーザのパスワードを設定します
-
② my.cnfを用意
myconfにmy.cnfを入れて以下をコピペします。
myconf/my.cnf
[mysqld]
default-time-zone='+9:00'
character-set-server=utf8mb4
[client]
default-character-set = utf8mb4
日本時間のタイムゾーンと、日本語を表示するための文字コードを設定しています。
③ Dockerコンテナ起動
docker compose up -d
少し待って、
Creating my-mysql ... done
と表示されたらOKです。
docker psで確認してみます。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
x0x00x0000x0 mysql:8.0 "docker-entrypoint.s…" 29 minutes ago Up 29 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp my-mysql
コンテナ内に入ってみます。
docker exec -it my-mysql bash
root@x0x00x0000x0:/#
入れていそうです。
ls
してみます。
bin docker-entrypoint-initdb.d home media proc sbin tmp
boot entrypoint.sh lib mnt root srv usr
dev etc lib64 opt run sys var
問題なさそうです。
抜ける時はexit
を叩けばOKです。
④ データベースの作成
データベースを作ります。
Dockerコンテナ内のMySQLに入ります。
docker exec -it my-mysql mysql -uroot -ppass
create databaseをします。
create database mydb
showで確認してみます。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb | <- ある
| mysql |
| performance_schema |
| sys |
+--------------------+
できてますね。
ついでにdocker-compose.ymlで設定したユーザも確認してみます。
mysql> select user,host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | % |
| user | % | <- いる
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
6 rows in set (0.00 sec)
ちゃんといますのでOKです。
⑤ SQL ファイルの取り込み
tmp配下に以下のファイルを作成します。
sample.sql
CREATE TABLE mydb.users (
id int,
name varchar(10)
);
SQL ファイルをコンテナにコピーし、
docker cp sql/tmp/sample.sql <CONTAINER ID(docker psで確認可能)>:/usr/local/etc
docker コンテナに入り、
docker exec -it <CONTAINER ID> bash
SQL を取り込みます。
mysql -uroot -ppass mydb < /usr/local/etc/sample.sql
確認するとテーブルが作成されているのがわかります。
mysql -uroot -ppass mydb
mysql> show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| users |
+----------------+
1 row in set (0.00 sec)
以上
📔 参考
参考にさせていただきました