docker 安装 MySQL 主从复制【傻瓜式】

本文介绍了如何在CentOS上使用Docker搭建MySQL主从复制的环境,包括CentOS的Docker安装,MySQL镜像的拉取,主从服务器的配置以及主从复制的验证。同时,文章提到了在安装和配置过程中可能出现的问题,如yum源的设置和防火墙的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0 鸣谢

(老规矩,楼顶布置沙发,大神留坐。感谢知识分享…)
1、本文主要参考《centos7安装Docker详细步骤(无坑版教程)》安装docker环境。
2、docker学习过程中主要参考《docker 常用命令大全》《Docker与VMware的区别》
3、docker安装MySQL过程参考《使用docker安装mysql》

1 基础环境说明

本方案采用下表基础环境构建:

环境软件下载地址安装方法
实验机环境Windows11
虚拟机环境Vmware 17 For Windows下载链接操作简单,本文不展开。可参考站内成熟方案。(点击跳转)
虚拟机操作系统CentOS-8.5.2111-x86_64-dvd1.iso阿里镜像站操作简单,本文不展开。可参考站内成熟方案。点击跳转
docker最新版本在线下载安装文中有展示。
MySQLMySQL 8.0docker拉取的镜像文中有具体展示。
相关软件securityCRT自行百度主要使命令操作更加方便。未使用过的同学,自行学习,教程很多。如有疑问,留言回答。

2 CentOS 上安装 docker

至此处,应已完成如下工作:

  • 拥有windows实验机环境。
  • 部署成功Vmware17。(Vmware16应该也可以,其他版本自行试用。)
  • 已完成安装CentOS 8.0。(CentOS7.0应该也可以。其他版本自行试用。)

2.1 linux内核版本

查看内核版本:

uname -r

docker官方建议,内核版本3.10以上。

2.2 更新yum包

这个命令不是必须执行的,一般最新的系统无需更新。

yum -y update

注意​ :
yum -y update:升级所有包同时也升级软件和系统内核;​
yum -y upgrade:只升级所有包,不升级软件和系统内核

2.3 卸载旧版本的docker

如已安装docker,则需要将旧版本卸载。新安装无需执行。

yum remove docker  docker-common docker-selinux docker-engine

2.4 安装软件包

2.4.1 安装yum-util、device-mapper-persistent-data、lvm2

yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖。

yum install -y yum-utils device-mapper-persistent-data lvm2

2.4.2 遇到的问题

报错: Error: Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist

分析原因1: 可能的情况便是网络连接问题。检查是否可以连接外部网络,可以使用 ping baidu.com 查看是否有丢包情况。如果丢包,则进一步检查网络连接是否正常。该步骤需要安装ping软件。
解决:
1、安装ping软件。参考《docker 笔记》

分析原因2: CentOS 已经停止维护的问题。2020 年 12 月 8 号,CentOS 官方宣布了停止维护 CentOS Linux 的计划,并推出了 CentOS Stream 项目,CentOS Linux 8 作为 RHEL 8 的复刻版本,生命周期缩短,于 2021 年 12 月 31 日停止更新并停止维护(EOL),更多的信息可以查看 CentOS 官方公告。如果需要更新 CentOS,需要将镜像从 mirror.centos.org 更改为 vault.centos.org。
解决:
1、进入到 yum 的 repos 目录
cd /etc/yum.repos.d/
2、修改 centos 文件内容
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
3、生成缓存更新(第一次更新,速度稍微有点慢,耐心等待两分钟左右)
yum makecache
4、运行 yum update 并重新安装 vim
yum update -y
yum -y install vim

2.5 设置yum源(镜像仓库)

两个yum源都可以,但一般选择第二个阿里云,速度快。

yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)
 
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)
 

2.6 更新yum软件包的索引

CentOS 7

yum makecache fast 

CentOS 8

yum makecache

注意:
因为CentOS 8没有fast这个命令 需要去掉,不然会出现以下提示!
yum makecache: error: argument timer: invalid choice: ‘fast’ (choose from ‘timer’)

2.7 选择docker版本并安装

1、列出版本

yum list docker-ce --showduplicates | sort -r

在这里插入图片描述

2、以下为各种安装方式。
选择版本安装:yum install docker-ce-版本号

yum -y install docker-ce-18.03.1.ce

安装docker和引擎

yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

安装稳定版(使用该命令即可)

sudo yum install -y docker-ce  

3、解释

名词说明
containerd.io docker-compose-plugin管理多个docker容器的工具,其中管理包括:下载镜像、创建容器和删除容器。
containerd.io守护进程 containerd。 它在 docker 包上独立工作,并且是 docker 包所必需的。
docker-ce-clidocker 引擎的命令行界面,社区版
docker-cedocker 引擎,社区版。 需要 docker-ce-cli。

2.8 启动和测试docker

操作命令说明
启动systemctl start docker
测试systemctl start docker
重启容器systemctl restart docker
service docker restart
关闭容器docker service docker stop
docker systemctl stop docker
设置开机自启动systemctl enable docker.service
查看版本docker version
docker -v

验证:运行hello容器服务

docker run hello-world

出现 hello from Docker!代表安装成功在这里插入图片描述

3 docker 安装MySQL

以下操作均在启动docker容器后进行。

3.1 拉取MySQL镜像(主从只做一次)

操作命令
拉取最新的mysql镜像docker pull mysql:latest
拉取版本号为XXX的mysql镜像docker pull mysql:XXX
检查拉取的镜像docker images
拉取图像说明在这里插入图片描述

3.2 主服务器搭建

3.2.1 创建MySQL数据卷目录

// 主服务器容器卷创建
mkdir -p /mydata/mysql-master/conf

3.2.2 创建容器并运行

// 命令1 不推荐使用 记录bug作用
docker run --privileged=true  -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log:/var/log/mysql -v/mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql -v /mydata/mysql-master/mysql-files:/var/lib/mysql-files  -e MYSQL_ROOT_PASSWORD=123456 --restart=unless-stopped -d  mysql

// 命令2 只是比命令3多挂了个数据卷 推荐使用
docker run -d -p 3307:3306 --privileged=true -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql/conf.d -v /mydata/mysql-master/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456  --name mysql-master mysql

// 命令3 推荐使用
docker run -d -p 3307:3306 --privileged=true -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=123456  --name mysql-master mysql

说明:

–privileged=true 容器内的 root 拥有真正的 root 权限
-v /mydata/mysql-master/conf:/etc/mysql 配置文件
-v /mydata/mysql-master/log:/var/log/mysql 日志目录
-v/mydata/mysql-master/data:/var/lib/mysql 数据存储目录
-e MYSQL_ROOT_PASSWORD=123456
这个可加可不加 --restart=unless-stopped 容器挂载后自动重启
MYSQL_ROOT_PASSWORD=123456 指定root密码

3.2.3 配置文件 my.cnf

cd /mydata/mysql-master/conf
touch my.cnf

文件内容如下(可原样不动复制):

[client]
default_character_set=utf8

[mysql]
default-character-set=utf8mb4

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101 
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=mall-mysql-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## 设置编码
collation_server = utf8_general_ci
character_set_server = utf8
##解决 mysql 2059 错误,没有此问题的不加
default_authentication_plugin=mysql_native_password

3.2.4 重启容器

docker restart mysql-master

3.2.5 检查是否启动成功

[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS                     PORTS                                                  NAMES
0d98b2124d54   mysql:8.0.25   "docker-entrypoint.s…"   23 hours ago   Exited (0) 3 minutes ago                                                          mysql-slave

3.2.6 容器内配置

1 进入容器
docker exec -it mysql-master /bin/bash
2 进入mysql
mysql -uroot -p123456 

3、若密码失效,则重置密码。
4、远程连接工具连接

use mysql;
update user set host='%' where user='root';
Grant all privileges on root.* to 'root'@'%';  //执行两次
alter user root identified with mysql_native_password by '123456';
FLUSH PRIVILEGES;
show variables like 'character%'; // 查看字符编码

5、创建从服务器连接用户

// 创建用户名为 slave,后面从库需要连接到这个用户上,by 后面的密码和数据库密码没有关系
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
 
// 授权表示可以从任意 ip 使用此用户名和密码连接到主数据库
GRANT REPLICATION SLAVE ON *.* to 'slave'@'%';
 
// 刷新配置
flush privileges;
 
// 查看日志文件 这个可以不执行
show master status;

3.3 从服务器搭建

3.3.1 创建MySQL数据卷目录

// 主服务器容器卷创建
mkdir -p /mydata/mysql-slave/conf

3.3.1 创建容器并运行

docker run -d -p 3308:3306 --privileged=true -v /mydata/mysql-slave/log:/var/log/mysql -v /mydata/mysql-slave/data:/var/lib/mysql -v /mydata/mysql-slave/conf:/etc/mysql/conf.d -v /mydata/mysql-slave/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456  --name mysql-slave mysql

3.3.2 配置文件 my.cnf

cd /mydata/mysql-slave/conf
touch my.cnf

文件内容如下(可原样不动复制):

[client]
default_character_set=utf8

[mysql]
default-character-set=utf8mb4

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin  
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## slave设置为只读(具有super权限的用户除外)
read_only=1
## 设置编码
collation_server = utf8_general_ci
character_set_server = utf8
##解决 mysql 2059 错误,没有此问题的不加
default_authentication_plugin=mysql_native_password

3.3.4 重启容器

docker restart mysql-slave

3.4 配置主从复制

3.4.1 主服务器操作:查看主从复制状态

进入主服务器查看主从复制状态

docker exec -it mysql-master /bin/bash
mysql -uroot -p123456 
show master status;

在这里插入图片描述

3.4.2 主服务器操作:查看IP地址

1、容器内查看。

docker exec -it mysql-master /bin/bash
cat /etc/hosts

2、容器外查看

docker ps -a
docker inspect 容器名

在这里插入图片描述

3.4.3 主服务器操作:查看端口

docker exec -it mysql-master /bin/bash
mysql -uroot -p123456 
show global variables like 'port';

在这里插入图片描述

3.4.4 从服务器操作:配置主从连接关系

docker exec -it mysql-slave /bin/bash
mysql -uroot -p123456 
change master to master_host='主机ip', master_user='slave', master_password='123456', master_port=3307, master_log_file='主机信息获取', master_log_pos= 820, master_connect_retry=30;

主机IP,为master主服务器的容器IP地址,图中标志③。
master_log_file,为master主服务器容器状态的值,图中标志①。
master_log_pos,为master主服务器容器状态的值,图中标志②。
master_port,为mater主服务器的容器内部数据库端口,图中标志④。

注意: 端口不用容器映射端口。如创建容器时,语句为docker run -d -p 3308:3306,则3308为映射地址,取3306。

3.5 开启主从复制

3.5.1 从服务器操作:查看从数据库状态

show slave status \G; 

未启动时,红框状态未NO。
在这里插入图片描述

3.5.2 从服务器操作:启动主从复制

docker exec -it mysql-slave /bin/bash
mysql -uroot -p123456 
// 开启主从同步
start slave;

其他相关命令

//停止主从同步
stop slave;

3.5.3从服务器操作:查看从数据库状态

show slave status \G; 

状态正常时,为yes。
在这里插入图片描述

3.6 主从复制验证

3.6.1 主数据库操作

docker exec -it mysql-slave /bin/bash
mysql -uroot -p123456 
create database testdb;

3.6.2 从数据库操作

docker exec -it mysql-slave /bin/bash
mysql -uroot -p123456 
show databases;

存在testdb数据库即主从复制正常。可以,建立表进行同步。

4 docker 迁移

5 一些问题的说明

5.1 关于操作环境

CentOS安装docker,docker安装mysql。其操作环境共有3层。操作时,应清楚位于哪层环境。

操作层级命令退出图示
操作系统层1、可操作docker建立、删除、重启;查询容器信息、进入容器等。
2、可以正常使用操作系统命令。
在这里插入图片描述
容器内部操作1、可以执行连接数据库等操作。
2、可以给容器安装插件,如ping软件。
从容器退出到操作系统,使用命令:exit在这里插入图片描述
数据库内部操作1、可以执行数据库增删改查。
2、可以建立连接用户并赋权。
命令:quit 或 exit在这里插入图片描述

5.2 关于防火墙

使用centos搭建主从复制,可能会存在操作系统的防火墙阻碍。故,对防火墙进行操作。

5.2.1 放开特定IP地址

stop slave; // 停止主从连接
firewall-cmd --reload // 重启防火墙
firewall-cmd --zone=public --add-port=3070/tcp --permanent  // 放行防火墙3070端口
firewall-cmd --zone=public --list-ports // 查看防火墙所有开放的端口

5.2.2 关闭防火墙

#检查防火墙状态
systemctl status firewalld.service
#启动防火墙状态
systemctl start firewalld.service
#停止防火墙状态
systemctl stop firewalld.service
#关闭防火墙开机自启动
systemctl disable firewalld.service 

启动状态图示。
在这里插入图片描述
关闭状态图示。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ealser

坚持免费。使命普及。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值