首先明确docker中启动的容器不能访问宿主机的ip。
但是在从机执行下面命令的时候 master_host用到了主机的ip。
有两种解决方案:
1.使用容器自身的ip,可以通过 docker inspect 容器名 | grep IPAddress 查看容器ip。 但是容器自身的ip是随机分配的,会发生变化,
2.使用自定义网络(桥接模式)。将需要互联的容器放到同一个网络下,就能够通过容器名称进行访问。
bash
change master to master_host='readwrite_master_1',master_port=3306, master_user='root',master_password='123456',master_log_file='master-bin.000001',master_log_pos=3755;
本次搭建使用的是自定义网络模式。
Mysql 一主一从。
-
使用docker启动两个mysql容器,并将这两个容器放入同一个网络下
bashdocker run \ --name readwrite_master_0 \ -d \ -p 3301:3306 \ -v mysql_data_1:/var/lib/mysql \ -v mysql_conf_1:/etc/mysql/conf.d \ -e MYSQL_ROOT_PASSWORD=123456 \ --privileged=true \ mysql:8.0 docker run \ --name readwrite_slave_0 \ -d \ -p 3302:3306 \ -v mysql_data_2:/var/lib/mysql \ -v mysql_conf_2:/etc/mysql/conf.d \ -e MYSQL_ROOT_PASSWORD=123456 \ --privileged=true \ mysql:8.0 # 创建网络 docker network create readwrite-net # 默认创建的就是网桥模式 # 将容器放入同一个网络 docker network connect readwrite-net readwrite_master_0 docker network connect readwrite-net readwrite_slave_0
-
在这两个mysql下创建数据库 db_test,用于测试。
-
修改挂载出来的mysql 配置文件 mysql.conf。
3.1 主机mysql mysql.conf,添加如下配置:
bash[mysqld] server-id = 1 #服务器 id,随意,但要唯一 log_bin = master-bin #二进制文件存放路径 log-slave-updates=true read-only = 0 #[可选] 0(默认)表示读写(主机),1表示只读(从机) binlog_expire_logs_seconds = 2592000 #设置日志文件保留的时长,单位是秒 max_binlog_size = 100M #控制单个二进制日志大小。此参数的最大和默认值是1GB binlog_do_db = db_test #待同步的数据库日志 binlog_ignore_db = mysql,sys #不同步的数据库日志
3.2 从机mysql mysql.conf ,添加如下配置:
bash[mysqld] server-id = 2 read-only = 1 relay-log = relay-log-bin relay-log-index = slave-relay-bin.index
-
主机用户密码插件,然后重启主机mysql
bashALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; FLUSH PRIVILEGES;
-
主机查看master状态,记录 File(如:master-bin.000004),Position(如:9082) 字段值(后面会用)
bashshow master status;
-
从机mysql执行下面命令,填写自己主机mysql的容器名,用户名,密码,File,Position。
bashstop slave; change master to master_host='readwrite_master_0',master_port=3306, master_user='root',master_password='123456',master_log_file='master-bin.000004',master_log_pos=9082; start slave;
-
查看从机状态
bashshow slave status;
如果 Slave_IO_Running和Slave_SQL_Running字段都为Yes,则搭建成功。