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

评论已关闭