docker (一)- MySQL主从
服务器环境
- ubuntu 18
- CPU 1核
- 内存 2GiB
- 系统盘 40GiB
- 带宽 1Mbit/s
跟着这篇文章搭这个主从,不得立省一个小时查问题的时间么(开玩笑啦)
安装docker(很多种方法随便用哪种都可以啦)
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io
docker -v
能看到版本号就装好了的
启动docker并设置为开机自启动
systemctl start docker && systemctl enable docker
MySQL主从:一主两丛
使用Docker拉取MySQL镜像
这里我下载的是5.7版本的
docker pull mysql:5.7.13
如果你需要其他版本直接替换版本号就好,这里可以查到docker支持的所有的版本号。不写的话默认的版本号是最新的那版。
运行mysql主容器
docker run --name mysql-master -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.13
解释:
--name 后面跟的 master 是自己设置的容器名
-p 将容器的指定端口映射到主机的指定端口,这里是将容器的3306端口映射到主机的3308端口
-e 设置环境变量,这里是指定root账号的密码为root
-d 指将在后台运行容器,并返回容器ID
mysql:5.7.13 指定运行的是mysql:5.7.13这个镜像
检验是否启动成功
docker ps -a 显示所有的容器,包括未运行的
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7782adcbfb98 mysql:5.7.13 "docker-entrypoint..." 27 seconds ago Up 26 seconds 0.0.0.0:3308->3306/tcp mysql-master
注意,是UP状态,表示正在运行中。
使用Navicat连接测试,如果连不成功,超时啥的,可能是端口权限的问题,一般云服务器都有他自己的安全策略,都需要在后台在配置端口
tips: navicat 测试连接的时候,host写宿主机的外网ip,也就是你这台云服务器的公网ip
创建主容器的复制账号
使用Navicat或者进到刚建的容器里mysql-master执行SQL
GRANT REPLICATION SLAVE ON *.* TO 'backup'@'%' identified by 'backup';
show grants for 'backup'@'%';
修改MySQL配置环境
创建配置文件目录,这一步主要为了将容器中的配置文件复制到宿主机上,修改配置的话,就不需要再进到每个容器中做修改。 你当然也可以不做这个映射,直接去容器里改配置就好了,但是在我多次尝试之后想说算了吧,问题在下面合集一里
目录结构如下
mkdir /usr/local/mysql/docker
把mysql-master
容器中的/etc/mysql/my.cnf
复制到/usr/local/mysql/docker/my.cnf
docker cp mysql-master:/etc/mysql/my.cnf /usr/local/mysql/docker/my.cnf
在宿主机修改my.cnf,在 [mysqld] 节点最后加上后保存
log-bin=mysql-bin #使用binary logging,mysql-bin是log文件名的前缀
server-id=1 #唯一服务器ID,非0整数,不能和其他服务器的server-id重复
再将修改后的文件覆盖Docker容器中MySQL中的配置文件
docker cp /usr/local/mysql/docker/my.cnf mysql-master:/etc/mysql/my.cnf
重启mysql-master
docker restart mysql-master
重新测试连接试下,能连上就没问题,连不上就用文章最后面的命令去看日志
运行MySQL从容器
如果在同一台机器上直接运行就好,如果不同机器,就重新把docker装下,镜像拉下,再装就好了
docker run --name slave1 -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.13
docker run --name slave2 -p 3310:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.13
和配置主容器相似,拷贝配置文件到slave1目录修改后覆盖回Docker中[slave2同]
如果是同台机器,咱们本着能懒则懒的心态,我们可以直接编辑刚才的配置文件vi /usr/local/mysql/docker/my.cnf
,把server-id改一下就好了嘛
log-bin=mysql-bin
server-id=2
docker cp /usr/local/mysql/docker/my.cnf slave1:/etc/mysql/my.cnf
docker restart slave1
记得配置端口权限
配置主从复制
slave1容器里mysql执行下面的sql语句,也可以在Navicat里执行
CHANGE MASTER TO MASTER_HOST='你的外网ip', MASTER_PORT=3308, MASTER_USER='backup', MASTER_PASSWORD='backup';
START SLAVE;
MASTER_HOST 外网ip可以;直接用容器名加3306的端口号不行
MASTER_PORT 主数据库对外端口
MASTER_USER 刚才在主数据库里设置的用户名
MASTER_PASSWORD 主数据库密码
检查是否配置成功 show slave status;
成功的标志:Waiting for master to send event。
失败的标志:Connecting to master,失败就去看日志(下面有汇总的命令),多半是配的有问题,端口访问不通啦啥的
tips:
1、MASTER_HOST 用容器名 ,MASTER_PORT 3306,不行的
2、如果两个容器在同一个宿主机中,MASTER_HOST 用内网ip,MASTER_PORT 3306,可以的。但是这个ip后面要是重启变了怎么办,我觉得还是直接用外网ip和映射出去的端口更稳妥一点。
测试
成功之后,去主数据库建个库,等个几十秒的去瞅瞅从库有新加的这个库了没。有了这不就成功了
问题合集
一、mysql容器中装个vim,就是装不上【没解决】
apt-key del 5072E1F
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 5072E1F
apt-key list
在一番查找之后放弃了
二、映射到宿主机的端口重复了
映射到主机的端口是不能重复的,如果重了就会提示下面这样的错 failed: port is already allocated
把刚刚建的这个容器删掉,再改个端口重跑就好了
docker rm mysql-slave1
三、正在运行的容器不能直接删
需要先停掉容器后再删
docker stop master
docker rm master
四、在容器里想安装东西,下载的超慢
sed -i "s/deb.debian.org/mirrors.aliyun.com/g" /etc/apt/sources.list
apt update
apt install -y 啥啥啥
命令合集
一、查看所有容器docker ps
二、启动容器 docker start 容器名
三、暂停容器 docker stop 容器名
四、删除容器 docker rm 容器名
(此容器不能是正在运行的容器,stop掉后再删)
五、查看容器日志 docker logs 容器名 -f
参考文章
转载自:https://juejin.cn/post/7216358562498838583