Docker的相关操做 与 Docker下MySQL容器的安装
https://www.cnblogs.com/yumq/p/14253360.htmlhtml
本次实验我是在单机状态下进行mysql的主从复制,和多机的原理同样mysql
相关参数sql
--name 容器的名称命名 -p 暴露端口,端口的映射 上述是本机的3307端口映射到容器内的3306端口,访问本机3307就能访问容器内的数据库(3306端口) --privileged=true 赋予容器内以root用户来操做 -it 交互运行 --hostname docker1 容器内hostname,我是为了区分docker添加的,若是用不到能够去掉 -e MYSQL_ROOT_PASSWORD=123456 环境参数配置,配置mysql root角色的密码 -e MYSQL_DATABASE=ymq 建立一个ymq的数据库,用不到的能够删除掉 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass `-v 很是重要,至关于docker容器的宝贵文件(相关配置,相关数据,相关日志)存放到容器外(即云服务器中),这样作的目的是不把数据放在容器内,保障数据安全` -v /home/mysql/docker-data/3307/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/3307/data/:/var/lib/mysql -v /home/mysql/docker-data/3307/logs/:/var/log/mysql -d mysql:5.7 -d 后台运行容器,并返回容器ID; mysql:5.7 运行的镜像文件
直接运行下面代码就能启动mysqldocker
docker run --name mysqldocker1 -p 3306:3306 --privileged=true -it -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=ymq --hostname docker1 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/mysql1/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/mysql1/data/:/var/lib/mysql -v /home/mysql/docker-data/mysql1/logs/:/var/log/mysql -d mysql:5.7
docker run --name mysqldocker2 -p 3307:3306 --privileged=true -it -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=ymq --hostname docker2 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/mysql2/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/mysql2/data/:/var/lib/mysql -v /home/mysql/docker-data/mysql2/logs/:/var/log/mytsql -d mysql:5.7
docker run --name mysqldocker3 -p 3308:3306 --privileged=true -it -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=ymq --hostname docker3 -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/mysql3/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/mysql3/data/:/var/lib/mysql -v /home/mysql/docker-data/mysql3/logs/:/var/log/mytsql -d mysql:5.7
查看Docker内容器状态shell
docker ps
如今是启动成功了,可是没有配置主从相关配置,因此咱们下一步要配置MySQL。
由于运行的时候咱们将容器内的配置目录挂载到本机的/home/mysql/docker-data/
下
因此咱们将对应容器的配置文件复制到对应目录下的conf目录下
数据库
my.cnf 文件内容以下安全
# For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html [mysqld] # # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. # log_bin # # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M #datadir=/home/mysql/docker-data/3307/data #socket=/home/mysql/docker-data/3307/mysql.sock character_set_server=utf8 init_connect='SET NAMES utf8' # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 #log-error=/home/mysql/docker-data/3307/logs/mysqld.log #pid-file=/home/mysql/docker-data/3307/mysqld.pid lower_case_table_names=1 server-id=4122 log-bin=mysql-bin auto_increment_increment=2 auto_increment_offset=1 #rpl_semi_sync_master_enabled=1 #rpl_semi_sync_master_timeout=10000
配置说明
三个容器的my.conf 中不能相同server-id
如上图个人第一个mysql的server-id为4122,那个我第二个server-id我就设置为4123
log-bin=mysql-bin 是开启bin-log
auto_increment_offset 表示自增加字段从哪一个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto_increment_increment 表示自增加字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
为了不两台服务器同时作更新时自增加字段的值之间发生冲突,通常在主主同步配置时,
须要将两台服务器的auto_increment_increment增加量都配置为2,
而要把auto_increment_offset分别配置为1和2。
固然若是三台就须要auto_increment_increment增加量都配置为3
auto_increment_offset分别设置为1和2和3bash
#先查看全部容器 docker ps #而后一个个重启相应的容器 docker restart 容器id #由于我容器只有这三个mysql 因此我以这样方式重启所有容器 docker restart $(docker ps -aq)
我是以docker1下的mysql做为master主机服务器
进入docker1socket
docker exec -it 容器ID/容器名字 /bin/bash
看到
root@docker1
时表示在docker1容器内
若是操做完毕就exit退出容器
根据容器的配置 我设置的密码为123456
GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456'; FLUSH PRIVILEGES;
show master status;
这样master配置就成功了
分别进入docker2 和 docker3
docker exec -it 容器ID/容器名字 /bin/bash
注意当看到光标前显示 root@docker2 和 root@docker3 时才代表进入成功
若是须要退出用exit进行退出。
change master to master_host='172.24.7.187',master_port=3306,master_user='repluser',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
master_host='172.24.7.187' 主机我是用的云服务器内网地址 master_port=3306 是master主机的端口,master_user='repluser' master主机上的角色
master_log_file='mysql-bin.000001',master_log_pos=154; 必须与主机的二进制同样
start slave;
若是须要关闭就 stop slave;
show slave status\G;
若是都为YES 就代表配置成功,主从复制搭建完成!!
若是 Slave_IO_Running: NO 但 Slave_SQL_Running: Yes
多是在slave中设置master信息的sql中master_host地址填的127.0.0.1 或者 localhost。
由于这两个地址会先去访问容器内的本机,而不是容器外的mysql,因此须要换成云服务器的公网或内网ip
若是 Slave_IO_Running: Yes 但 Slave_SQL_Running: NO
多是主从同步的时候相关数据同步上的错误,在slave端 删除冲突的数据就行,具体的错误信息会在
show slave status\G
下面的信息中指出NO的缘由