docker常用镜像 mysql
网址: https://hub.docker.com/_/mysql
shell
docker run -it --rm mysql:TAG --verbose --help # 命令行参数, 比如设置字符集等
# 当作Mysql客户端使用
docker run -it --rm mysql:TAG mysql -hIP -uUser -p
测试版
bash
docker run --name some-mysql \
-e MYSQL_ROOT_PASSWORD=ChangeMe@123 `# mysql root用户密码` \
-d mysql:5.7
测试版本问题
https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-sets.html
bash
1. 字符集 SHOW VARIABLES LIKE 'character%';
2. 数据持久化 -- 数据卷
实战版本(单机版本)
bash
# Step 1
# 新建my.cnf, 通过数据卷同步给mysql容器实例
mkdir -pv /data/mysql/conf.d
tee /data/mysql/conf.d/my.cnf <<-EOF
[client]
default-character-set=utf8
[mysqld]
# init_connect='SET collation_connection = utf8_unicode_ci'
# init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
EOF
# Step 2
# 启动mysql实例, 查看字符编码
docker run -d --name some-mysql \
-p 3306:3306 `# 主机端口不要冲突` \
--restart=always \
--privileged=true \
-v /data/mysql/log:/var/log/mysql `# mysql log 目录` \
-v /data/mysql/data:/var/lib/mysql `# mysql 数据 目录` \
-v /data/mysql/conf.d:/etc/mysql/conf.d `# mysql 配置 目录` \
-e MYSQL_ROOT_PASSWORD=ChangeMe@123 `# mysql root用户密码` \
mysql:5.7
# 如果新建一个数据库并授权,可选使用如下方式
-e MYSQL_DATABASE=zabbix \
-e MYSQL_USER=zabbix \
-e MYSQL_PASSWORD=zabbix \
# Step 3
# 进入容器, 查看字符集
docker exec -it some-mysql bash
mysql -uroot -pChangeMe@123
SHOW VARIABLES LIKE 'character%';
# 建库,建表,测试中文utf8插入
实战版本(主从版本)
bash
## Master 3307
# Step 1 新建Master实例
docker run -d --name mysql-master01 \
-p 3307:3306 `# 主机端口不要冲突` \
--restart=always \
--privileged=true \
-v /data/mysql-master/log:/var/log/mysql `# mysql log 目录` \
-v /data/mysql-master/data:/var/lib/mysql `# mysql 数据 目录` \
-v /data/mysql-master/conf.d:/etc/mysql/conf.d `# mysql 配置 目录` \
-e MYSQL_ROOT_PASSWORD=ChangeMe@123 `# mysql root用户密码` \
mysql:5.7
# check
docker ps
# Step 2 Master实例的配置文件
tee /data/mysql-master/conf.d/my.cnf <<-EOF
[client]
default-character-set=utf8 # 字符集
[mysqld]
server_id=01 # 同一局域网内ID需要唯一
binlog-ignore-db=mysql # 指定不需要同步的数据库
log-bin=mall-mysql-bin # 开启二进制日志功能
binlog_cache_size=10M # 二进制日志使用内存大小(事务)
binlog_format=mixed # 设置使用的二进制日志格式 mixed statement row
expire_logs_days=14 # 二进制日志过期清理时间, 默认值0,表示不自动清理
# 跳过主从复制中遇到的错误或指定类型错误, 避免slave端复制中断
# 1062错误是指一些主键重复 1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
character-set-server=utf8 # 字符集
collation-server=utf8_unicode_ci # 字符集
EOF
# Step 3 修改完重启master实例
docker restart mysql-master01
docker ps
# Step 4 进入master容器
docker exec -it mysql-master01 bash
mysql -uroot -pChangeMe@123 -e "show master status";
# Step 5 master数据库创建同步用的用户
mysql -uroot -pChangeMe@123 -e "CREATE USER 'slave'@'%' IDENTIFIED BY 'abcd_123';";
mysql -uroot -pChangeMe@123 -e "GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';";
mysql -uroot -pChangeMe@123 -e "SELECT Host,User FROM mysql.user;"
## Slave 3308
# Step 6 新建Slave实例
docker run -d --name mysql-slave01 \
-p 3308:3306 `# 主机端口不要冲突` \
--restart=always \
--privileged=true \
-v /data/mysql-slave/log:/var/log/mysql `# mysql log 目录` \
-v /data/mysql-slave/data:/var/lib/mysql `# mysql 数据 目录` \
-v /data/mysql-slave/conf.d:/etc/mysql/conf.d `# mysql 配置 目录` \
-e MYSQL_ROOT_PASSWORD=ChangeMe@123 `# mysql root用户密码` \
mysql:5.7
# check
docker ps
# Step 7 slave实例的配置文件
tee /data/mysql-slave/conf.d/my.cnf <<-EOF
[client]
default-character-set=utf8 # 字符集
[mysqld]
server_id=101 # 同一局域网内ID需要唯一
binlog-ignore-db=mysql # 指定不需要同步的数据库
log-bin=mall-mysql-slave01-bin # 开启二进制日志功能, 以备slave作为其他数据库实例的master时候使用
binlog_cache_size=10M # 二进制日志使用内存大小(事务)
binlog_format=mixed # 设置使用的二进制日志格式 mixed statement row
expire_logs_days=14 # 二进制日志过期清理时间, 默认值0,表示不自动清理
# 跳过主从复制中遇到的错误或指定类型错误, 避免slave端复制中断
# 1062错误是指一些主键重复 1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
relay_log=mall-mysql-relay-bin # relay_log配置中继日志
log_slave_updates=1 # slave将复制事件日写进自己的二进制日志
read_only=1 # slave设置为只读,具有super权限的用户除外
character-set-server=utf8 # 字符集
collation-server=utf8_unicode_ci # 字符集
EOF
# Step 8 修改完重启slave实例
docker restart mysql-slave01
docker ps
# Step 9 进入slave容器
docker exec -it mysql-slave01 bash
# 执行同步语句
mysql -uroot -pChangeMe@123 -e "change master to master_host='10.10.10.101',master_port=3307,master_user='slave',master_password='abcd_123',master_log_file='mall-mysql-bin.000001' ,master_log_pos=154, master_connect_retry=30;"
# 执行前状态为No
mysql -uroot -pChangeMe@123 -e "show slave status \G;" | grep 'Slave_.*_Running'
# 执行
mysql -uroot -pChangeMe@123 -e "start slave;"
# 执行后状态为Yes
mysql -uroot -pChangeMe@123 -e "show slave status \G;" | grep 'Slave_.*_Running'
# Step 10 进入master容器查看同步状态
docker exec -it mysql-master01 bash
mysql -uroot -pChangeMe@123 -e "show master status \G;"
mysql -uroot -pChangeMe@123 -e "show databases;"
# Step 11 master数据库写入测试
# 建库-使用库-建表-插入数据
# 官方测试数据库github网址:https://github.com/datacharmer/test_db
wget https://github.com/datacharmer/test_db/releases/download/v1.0.7/test_db-1.0.7.tar.gz
docker cp test_db-1.0.7.tar.gz mysql-master01:/tmp/
docker exec -it mysql-master01 bash
mysql uroot -pChangeMe@123 < employees.sql
mysql uroot -pChangeMe@123 < employees_partitioned.sql
cd /tmp
tar -xf test_db-1.0.7.tar.gz
cd test_db
mysql -uroot -pChangeMe@123 < employees.sql
mysql -uroot -pChangeMe@123 < employees_partitioned.sql
mysql -uroot -pChangeMe@123 -e "show databases;"
# Step 12 slave数据库读取测试
# 从机查看库,查看表,查询表记录
docker exec -it mysql-slave01 bash
mysql -uroot -pChangeMe@123 -e "show databases;"