小工具知识网

当前位置: 首页 > 行业知识 > Docker搭建MySQL主从复制

行业知识

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                |+--------------------+

上一篇:怎么创建多人服务器?

下一篇:探索iOS软件源代码,揭开神秘面纱,洞悉源代码世界!