Docker compose 部署 Mysql8.0 并开启主从复制
部署主机
编写主机脚本
vim install.sh
#!/bin/bash
# mysql 镜像名称
mysql_img_name="mysql"
# mysql 版本
mysql_version="8.0"
# 暴露端口
exposed_port="33060"
# server-id
server_id=1
# 服务名称
service_name="mysql"
# ROOT 用户密码
root_password="123456"
# ROOT 用户 host
root_host="%"
# 用于主从复制的用户
slave_user="slave"
# 用于自从复制的用户的密码
slave_pass="123456"
# 初始化SQL文件
init_sql_file="./init.sql"
# 数据文件挂载目录
data_dir="./data"
# 配置文件挂载目录
conf_dir="./conf"
# 备份文件挂载目录
bak_dir="./bak"
# 当前用户ID
uid=$(id -u)
# 内部端口
internal_port="3306"
# 内部数据文件路径
internal_data_dir="/var/lib/mysql"
# 内部配置文件路径
internal_conf_dir="/etc/mysql/conf.d"
# 内部备份文件路径
internal_bak_dir="/bak"
# 内部初始化SQL文件路径
internal_init_sql_file="/docker-entrypoint-initdb.d/init.sql"
# ----------------------------------
# 创建文件夹
mkdir $data_dir
mkdir $conf_dir
mkdir $bak_dir
# 创建配置文件
cat <<EOF > conf/master.cnf
[mysqld]
server-id=$server_id
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=true
log_slave_updates=ON
binlog_format=ROW
EOF
# 创建 初始化sql
cat <<EOF > init.sql
-- 创建基于 mysql_native_password 认证的用于主从复制的用户
CREATE USER '${slave_user}'@'%' IDENTIFIED WITH mysql_native_password BY '${slave_pass}';
-- 创建基于默认认证规则的用于主从复制的用户
-- CREATE USER '${slave_user}'@'%' IDENTIFIED BY '${slave_pass}';
-- 授予完整权限
GRANT ALL PRIVILEGES ON *.* TO '${slave_user}'@'%';
-- 授予部分权限
-- GRANT REPLICATION SLAVE ON *.* TO '${slave_user}'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 创建测试库
CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;
CREATE TABLE IF NOT EXISTS test_table (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
);
EOF
# 创建 docker-compose.yml 文件
cat <<EOF > docker-compose.yml
version: '3'
services:
$service_name:
image: $mysql_img_name:$mysql_version
ports:
- "$exposed_port:$internal_port"
volumes:
# 将容器内的数据卷挂载到宿主机上
- $data_dir:$internal_data_dir
- $conf_dir:$internal_conf_dir
- $bak_dir:$internal_bak_dir
- $init_sql_file:$internal_init_sql_file
environment:
- MYSQL_ROOT_PASSWORD=$root_password
- MYSQL_ROOT_HOST=$root_host
user: $uid:$uid
restart: always
EOF
# 生成启动脚本
cat <<EOF > run.sh
#!/bin/bash
docker compose up -d
EOF
# 生成停止脚本
cat <<EOF > stop.sh
#!/bin/bash
docker compose stop
EOF
# 生成重启脚本
cat <<EOF > restart.sh
#!/bin/bash
docker compose restart
EOF
# 生成删除脚本
cat <<EOF > remove.sh
#!/bin/bash
docker compose down -v
EOF
# 生成监视日志脚本
cat <<EOF > monitor.sh
#!/bin/bash
docker compose logs -f
EOF
# 生成进入容器脚本
cat <<EOF > exec.sh
#!/bin/bash
docker compose exec $service_name /bin/bash
EOF
# 赋予脚本执行权限
chmod +x *.sh
# 删除当前脚本文件
rm "$0"
执行脚本
sh install.sh
启动服务
docker compose up -d
# 查看日志
docker compose logs -f
# 启动并查看日志
docker compose up -d && docker compose logs -f
部署从机
编写从机脚本
vim install.sh
#!/bin/bash
# mysql 镜像名称
mysql_img_name="mysql"
# mysql 版本
mysql_version="8.0"
# 暴露端口
exposed_port="33061"
# server-id
server_id=2
# 主库地址
master_host="127.0.0.1"
# 主库端口
master_port="33060"
# 主库用于主从复制的用户名
master_user="slave"
# 主库用于主从复制的密码
master_pass="123456"
# 服务名称
service_name="mysql"
# ROOT 用户密码
root_password="123456"
# ROOT 用户 host
root_host="%"
# 用于主从复制的用户
slave_user="slave"
# 用于自从复制的用户的密码
slave_pass="123456"
# 初始化SQL文件
init_sql_file="./init.sql"
# 数据文件挂载目录
data_dir="./data"
# 配置文件挂载目录
conf_dir="./conf"
# 备份文件挂载目录
bak_dir="./bak"
# 当前用户ID
uid=$(id -u)
# 内部端口
internal_port="3306"
# 内部数据文件路径
internal_data_dir="/var/lib/mysql"
# 内部配置文件路径
internal_conf_dir="/etc/mysql/conf.d"
# 内部备份文件路径
internal_bak_dir="/bak"
# 内部初始化SQL文件路径
internal_init_sql_file="/docker-entrypoint-initdb.d/init.sql"
# ----------------------------------
# 创建文件夹
mkdir $data_dir
mkdir $conf_dir
mkdir $bak_dir
# 创建配置文件
cat <<EOF > conf/master.cnf
[mysqld]
server-id=$server_id
gtid_mode=ON
enforce-gtid-consistency=true
log_slave_updates=ON
relay_log=slave-relay-log
read_only=ON
binlog_format=ROW
EOF
# 创建 初始化sql
cat <<EOF > init.sql
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='${master_host}',
SOURCE_PORT=${master_port},
SOURCE_USER='${master_user}',
SOURCE_PASSWORD='${master_pass}',
SOURCE_AUTO_POSITION=1;
START SLAVE;
SHOW SLAVE STATUS
EOF
# 创建 docker-compose.yml 文件
cat <<EOF > docker-compose.yml
version: '3'
services:
$service_name:
image: $mysql_img_name:$mysql_version
ports:
- "$exposed_port:$internal_port"
volumes:
# 将容器内的数据卷挂载到宿主机上
- $data_dir:$internal_data_dir
- $conf_dir:$internal_conf_dir
- $bak_dir:$internal_bak_dir
- $init_sql_file:$internal_init_sql_file
environment:
- MYSQL_ROOT_PASSWORD=$root_password
- MYSQL_ROOT_HOST=$root_host
user: $uid:$uid
restart: always
EOF
# 生成启动脚本
cat <<EOF > run.sh
#!/bin/bash
docker compose up -d
EOF
# 生成停止脚本
cat <<EOF > stop.sh
#!/bin/bash
docker compose stop
EOF
# 生成重启脚本
cat <<EOF > restart.sh
#!/bin/bash
docker compose restart
EOF
# 生成删除脚本
cat <<EOF > remove.sh
#!/bin/bash
docker compose down -v
EOF
# 生成监视日志脚本
cat <<EOF > monitor.sh
#!/bin/bash
docker compose logs -f
EOF
# 生成进入容器脚本
cat <<EOF > exec.sh
#!/bin/bash
docker compose exec $service_name /bin/bash
EOF
# 赋予脚本执行权限
chmod +x *.sh
# 删除当前脚本文件
rm "$0"
执行脚本
sh install.sh
启动服务
docker compose up -d
# 查看日志
docker compose logs -f
# 启动并查看日志
docker compose up -d && docker compose logs -f
评论已关闭