先下载docker 镜像
docker pull mysql
下载mysql最新镜像
docker run -it --rm mysql /bin/bash
运行mysql镜像
docker cp 运行起来的容器名: /etc/mysql/my.cnf ./
将运行起来的mysql容器中的my.cnf 文件复制到当前目录下
docker stop 容器id
暂停容器运行,因为在运行镜像的时候写了 --rm 使用暂停容器时 会自动销毁容器,回收内存空间
创建两个目录,master slave 分别是主机和从机的数据存储挂载目录
将my.cnf 复制到 master 和 slave 目录下,
在 master 和 slave 中创建data 目录, 用于挂载docker mysql容器中数据,防止docker 容器销毁,数据丢失
在master my.cnf 配置添加
server-id=111 #主从id号,不能重复
innodb_flush_log_at_trx_commit=2
sync_binlog=1
在slave my.cnf 配置中添加
server-id=222 #主从id号,不能重复
innodb_flush_log_at_trx_commit=2
sync_binlog=1
relay_log_recovery=0
开启docker 容器:
-v 文件共享,这里要使用绝对路径
docker run -it --rm -v /home/Data/master/my.cnf:/etc/mysql/my.cnf -v /home/Data/master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=python -p 3301:3306 mysql
docker run -it --rm -v /home/Data/slave/my.cnf:/etc/mysql/my.cnf -v /home/Data/slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=python -p 3302:3306 mysql
运行创建两个容器,将容器储存的数据挂载到 宿主机上,将宿主机上的 my.cnf替换掉
然后到navicat 上创建连接,如果连接成功,则代表容器没问题
连接 master 和 slave 数据库
然后在master 数据库中创建 从机账号
create user 'slave'@'%' identified with mysql_native_password by 'python';
用户名slave 密码 python
刷新权限
FLUSH PRIVILEGES;
show master status;
查看binlog 和 Positio 在slave 从库连接的时候会使用到
使用docker network ls
获取docker 网络id
docker inspect 网络id
查看 master mysql 主数据库的ip 地址
在slave 数据库中连接 master 主数据库
change master to master_host='172.17.0.2', master_port=3306, master_user='slave', master_password='python',master_log_file='binlog.000002', master_log_pos=1240;
这个master_host 是上面查看到的mysql的ip地址, master_port 是mysql的地址, master_user, master_password 是主服务器创建从机账号是的用户名和密码
master_log_file 和 master_lig_pos 是 show master status; 命令展示的 binlig 和 position
binlog 是主库中的日志文件, 里面储存了mysql操作,如增删改查,
Position 是日志中的事务id, 还有个 endPosition id对应着事务的结束为止, 相当于 binlog 中的所以 操作命令都储存在一个字符串中,
position 和 endposition 是每个事务之间的下标, 可以通过 position 和 endpositon 来截取 sql语句
然后 在slave 从库中运行 start salve; 启动主从复制