Docker搭建MySQL主从复制

Docker部署MySQL主从复制

一、构建MySQL镜像

  • 我自己是使用的Dockerfile构建的MySQL镜像,也可以使用公共MySQL镜像
# 创建mysql工作目录
[root@docker-01 ~]# mkdir mysql
[root@docker-01 ~]# cd mysql


# 创建mysql文件Dockerfile
[root@docker-01 mysql]# cat Dockerfile 
# 指定基础镜像
FROM centos:7.6.1810
# 安装MySQL依赖软件,创建MySQL用户
RUN yum clean all && yum makecache && yum -y remove mariadb && yum -y install vim numactl wget net-tools lrzsz libaio gcc gcc-c++ net-tools && useradd -M -s /sbin/nologin mysql
# 开始安装MySQL
ADD mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz ./
RUN mv mysql-5.7.28-linux-glibc2.12-x86_64 /usr/local/mysql && mkdir /usr/local/mysql/data && chown -R mysql:mysql /usr/local/mysql/data/ && cd /usr/local/mysql/bin/ && ./mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize &> /var/log/mysql_password.log 
# 上传配置文件
COPY my.cnf /etc/my.cnf
RUN cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld && chmod +x /etc/rc.d/init.d/mysqld
# 上传系统服务文件
COPY mysql.service /lib/systemd/system/
ENV PATH /usr/local/mysql/bin:$PATH
EXPOSE 3306


# 创建mysql配置文件
[root@docker-01 mysql]# cat my.cnf 
[client]
socket=/usr/local/mysql/data/mysql.sock
[mysqld]
socket=/usr/local/mysql/data/mysql.sock
# 绑定监听地址0.0.0.0
bind-address = 0.0.0.0
# 禁止域名解析,减少mysql对外部连接客户端DNS解析的时间
skip-name-resolve
# 设置端口为3306
port=3306
# 设置mysql的安装目录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/data
# 允许最大连接数
max_connections=2048
# 服务端使用的字符集默认为utf8
character-set-server=utf8
# 创建新表时将使用默认存储引擎
default-storage-engine=INNODB
# sql语句不区分大小写
lower_case_table_names=1
# 设置一次消息传输的最大值
max_allowed_packet=16M


# 创建mysql服务控制文件
[root@docker-01 mysql]# cat mysql.service 
[Unit]
Description=mysqld
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.d/init.d/mysqld start
ExecReload=/etc/rc.d/init.d/mysqld restart
ExecStop=/etc/rc.d/init.d/mysqld stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target


[root@docker-01 mysql]# ls
Dockerfile  my.cnf  mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz  mysql.service


# 构建MySQl镜像
[root@docker-01 mysql]# docker build -t mysql:5.7.28 .

二、构建systemctl管理MySQL服务镜像

  • 构建systemctl的目的是为了更好的管理容器中的MySQL服务
[root@docker-01 ~]# mkdir systemctl
[root@docker-01 ~]# cd systemctl/
[root@docker-01 systemctl]# cat Dockerfile 
# 基于刚刚的mysql镜像构建system镜像,作用是更好管理容器中的mysql服务
FROM mysql:5.7.28
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*; \
rm -f /etc/systemd/system/*.wants/*; \
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*; \
rm -f /lib/systemd/system/anaconda.target.wants/*;
# 在容器创建一个挂载点,这个挂载点将会跟宿主机或者别的容器交互
VOLUME ["/sys/fs/cgroup"]
CMD ["/usr/sbin/init"]


# 构建systemctl镜像master
[root@docker-01 systemctl]# docker build -t system:master .

# 构建systemctl镜像slave
[root@docker-01 systemctl]# docker build -t system:slave .

三、运行容器

  • 根据刚刚创建的两个镜像可以得知,mysql:5.7.28镜像有mysql服务,在此镜像基础上构建了mysql:system镜像,这个镜像当中有systemctl控制服务,可以更好的管理mysql服务
  • 使用mysql:system镜像创建master、slave容器
[root@docker-01 ~]# docker images
REPOSITORY   TAG        IMAGE ID       CREATED        SIZE
system       master     20e2772fd585   47 hours ago   6.72GB
system       slave      20e2772fd585   47 hours ago   6.72GB
mysql        5.7.28     9d559d0e3cf8   47 hours ago   6.72GB
centos       7.6.1810   f1cb7c7d58b7   5 years ago    202MB



# 创建master容器
[root@docker-01 ~]# docker run -d --hostname master --name master -p 13306:3306 --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro system:master

# 创建slave容器
[root@docker-01 ~]# docker run -d --hostname slave --name slave -p 23306:3306 --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro system:slave

四、登录容器

4.1、配置master

# 登录master容器
[root@docker-01 ~]# docker exec -it master bash
# 查看临时mysql密码
[root@master /]# tail -1 /var/log/mysql_password.log 
2024-05-25T04:21:20.466885Z 1 [Note] A temporary password is generated for root@localhost: MD)M;qyC0r_0
# 设置主服务器ID
[root@master /]# cat >> /etc/my.cnf << EOF
server-id = 1 
log-bin = master-bin               #开启二进制日志
binlog_format = mixed
EOF
[root@master /]# systemctl start mysqld
[root@master /]# netstat -anpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      316/mysqld
# 登录数据库更改密码
[root@master /]# mysql -u root -p
Enter password:   ## 输入临时密码
mysql> set password=password('wzh.2005');

4.2、配置slave

# 登录slave容器
[root@docker-01 ~]# docker exec -it slave bash
# 查看临时mysql密码
[root@slave /]# tail -1 /var/log/mysql_password.log 
2024-05-25T04:21:20.466885Z 1 [Note] A temporary password is generated for root@localhost: MD)M;qyC0r_0
# 设置从服务器ID
[root@slave /]# cat >> /etc/my.cnf << EOF
server-id = 2                      #需保证主库和从库的server_id不
relay-log = relay-log-bin          #开启中继日志
relay-log-index = slave-relay-bin.index   #中继日志开启索引
read_only=1 
EOF
[root@slave /]# systemctl start mysqld
[root@slave /]# netstat -anpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      326/mysqld
# 登录数据库更改密码
[root@slave /]# mysql -u root -p
Enter password: 		## 输入临时密码
mysql> set password=password('wzh.2005');

五、授权从库

# 给从服务器授权,允许使用myslave的身份复制master中的所有数据库的所有表数据,并指定密码为“wzh.2005”
[root@master /]# mysql -u root -pwzh.2005
mysql> grant replication slave on *.* to 'myslave'@'192.168.93.%' identified by 'wzh.2005';
# 两个容器之间使用172.17.0.0网段通信
mysql> grant replication slave on *.* to 'myslave'@'172.17.0.%' identified by 'wzh.2005';

六、更改UUID

  • 我这种方式构建的容器玩玩就好,因为有很多地方都没有做一些修改,就比如以上的两个mysql容器和克隆的没什么两样
# 两个uuid保持不一样即可,修改过后别忘记重启mysql服务
[root@master /]# cat /usr/local/mysql/data/auto.cnf
[auto]
server-uuid=3ca0adc5-1a4e-11ef-9c25-0242ac110004

[root@slave /]# cat /usr/local/mysql/data/auto.cnf
[auto]
server-uuid=3ca0adc5-1a4e-11ef-9c25-0242ac110005

七、连接主数据库

[root@slave /]# mysql -u root -pwzh.2005
mysql> change master to master_host='192.168.93.165',master_port=13306,master_user='myslave',master_password='wzh.2005',master_log_file='master-bin.000001',master_log_pos=990;
mysql> start slave;
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

八、验证

# 在主库创建kgc库
[root@master /]# mysql -u root -pwzh.2005
mysql> create database kgc;


# 从库查看是否同步主库kgc数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kgc                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker MySQL主从是一种数据库复制技术,通过在Docker容器中创建MySQL实例来实现主从同步。这种技术可以使数据在主数据库上的变化自动同步到从数据库上,确保数据的一致性和高可用性。 在创建Docker MySQL主从时,首先需要关闭防火墙并重启Docker以确保后续安装的MySQL可以正常启动。接下来,需要在Docker中创建并启动MySQL主服务器,通过端口映射将宿主机的端口与Docker容器内的MySQL服务器端口绑定。同时,还需要指定MySQL的配置文件和数据存储路径,并设置MySQL的root密码。 创建主服务器的命令示例为: 引用: ```bash docker run -d \ -p 3306:3306 \ -v /hitd/mysql/master/conf:/etc/mysql/conf.d \ -v /hitd/mysql/master/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ --name hitd-mysql-master \ mysql:8.0.29 ``` 引用: ```bash docker run -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 \ -e MYSQL_ROOT_PASSWORD=root \ -d mysql:5.7 ``` 然后,需要创建MySQL主服务器的配置文件,并配置日志、数据和配置文件的路径。 最后,可以通过进入从数据库容器并使用MySQL客户端工具查看主从同步状态。 引用: ```bash docker exec -it mysql-slave /bin/bash mysql -uroot -proot ``` 通过以上步骤,你可以成功创建Docker MySQL主从环境。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Docker搭建MySQL主从同步(全网最全保姆教程)](https://blog.csdn.net/qq_49619863/article/details/128047193)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【Docker 基础教程】Mysql主从环境搭建](https://blog.csdn.net/apple_51931783/article/details/126350430)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值