使用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/)
- 如果之前安装过旧版本,先卸载之前的版本
>$ sudo yum remove docker \\\\ docker-client \\\\ docker-client-latest \\\\ docker-common \\\\ docker-latest \\\\ docker-latest-logrotate \\\\ docker-logrotate \\\\ docker-engine
- 安装docker依赖库
sudo yum install -y yum-utils sudo yum-config-manager \\\\ --add-repo \\\\ https://download.docker.com/linux/centos/docker-ce.repo
- 安装docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io
- 启动docker
systemctl start docker systemctl enable docker #设置开机自启
- 配置国内加速
我们在访问dcoker仓库的时候默认是从docker hub国外网站拉取,访问比较慢,配置阿里,网易的加速地址可以大大缩减访问时间。
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陆阿里云账号(支付宝账号可复用),获取加速器地址
这里官方给出详细步骤,执行即可
-
测试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主从的主要内容,如果未能解决你的问题,请参考以下文章