Dockerコンテナとホストでconfigファイルを同期するための事前準備
ホスト側のcnfファイル(どこでもいい)
vim ~/tmp/mysql/my.cnf
中身
[mysqld]
# explicit_defaults_for_timestamp = true
sql_mode = 'STRICT_ALL_TABLES'
log-bin-trust-function-creators=1
character-set-server = utf8mb4
collation-server = utf8mb4_bin
slow_query_log=1
long_query_time = 1.2
max_connections = 10000
max_connect_errors = 10
default-time-zone='+09:00'
コンテナで読み込まれるcnfファイル
/etc/mysql/conf.d/*.conf
起動時のオプションに下記を追加
-v ~/tmp/mysql:/etc/mysql/conf.d
イメージのインストールと起動(同時に実行可能)
- encoding, collationは上記cnfファイルでも設定可能
- -p ホスト側ポート:コンテナ側ポート
- -v ホスト側ボリューム:Docker側Dir
Ver. 8.0
docker run -v ~/tmp/mysql:/etc/mysql/conf.d --name mysql-8.0 -p 3308:3306 -e MYSQL_USER=root -e MYSQL_ROOT_PASSWORD=password -d mysql:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
Ver. 5.7
docker run -v ~/tmp/mysql:/etc/mysql/conf.d --name mysql-5.7 -p 3307:3306 -e MYSQL_USER=root -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
DockerコンテナにSSH
docker exec -it mysql-8.0 /bin/bash
# mysql
mysql -uroot -p
ホスト側からmysqlアクセス
(もちろん事前にクライアントのmysqlはインストール必要)
mysql -uroot -p -h 0.0.0.0 -P3308
timezone確認
show variables like '%time_zone%';
照合順序確認
show variables like '%collation%';
文字コード確認
show variables like '%char%';
出来上がったコンテナをイメージ化
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa3c86d075e1 mysql:8.0 "docker-entrypoint.s…" 10 minutes ago Up About a minute 33060/tcp, 0.0.0.0:3308->3306/tcp mysql-8.0
上記のname
をとって
> docker commit mysql-8.0 mysql:8.0_configured
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 8.0_configured 8dd1b8c65b37 12 minutes ago 546MB
mysql 5.7 5d9483f9a7b2 11 days ago 455MB
mysql 8.0 0c27e8e5fcfa 11 days ago 546MB
とはいえ、volumeのマウントはしないといけない。
Dockerコマンド集
# 動いてるコンテナ確認
docker ps
# 止まってるコンテナも含める
docker ps -a
# イメージを確認
docker images
# コンテナをstart/stop
docker start/stop {container_id}
# イメージからコンテナを起動
-d デーモン起動
> docker run --name {コンテナ名} -p {host_port}:{container_port} -e {env_key}:{env_value} -d {イメージ名
# コンテナ削除
docker rm {container_id}
# イメージを削除
docker rmi {image_id}
自分用だけど、意外と使えるってばよ。