docker安装mysql主从
docker安装mysql
只有一台服务器资源,分别以不通端口启动多个mysql
3306、3307、3308
启动docker
systemctl start docker.service
拉取mysql镜像
docker pull mysql:5.7
创建相关目录
mkdir /usr/local/docker
cd /usr/local/docker
创建主库文件夹
mkdir mysql_master_3306
cd mysql_master_3306
mkdir conf data log sql
cd ..
创建从库文件夹(复制主库)
cp -r mysql_master_3306/ mysql_slave_3307/
cp -r mysql_master_3306/ mysql_slave_3308/
配置master主库
cd /usr/local/docker/mysql_master_3306/conf/
编辑配置文件vim my.cnf
[client]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
server-id=1 # 数据库唯一 ID,主从的标识号绝对不能重复。
log-bin=/var/log/mysql/binlog # 开启 bin-log,并指定文件目录和文件名前缀
binlog-do-db=masterSlaveDB # 需要同步的数据库。如果是多个同步库,就以此格式另写几行即可。如果不指明对某个具体库同步,就去掉此行,表示同步所有库(除了 ignore 忽略的库)。
binlog-ignore-db=mysql # 不同步mysql系统数据库。如果是多个不同步库,就以此格式另写几行;也可以在一行,中间逗号隔开。
sync_binlog = 1 # 确保 binlog 日志写入后与硬盘同步
binlog_checksum = none # 跳过现有的采用 checksum 的事件,mysql5.6.5 以后的版本中 binlog_checksum=crc32,而低版本都是 binlog_checksum=none
binlog_format = mixed # bin-log 日志文件格式,设置为 MIXED 可以防止主键重复。
[mysql]
default-character-set=utf8mb4
配置slave从库(从库3307和3308只有server-id不同)
cd /usr/local/docker/mysql_slave_3307/conf/
vim my.cnf
[client]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
server-id=2 # 数据库唯一 ID,主从的标识号绝对不能重复。
log-bin=/var/log/mysql/binlog # 开启 bin-log,并指定文件目录和文件名前缀
binlog-do-db=masterSlaveDB # 需要同步的数据库。如果是多个同步库,就以此格式另写几行即可。如果不指明对某个具体库同步,就去掉此行,表示同步所有库(除了 ignore 忽略的库)。
binlog-ignore-db=mysql # 不同步 mysql 系统数据库。如果是多个不同步库,就以此格式另写几行;也可以在一行,中间逗号隔开。
slave-skip-errors = all # 跳过所有的错误错误,继续执行复制操作
[mysql]
default-character-set=utf8mb4
复制3307配置文件到3308
cp /usr/local/docker/mysql_slave_3307/conf/my.cnf /usr/local/docker/mysql_slave_3308/conf/
sed -i '7 c\server-id=3' /usr/local/docker/mysql_slave_3308/conf/my.cnf
初始化sql文件
master库
vim /usr/local/docker/mysql_master_3306/sql/init.sql
-- 创建数据库
DROP database IF EXISTS `masterSlaveDB`;
CREATE DATABASE `masterSlaveDB` default character set utf8mb4 collate utf8mb4_unicode_ci;
-- 切换数据库
USE masterSlaveDB;
-- 创建表
DROP TABLE IF EXISTS `masterSlaveTable` ;
CREATE TABLE `masterSlaveTable` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`type` varchar(2) DEFAULT NULL COMMENT '生活用品类别:1. 家电类 2. 厨具',
`name` varchar(50) DEFAULT NULL COMMENT '生活用品名称',
`description` varchar(200) DEFAULT NULL COMMENT '生活用品描述',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='MySQL 主从同步测试表';
INSERT INTO masterSlaveTable ( type , name , description )
VALUES ('1','电饭煲','用来蒸饭'),('1','电热壶','用来烧水'),('1','空调','用来制冷或制热'),('2','菜刀','用来切菜'),('2','刨子','用来剥皮'),('2','打蛋器','用来搅拌鸡蛋');
slave从库
cp /usr/local/docker/mysql_master_3306/sql/init.sql /usr/local/docker/mysql_slave_3307/sql/
cp /usr/local/docker/mysql_master_3306/sql/init.sql /usr/local/docker/mysql_slave_3308/sql/
配置log目录权限
chmod -R 777 /usr/local/docker/mysql_master_3306/log/ /usr/local/docker/mysql_slave_3307/log/ /usr/local/docker/mysql_slave_3308/log/
运行MySQL容器
docker images
启动master库
docker run -p 3306:3306 --name mysql-master-3306 -v /usr/local/docker/mysql_master_3306/conf/my.cnf:/etc/mysql/conf.d/my.cnf -v /usr/local/docker/mysql_master_3306/data/:/var/lib/mysql/ -v /usr/local/docker/mysql_master_3306/sql/:/docker-entrypoint-initdb.d/ -v /usr/local/docker/mysql_master_3306/log/:/var/log/mysql/ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
-p:端口映射(宿主机端口:容器端口)
--name:启动后的容器名称
-v:第一个 -v 为映射配置文件(宿主机目录:容器目录)
-v:第二个 -v 为映射数据目录,相当于把容器中的数据备份到宿主机指定的目录(宿主机目录:容器目录)
-v:第三个 -v 为初始化 sql 目录(宿主机目录:容器目录)
-v:第四个 -v 为日志目录(宿主机目录:容器目录)
-e MYSQL_ROOT_PASSWORD=123456:设置 root 连接密码
映射实际上是把宿主机和容器相连通
容器中映射目录的文件发生改变时,宿主机中映射目录的文件也发生变化
-d:后台启动
mysql:5.7:启动的镜像
slave从库启动
docker run -p 3307:3306 --name mysql-slave-3307 -v /usr/local/docker/mysql_slave_3307/conf/my.cnf:/etc/mysql/conf.d/my.cnf -v /usr/local/docker/mysql_slave_3307/data/:/var/lib/mysql/ -v /usr/local/docker/mysql_slave_3307/sql/:/docker-entrypoint-initdb.d/ -v /usr/local/docker/mysql_slave_3307/log/:/var/log/mysql/ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker run -p 3308:3306 --name mysql-slave-3308 -v /usr/local/docker/mysql_slave_3308/conf/my.cnf:/etc/mysql/conf.d/my.cnf -v /usr/local/docker/mysql_slave_3308/data/:/var/lib/mysql/ -v /usr/local/docker/mysql_slave_3308/sql/:/docker-entrypoint-initdb.d/ -v /usr/local/docker/mysql_slave_3308/log/:/var/log/mysql/ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
进入master库容器
docker ps -a
docker exec -it CONTAINER ID bash
mysql -u root -p123456
授权远程同步用户
grant all privileges on *.* to root@'%' identified by '123456';
flush privileges;
show master status;
宿主机查看master库ip地址
docker inspect e5c27579d909 | grep IPAddress
进入slave库容器
docker ps -a
docker exec -it CONTAINER ID bash
mysql -u root -p123456
stop slave;
change master to master_host='172.17.0.2',master_user='root',master_password='123456',master_log_file='binlog.000003',master_log_pos=150;
master_host:主库服务器 ip 地址
master_user:主库 MySQL 用户名
master_password:主库 MySQL 密码
master_log_file:为上面查询的主库 File 值 -> binlog.000003
master_log_pos:为上面查询的主库 Position 值 -> 150
start slave;
show slave status\G; #Slave_IO_Running: Yes Slave_SQL_Running: Yes
docker命令
docker rm CONTAINER ID #删除容器
docker ps -a -> 查看容器运行情况
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App