Docker部署MySQL主从复制
文章目录
- Docker部署MySQL主从复制
- 一、构建MySQL镜像
- 二、构建systemctl管理MySQL服务镜像
- 三、运行容器
- 四、登录容器
- 五、授权从库
- 六、更改UUID
- 七、连接主数据库
- 八、验证
一、构建MySQL镜像
- 我自己是使用的Dockerfile构建的MySQL镜像,也可以使用公共MySQL镜像
[root@docker-01 ~]
[root@docker-01 ~]
[root@docker-01 mysql]
FROM centos:7.6.1810
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
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
[root@docker-01 mysql]
[client]
socket=/usr/local/mysql/data/mysql.sock
[mysqld]
socket=/usr/local/mysql/data/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
port=3306
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
max_connections=2048
character-set-server=utf8
default-storage-engine=INNODB
lower_case_table_names=1
max_allowed_packet=16M
[root@docker-01 mysql]
[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]
Dockerfile my.cnf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz mysql.service
[root@docker-01 mysql]
二、构建systemctl管理MySQL服务镜像
- 构建systemctl的目的是为了更好的管理容器中的MySQL服务
[root@docker-01 ~]
[root@docker-01 ~]
[root@docker-01 systemctl]
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"]
[root@docker-01 systemctl]
[root@docker-01 systemctl]
三、运行容器
- 根据刚刚创建的两个镜像可以得知,mysql:5.7.28镜像有mysql服务,在此镜像基础上构建了mysql:system镜像,这个镜像当中有systemctl控制服务,可以更好的管理mysql服务
- 使用mysql:system镜像创建master、slave容器
[root@docker-01 ~]
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
[root@docker-01 ~]
[root@docker-01 ~]
四、登录容器
4.1、配置master
[root@docker-01 ~]
[root@master /]
2024-05-25T04:21:20.466885Z 1 [Note] A temporary password is generated for root@localhost: MD)M;qyC0r_0
[root@master /]
server-id = 1
log-bin = master-bin
binlog_format = mixed
EOF
[root@master /]
[root@master /]
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 /]
Enter password:
mysql> set password=password('wzh.2005');
4.2、配置slave
[root@docker-01 ~]
[root@slave /]
2024-05-25T04:21:20.466885Z 1 [Note] A temporary password is generated for root@localhost: MD)M;qyC0r_0
[root@slave /]
server-id = 2
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
read_only=1
EOF
[root@slave /]
[root@slave /]
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 /]
Enter password:
mysql> set password=password('wzh.2005');
五、授权从库
[root@master /]
mysql> grant replication slave on *.* to 'myslave'@'192.168.93.%' identified by 'wzh.2005';
mysql> grant replication slave on *.* to 'myslave'@'172.17.0.%' identified by 'wzh.2005';
六、更改UUID
- 我这种方式构建的容器玩玩就好,因为有很多地方都没有做一些修改,就比如以上的两个mysql容器和克隆的没什么两样
[root@master /]
[auto]
server-uuid=3ca0adc5-1a4e-11ef-9c25-0242ac110004
[root@slave /]
[auto]
server-uuid=3ca0adc5-1a4e-11ef-9c25-0242ac110005
七、连接主数据库
[root@slave /]
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
八、验证
[root@master /]
mysql> create database kgc;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| kgc |
| mysql |
| performance_schema |
| sys |
+--------------------+