使用Docker搭建MySQL主从

Posted gwj_Cloud

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Docker搭建MySQL主从相关的知识,希望对你有一定的参考价值。

一、安装Docker

系统要求
Docker 支持 64 位版本 CentOS 7/8,并且要求内核版本不低于 3.10。 CentOS 7 满足最低内核的要求。
查看系统内核版本

[root@centos7 ~]# uname  -r
3.10.0-1062.el7.x86_64

安装步骤,可以参考docker官方文档(https://docs.docker.com/engine/install/centos/)

  1. 如果之前安装过旧版本,先卸载之前的版本
    >$ sudo yum remove docker \\\\
                   docker-client \\\\
                   docker-client-latest \\\\
                   docker-common \\\\
                   docker-latest \\\\
                   docker-latest-logrotate \\\\
                   docker-logrotate \\\\
                   docker-engine
  2. 安装docker依赖库
    sudo yum install -y yum-utils
    sudo yum-config-manager \\\\
     --add-repo \\\\
     https://download.docker.com/linux/centos/docker-ce.repo
  3. 安装docker引擎
    sudo yum install docker-ce docker-ce-cli containerd.io
  4. 启动docker
    systemctl start docker
    systemctl enable docker      #设置开机自启
  5. 配置国内加速
    我们在访问dcoker仓库的时候默认是从docker hub国外网站拉取,访问比较慢,配置阿里,网易的加速地址可以大大缩减访问时间。
    https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陆阿里云账号(支付宝账号可复用),获取加速器地址

这里官方给出详细步骤,执行即可

  1. 测试docker是否安装成功

    注:hello-world是docker-hub里的一个用来做测试的镜像,占用资源非常小
    docker相关命令介绍可访问https://blog.51cto.com/gwj1319/4562675

    二、搭建mysql主从

    1、拉取MySQL镜像,这里使用5.7版本

    [root@mydocker ~]# docker search mysql   #查询镜像,和docker hub官网信息是同步的
    NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    mysql                            MySQL is a widely used, open-source relation…   12222     [OK]       
    mariadb                          MariaDB Server is a high performing open sou…   4691      [OK]       
    mysql/mysql-server               Optimized MySQL Server Docker images. Create…   907                  [OK]
    percona                          Percona Server is a fork of the MySQL relati…   571       [OK]       
    phpmyadmin                       phpMyAdmin - A web interface for MySQL and M…   465       [OK]       
    mysql/mysql-cluster              Experimental MySQL Cluster Docker images. Cr…   93                   
    centos/mysql-57-centos7          MySQL 5.7 SQL database server                   92                   
    bitnami/mysql                    Bitnami MySQL Docker Image                      64                   [OK]
    …………
    [root@mydocker ~]# docker pull mysql:5.7  #拉取5.7版本的镜像
    等待下载……
    [root@mydocker ~]# docker images     #下载到本地后查看镜像
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    mysql        5.7       c20987f18b13   2 months ago   448MB

    2、使用下载好的镜像运行容器

    [root@mydocker ~]# docker run -d --name mysql-master -p 8001:3306 -e MYSQL_ROOT_PASSWORD=Daemon@123 mysql:5.7
    [root@mydocker ~]# docker run -d --name mysql-slave -p 8002:3306 -e MYSQL_ROOT_PASSWORD=Daemon@123 mysql:5.7
               #-d 后台运行,即启动守护式容器;
               #-p 指定端口映射,主机端口:容器端口
               #-e 指定容器环境变量,这里设置密码      

    如果docker run 之后出现下面报错

    可能是启动容器之后,重启了firewalld防火墙
    查了一些资料,主要是因为在启动docker容器的时候或者做docker配置的时候,对防火墙设置重新启动等配置,这样会清除docker的相关配置,导致在查询防火墙规则的时候显示不到docker的链;
    而docker容器的底层原理:
    在启动docker的时候会自动在iptables中注册一个链,通过防火墙的链也可以找到其注册的信息,主要注册这些链,是docker中的容器为了暴露端口而使用的。
    解决办法:重启docker,systemctl restart docker 可以解决这个问题

[root@mydocker ~]# docker ps   #显示运行中的容器 ,加-a参数是显示所有容器
CONTAINER ID   IMAGE       COMMAND                  CREATED       STATUS       PORTS                                                  NAMES
9e7f1ae5386a   mysql:5.7   "docker-entrypoint.s…"   3 hours ago   Up 3 hours   33060/tcp, 0.0.0.0:8002->3306/tcp, :::8002->3306/tcp   mysql-slave
0b6b528bb6fb   mysql:5.7   "docker-entrypoint.s…"   3 hours ago   Up 3 hours   33060/tcp, 0.0.0.0:8001->3306/tcp, :::8001->3306/tcp   mysql-master

Master对外映射的端口号是3301,Slave对外映射的端口号是3302,大家可以自己随意设置。因为docker容器是相互隔离的,每个容器有其独立的IP地址,所以不同容器使用相同的端口并不会冲突。
容器启动后使用Navicat进行测试

3、Master配置

[root@mydocker ~]# docker exec -it mysql-master bash  #进入容器
root@9e7f1ae5386a:/# cd /etc/mysql/
root@9e7f1ae5386a:/etc/mysql# ls
conf.d  my.cnf  my.cnf.fallback  my.cnfr  mysql.cnf  mysql.conf.d    #找到mysql配置文件my.cnf
echo -e "[mysqld]\\nserver-id=1\\nlog-bin=mysql-bin"  >>my.cnf
root@9e7f1ae5386a:/etc/mysql# service mysql restart    #重启使配置文件生效
[info] Stopping MySQL Community Server 5.7.36.
....
[info] MySQL Community Server 5.7.36 is stopped.
[info] Re-starting MySQL Community Server 5.7.36.
[root@mydocker ~]# docker start mysql-master   #重启之后会退出容器,需要重新启动 
mysql-slave

4、slave配置

跟master配置大致一样,只需要修改server-id即可

5、创建数据同步用户并授权,用于在主从库之间同步数据

进入master容器,登录mysql

[root@mydocker ~]# docker exec -it mysql-master bash
root@0b6b528bb6fb:/# mysql -uroot -pDaemon@123
mysql> create user tom@% identified by tom123;   #创建用户
mysql> grant replication slave on *.* to tom@%;    #授权
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;   #刷新权限
Query OK, 0 rows affected (0.01 sec)
mysql> show master status;   #查看Master状态,记录file和pos值,在从库上要用
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      501 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

进入salve容器,登录mysql,添加主库信息

mysql> change master to master_host=172.17.0.2,master_user=tom,master_password=tom123,master_port=3306,master_log_file=mysql-bin.000002,master_log_pos=501

master_host指主库容器内ip,可以通过docker inspect mysql-master |grep "IPAddress"查看,如下所示

[root@mydocker ~]# docker inspect mysql-master |grep "IPAddress"   #在主库上执行
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",      
                    "IPAddress": "172.17.0.2",
 或者
[root@mydocker ~]# docker inspect --format=.NetworkSettings.IPAddress  mysql-master
172.17.0.2
mysql> show slave status\\G  #在从库上执行
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.17.0.2
                  Master_User: tom
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 501
               Relay_Log_File: 9e7f1ae5386a-relay-bin.000007
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
如果IO线程和SQL线程都为Yes则主从配置成功

以上是关于使用Docker搭建MySQL主从的主要内容,如果未能解决你的问题,请参考以下文章

docker如何搭建mysql主从?

基于Docker的MySQL主从复制搭建及原理

基于Docker搭建MySQL主从复制

基于Docker搭建MySQL主从复制

基于Docker搭建MySQL主从复制

基于Docker的Mysql主从复制搭建