行业知识
Docker搭建MySQL主从复制
2026-11-16 05:15:31
来源:互联网转载
Docker部署MySQL主从复制
文章目录
- Docker部署MySQL主从复制
- 一、构建MySQL镜像
- 二、构建systemctl管理MySQL服务镜像
- 三、运行容器
- 四、登录容器
- 4.1、配置master
- 4.2、配置slave
- 五、授权从库
- 六、更改UUID
- 七、连接主数据库
- 八、验证
一、构建MySQL镜像
- 我自己是使用的Dockerfile构建的MySQL镜像,也可以使用公共MySQL镜像
# 创建mysql工作目录[root@docker-01 ~]# mkdir mysql[root@docker-01 ~]# cd mysql# 创建mysql文件Dockerfile[root@docker-01 mysql]# cat Dockerfile # 指定基础镜像FROM centos:7.6.1810# 安装MySQL依赖软件,创建MySQL用户RUN yum clean all && yum makecache && yum -y remove mariadb && yum -y install vim numactl wget net-tools lrzsz libaio gcc gcc-c++ net-tools && useradd -M -s /sbin/nologin mysql# 开始安装MySQLADD mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz ./RUN mv mysql-5.7.28-linux-glibc2.12-x86_64 /usr/local/mysql && mkdir /usr/local/mysql/data && chown -R mysql:mysql /usr/local/mysql/data/ && cd /usr/local/mysql/bin/ && ./mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize &> /var/log/mysql_password.log # 上传配置文件COPY my.cnf /etc/my.cnfRUN cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld && chmod +x /etc/rc.d/init.d/mysqld# 上传系统服务文件COPY mysql.service /lib/systemd/system/ENV PATH /usr/local/mysql/bin:$PATHEXPOSE 3306# 创建mysql配置文件[root@docker-01 mysql]# cat my.cnf [client]socket=/usr/local/mysql/data/mysql.sock[mysqld]socket=/usr/local/mysql/data/mysql.sock# 绑定监听地址0.0.0.0bind-address = 0.0.0.0# 禁止域名解析,减少mysql对外部连接客户端DNS解析的时间skip-name-resolve# 设置端口为3306port=3306# 设置mysql的安装目录basedir=/usr/local/mysql# 设置mysql数据库的数据的存放目录datadir=/usr/local/mysql/data# 允许最大连接数max_connections=2048# 服务端使用的字符集默认为utf8character-set-server=utf8# 创建新表时将使用默认存储引擎default-storage-engine=INNODB# sql语句不区分大小写lower_case_table_names=1# 设置一次消息传输的最大值max_allowed_packet=16M# 创建mysql服务控制文件[root@docker-01 mysql]# cat mysql.service [Unit]Description=mysqldAfter=network.target[Service]Type=forkingExecStart=/etc/rc.d/init.d/mysqld startExecReload=/etc/rc.d/init.d/mysqld restartExecStop=/etc/rc.d/init.d/mysqld stopPrivateTmp=true[Install]WantedBy=multi-user.target[root@docker-01 mysql]# lsDockerfile my.cnf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz mysql.service# 构建MySQl镜像[root@docker-01 mysql]# docker build -t mysql:5.7.28 .
二、构建systemctl管理MySQL服务镜像
- 构建systemctl的目的是为了更好的管理容器中的MySQL服务
[root@docker-01 ~]# mkdir systemctl[root@docker-01 ~]# cd systemctl/[root@docker-01 systemctl]# cat Dockerfile # 基于刚刚的mysql镜像构建system镜像,作用是更好管理容器中的mysql服务FROM mysql:5.7.28ENV container dockerRUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \systemd-tmpfiles-setup.service ] || rm -f $i; done); \rm -f /lib/systemd/system/multi-user.target.wants/*; \rm -f /etc/systemd/system/*.wants/*; \rm -f /lib/systemd/system/local-fs.target.wants/*; \rm -f /lib/systemd/system/sockets.target.wants/*udev*; \rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \rm -f /lib/systemd/system/basic.target.wants/*; \rm -f /lib/systemd/system/anaconda.target.wants/*;# 在容器创建一个挂载点,这个挂载点将会跟宿主机或者别的容器交互VOLUME ["/sys/fs/cgroup"]CMD ["/usr/sbin/init"]# 构建systemctl镜像master[root@docker-01 systemctl]# docker build -t system:master .# 构建systemctl镜像slave[root@docker-01 systemctl]# docker build -t system:slave .
三、运行容器
- 根据刚刚创建的两个镜像可以得知,mysql:5.7.28镜像有mysql服务,在此镜像基础上构建了mysql:system镜像,这个镜像当中有systemctl控制服务,可以更好的管理mysql服务
- 使用mysql:system镜像创建master、slave容器
[root@docker-01 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEsystem master 20e2772fd585 47 hours ago 6.72GBsystem slave 20e2772fd585 47 hours ago 6.72GBmysql 5.7.28 9d559d0e3cf8 47 hours ago 6.72GBcentos 7.6.1810 f1cb7c7d58b7 5 years ago 202MB# 创建master容器[root@docker-01 ~]# docker run -d --hostname master --name master -p 13306:3306 --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro system:master# 创建slave容器[root@docker-01 ~]# docker run -d --hostname slave --name slave -p 23306:3306 --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro system:slave
四、登录容器
4.1、配置master
# 登录master容器[root@docker-01 ~]# docker exec -it master bash# 查看临时mysql密码[root@master /]# tail -1 /var/log/mysql_password.log 2024-05-25T04:21:20.466885Z 1 [Note] A temporary password is generated for root@localhost: MD)M;qyC0r_0# 设置主服务器ID[root@master /]# cat >> /etc/my.cnf set password=password('wzh.2005');4.2、配置slave
# 登录slave容器[root@docker-01 ~]# docker exec -it slave bash# 查看临时mysql密码[root@slave /]# tail -1 /var/log/mysql_password.log 2024-05-25T04:21:20.466885Z 1 [Note] A temporary password is generated for root@localhost: MD)M;qyC0r_0# 设置从服务器ID[root@slave /]# cat >> /etc/my.cnf set password=password('wzh.2005');五、授权从库
# 给从服务器授权,允许使用myslave的身份复制master中的所有数据库的所有表数据,并指定密码为“wzh.2005”[root@master /]# mysql -u root -pwzh.2005mysql> grant replication slave on *.* to 'myslave'@'192.168.93.%' identified by 'wzh.2005';# 两个容器之间使用172.17.0.0网段通信mysql> grant replication slave on *.* to 'myslave'@'172.17.0.%' identified by 'wzh.2005';
六、更改UUID
- 我这种方式构建的容器玩玩就好,因为有很多地方都没有做一些修改,就比如以上的两个mysql容器和克隆的没什么两样
# 两个uuid保持不一样即可,修改过后别忘记重启mysql服务[root@master /]# cat /usr/local/mysql/data/auto.cnf[auto]server-uuid=3ca0adc5-1a4e-11ef-9c25-0242ac110004[root@slave /]# cat /usr/local/mysql/data/auto.cnf[auto]server-uuid=3ca0adc5-1a4e-11ef-9c25-0242ac110005
七、连接主数据库
[root@slave /]# mysql -u root -pwzh.2005mysql> change master to master_host='192.168.93.165',master_port=13306,master_user='myslave',master_password='wzh.2005',master_log_file='master-bin.000001',master_log_pos=990;mysql> start slave; Slave_IO_Running: Yes Slave_SQL_Running: Yes
八、验证
# 在主库创建kgc库[root@master /]# mysql -u root -pwzh.2005mysql> create database kgc;# 从库查看是否同步主库kgc数据库mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || kgc || mysql || performance_schema || sys |+--------------------+
- 我这种方式构建的容器玩玩就好,因为有很多地方都没有做一些修改,就比如以上的两个mysql容器和克隆的没什么两样
- 构建systemctl的目的是为了更好的管理容器中的MySQL服务
- 我自己是使用的Dockerfile构建的MySQL镜像,也可以使用公共MySQL镜像
上一篇:怎么创建多人服务器?