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 |
- +--------------------+
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |