搭建初衷
- 本身自己就是开发这类应用的工作者,一个私有库还是很有必要的。无论是公司项目还是私人项目都可以用到,不用担心忘记同步导致的数据丢失
- 统一管理所有docker应用的数据(如果容器可以连接mysql的话)也方便随时修改数据
- 结构可视化,方便拓展一些容器的功能,比如Halo的代码
注意事项
- 所有基础应用都会在统一一个docker公用网络中,要先创建这个网络。我们这边就是创建了一个名为basenetwork的网络。后续所有Mysql、Redis、MongoDB、nacos、ES都会连到这个网络中。具体如何创建docker公用网络,百度一下或者GPT一下,很简单的
- 为了方便容器的排序,我将所有基础服务的名称都加上了zz-前缀,可以自行修改
增加相关配置
目录结构
├── init_db
├── master
│ └── my.conf
├── slave1
│ └── my.conf
├── slave2
│ └── my.conf
└── docker-compose.yml
docker-compose.yml
version: "3"
services:
mysql-master:
container_name: zz-base-mysql-master
hostname: mysql-master
image: "mysql:5.7"
ports:
- 3306:3306
volumes:
- ./master/etc:/etc/mysql
- ./master/var/lib:/var/lib/mysql
- ./master/my.cnf:/etc/my.cnf
- ./init_db/:/docker-entrypoint-initdb.d/
environment:
MYSQL_ROOT_PASSWORD: 填入超级管理员密码
MYSQL_DATABASE: rule_platform
MYSQL_USER: 填入普通用户
MYSQL_PASSWORD: 填入普通用户密码
TZ: Asia/Shanghai
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
restart: always
networks:
basenetwork:
ipv4_address: 172.16.0.101
mysql-slave-1:
container_name: zz-base-mysql-slave-1
hostname: mysql-slave-1
image: "mysql:5.7"
ports:
- 3307:3306
volumes:
- ./slave1/etc:/etc/mysql
- ./slave1/var/lib:/var/lib/mysql
- ./slave1/my.cnf:/etc/my.cnf
- ./slave1/init_db/:/docker-entrypoint-initdb.d/
environment:
MYSQL_ROOT_PASSWORD: 填入超级管理员密码
MYSQL_DATABASE: rule_platform
MYSQL_USER: 填入普通用户
MYSQL_PASSWORD: 填入普通用户密码
TZ: Asia/Shanghai
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
restart: always
networks:
basenetwork:
ipv4_address: 172.16.0.102
mysql-slave-2:
container_name: zz-base-mysql-slave-2
hostname: mysql-slave-2
image: "mysql:5.7"
ports:
- 3308:3306
volumes:
- ./slave2/etc:/etc/mysql
- ./slave2/var/lib:/var/lib/mysql
- ./slave2/my.cnf:/etc/my.cnf
- ./slave2/init_db/:/docker-entrypoint-initdb.d/
environment:
MYSQL_ROOT_PASSWORD: 填入超级管理员密码
MYSQL_DATABASE: rule_platform
MYSQL_USER: 填入普通用户
MYSQL_PASSWORD: 填入普通用户密码
TZ: Asia/Shanghai
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
restart: always
networks:
basenetwork:
ipv4_address: 172.16.0.103
networks:
basenetwork:
external: true
master的my.cnf
[mysqld]
# 主数据库端ID号
server_id = 101
# 开启GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 开启二进制日志
log-bin = mysql-bin
# 不需要复制的数据库名(mysql库一般不同步)
binlog-ignore-db = mysql
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# 二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除
expire_logs_days = 7
# 将函数复制到slave
log_bin_trust_function_creators = 1
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors = 1062
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates = ON
# MySQL 8.x,需要如下配置
default_authentication_plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
slave-1的my.cnf
[mysqld]
# 从数据库端ID号
server_id = 102
# 开启GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 开启二进制日志
log-bin = mysql-slave1-bin
# 不需要复制的数据库名(mysql库一般不同步)
binlog-ignore-db = mysql
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# 二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除
expire_logs_days = 7
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors = 1062
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates = ON
relay_log = mysql-relay-bin
read_only=1
slave2的my.cnf
[mysqld]
# 从数据库端ID号
server_id = 103
# 开启GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 开启二进制日志
log-bin = mysql-slave2-bin
# 不需要复制的数据库名(mysql库一般不同步)
binlog-ignore-db = mysql
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# 二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除
expire_logs_days = 7
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors = 1062
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates = ON
relay_log = mysql-relay-bin
read_only=1
启动容器
填入好docker-compose.yml文件中那些需要手动填入的内容,创建好所有文件文件夹之后,就可以启动容器了。
在docker-compose.yml目录下,运行sudo docker-compose up -d
即可
配置主从同步
在服务器(宿主机)上运行以下sh命令即可
# master
docker exec -it zz-base-mysql-master bash
mysql -uroot -p填入root用户密码
create user 'repl'@'%' identified by 'repl';
grant replication client,replication slave on *.* to 'repl'@'%';
# slave
docker exec -it zz-base-mysql-slave bash
mysql -uroot -p填入root用户密码
reset master;
CHANGE MASTER TO MASTER_HOST='mysql-master',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_PORT=3306,MASTER_AUTO_POSITION=1;
start slave;
至此,完事!~
如果你某个容器要使用mysql库了,将这个容器设置在basenetwork网络下,然后就可以直接使用172.16.0.101这个地址连接到了。
内网也可以直接使用Navicat或者dataGrip连接。
当然,如果想让外网也访问到可以配置个frp,之后会再出一篇frp的教程,感谢支持!
END。
欢迎访问我的blog > https://blog.taotaojs.top/archives/mysql%E4%B8%BB%E4%BB%8E%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA%E5%9F%BA%E4%BA%8Edocker-compose%E4%B8%80%E9%94%AE%E9%83%A8%E7%BD%B2