使用Docker搭建MySQL主从

采得百花成蜜后,为谁辛苦为谁甜。这篇文章主要讲述使用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,登陆阿里云账号(支付宝账号可复用),获取加速器地址
    使用Docker搭建MySQL主从

    文章图片
这里官方给出详细步骤,执行即可
  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官网信息是同步的 NAMEDESCRIPTIONSTARSOFFICIALAUTOMATED mysqlMySQL is a widely used, open-source relation…12222[OK] mariadbMariaDB Server is a high performing open sou…4691[OK] mysql/mysql-serverOptimized MySQL Server Docker images. Create…907[OK] perconaPercona Server is a fork of the MySQL relati…571[OK] phpmyadminphpMyAdmin - A web interface for MySQL and M…465[OK] mysql/mysql-clusterExperimental MySQL Cluster Docker images. Cr…93 centos/mysql-57-centos7MySQL 5.7 SQL database server92 bitnami/mysqlBitnami MySQL Docker Image64[OK] ………… [root@mydocker ~]# docker pull mysql:5.7#拉取5.7版本的镜像 等待下载…… [root@mydocker ~]# docker images#下载到本地后查看镜像 REPOSITORYTAGIMAGE IDCREATEDSIZE mysql5.7c20987f18b132 months ago448MB

    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 之后出现下面报错
    使用Docker搭建MySQL主从

    文章图片

    可能是启动容器之后,重启了firewalld防火墙
    查了一些资料,主要是因为在启动docker容器的时候或者做docker配置的时候,对防火墙设置重新启动等配置,这样会清除docker的相关配置,导致在查询防火墙规则的时候显示不到docker的链;
    而docker容器的底层原理:
    在启动docker的时候会自动在iptables中注册一个链,通过防火墙的链也可以找到其注册的信息,主要注册这些链,是docker中的容器为了暴露端口而使用的。
    解决办法:重启docker,systemctl restart docker 可以解决这个问题
[root@mydocker ~]# docker ps#显示运行中的容器 ,加-a参数是显示所有容器 CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 9e7f1ae5386amysql:5.7"docker-entrypoint.s…"3 hours agoUp 3 hours33060/tcp, 0.0.0.0:8002-> 3306/tcp, :::8002-> 3306/tcpmysql-slave 0b6b528bb6fbmysql:5.7"docker-entrypoint.s…"3 hours agoUp 3 hours33060/tcp, 0.0.0.0:8001-> 3306/tcp, :::8001-> 3306/tcpmysql-master

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

文章图片

3、Master配置
[root@mydocker ~]# docker exec -it mysql-master bash#进入容器 root@9e7f1ae5386a:/# cd /etc/mysql/ root@9e7f1ae5386a:/etc/mysql# ls conf.dmy.cnfmy.cnf.fallbackmy.cnfrmysql.cnfmysql.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)

【使用Docker搭建MySQL主从】进入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.IPAddressmysql-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则主从配置成功


    推荐阅读