Docker搭建mysql主从 - Go语言中文社区

Docker搭建mysql主从


Dockerfile制作mysql主从镜像

如果使用我本人制作好的mysql主从镜像,则请忽略这个步骤,直接调到下一步"搭建mysql主从"。若想自己制作mysql主从镜像,则

mysql-master镜像制作

Dockerfile文件内容如下:

FROM mysql:5.7

COPY my.cnf /etc/mysql/

EXPOSE 3306

CMD ["mysqld"]

my.cnf文件内容如下:

[mysqld]
##################基础设置##################
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql
#log-error	= /var/log/mysql/error.log
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
default-time-zone='+08:00'

#Mysql服务的唯一编号 每个mysql服务Id需唯一
server-id=1

#数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server = utf8mb4

#数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = utf8mb4_general_ci

#设置client连接mysql时的字符集,防止乱码
init_connect=‘SET NAMES utf8mb4‘

#是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1

##################主从复制设置##################
#开启mysql binlog功能
log-bin=/var/log/mysql/mysql-bin.index

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

将Dockerfile和my.cnf放在同一目录下,然后执行:

docker build -t mysql-master:5.7 .

mysql-slave镜像制作

Dockerfile文件内容如下:

FROM mysql:5.7

COPY my.cnf /etc/mysql/

EXPOSE 3306

CMD ["mysqld"]

my.cnf文件内容如下:

[mysqld]
##################基础设置##################
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql
#log-error	= /var/log/mysql/error.log
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
default-time-zone='+08:00'

#Mysql服务的唯一编号 每个mysql服务Id需唯一
server-id=2

#数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server = utf8mb4

#数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = utf8mb4_general_ci

#设置client连接mysql时的字符集,防止乱码
init_connect=‘SET NAMES utf8mb4‘

#是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1

##################主从复制设置##################
#开启mysql binlog功能
log-bin=/var/log/mysql/mysql-bin.index

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

将Dockerfile和my.cnf放在同一目录下,然后执行:

docker build -t mysql-master:5.7 .

查看制作好的两个镜像:
在这里插入图片描述
制作好的两个镜像可以上传到docker hub公共仓库,方便以后搭建mysql主从,直接从仓库下载这两个镜像。推送镜像到公共仓库请参考我写的另一篇文章:
Docker第五篇-Docker镜像推送公共仓库

搭建mysql主从

获取镜像

可以使用上面创建的两个镜像,这里我使用我自己仓库上面的镜像(因为我已经把上面制作好的镜像上传到我个人仓库)

docker pull dalomao/mysql-master:5.7
docker pull dalomao/mysql-slave:5.7

在这里插入图片描述

宿主机创建目录用来挂载

宿主机创建两个目录,用来分别挂载主从容器中的数据,这样子将主从的数据挂载到宿主机,可以防止容器被意外删除或宕机是,数据在宿主机仍有备份(日志无需挂载)

mkdir -p /home/mysql/master-data
mkdir -p /home/mysql/slave-data

启动主从mysql容器

#启动mysql-master
docker run 
--name mysql-master 
--privileged=true 
-v /home/mysql/master-data:/var/lib/mysql 
-p 3306:3306 
-e MYSQL_ROOT_PASSWORD=root 
-d dalomao/mysql-master:5.7

#启动mysql-slave
docker run 
--name mysql-slave 
--privileged=true 
-v /home/mysql/slave-data:/var/lib/mysql 
-p 3307:3306 --link mysql-master:master 
-e MYSQL_ROOT_PASSWORD=root 
-d dalomao/mysql-slave:5.7

在这里插入图片描述

  • privileged=true表示容器内的root用户拥有真正的root权限,这样可以在容器内看到宿主机的设备,并且执行mount,设置可以在容器内启动docker容器
  • -v /home/mysql/slave-data:/var/lib/mysql表示将容器内的数据目录/var/lib/mysql挂载到宿主机/home/mysql/slave-data目录下
  • -p 3307:3306表示宿主机端口3307映射容器内端口3306
  • -e MYSQL_ROOT_PASSWORD=root表示设置容器中的mysql的root用户的密码
  • 该镜像是我自己制作的镜像,已经包含内置的my.cnf配置。如果想重新覆盖内置的my.cnf配置,可以将该配置放在宿主机某个目录,然后使用以下命令进行覆盖:-v /home/mysql/etc/master:/etc/mysql/conf.d。其中/home/mysql/etc/master是宿主机目录,该目录下有.cnf结尾的配置文件,
    /etc/mysql/conf.d是固定写法
  • 很多镜像,包括mysql镜像,它们的启动命令及配置如何覆盖等等,在docker hub仓库中都有说明的,因此在碰到不清楚的,一定记得看官方资料!!!

登录master容器授权

docker exec -it mysql-master /bin/bash
mysql -uroot -proot
grant replication slave on *.* to 'test'@'%' identified by '123456';
flush privileges;

这里是直接授权*,如果指定IP授权的话,需要退出容器使用以下命令查看双方的IP:

docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-slave

紧接着继续在master容器查看主机状态:

show master status;

在这里插入图片描述
这里一定要记住File和Position的值,等会在配置从机的时候会用到

登录slave容器并启动

docker exec -it mysql-slave /bin/bash
mysql -uroot -proot
change master to master_host='master', master_user='test', master_password='123456', 
master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=589, master_connect_retry=30;

start slave;
// 查看从的状态
show slave statusG

在这里插入图片描述

  • master_log_file就是之前我们查看master主机的File
  • master_log_pos就是之前我们查看master主机的Position

验证

在Navicat主机新增一个数据库,从机刷新,马上回同步到从机,验证成功!
在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/supermao1013/article/details/83065682
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢