第一步:编写docker-compose.yml文件
version: "3.3"
services:
mysql-master: &mysql
image: mysql:5.7.21
container_name: mysql-master
restart: unless-stopped
env_file:
- .env
environment:
- MYSQL_ROOT_PASSWORD=${MASTER_MYSQL_ROOT_PASSWORD}
- TZ=Asia/Shanghai
ports:
- "3306:3306"
expose:
- "3306"
volumes:
- ./mysql-master-data:/var/lib/mysql
- ./init-db-sql/sakila-schema.sql:/docker-entrypoint-initdb.d/1-schema.sql
- ./init-db-sql/sakila-data.sql:/docker-entrypoint-initdb.d/2-data.sql
- ./init-db-sql/init-master.sh:/docker-entrypoint-initdb.d/3-init-master.sh
command: [
"--log-bin=mysql-bin",
"--server-id=${MASTER_SERVER_ID}",
"--character-set-server=utf8mb4",
"--collation-server=utf8mb4_unicode_ci",
"--innodb_flush_log_at_trx_commit=1",
"--sync_binlog=1"
]
mysql-node-1: &mysql-node
<<: *mysql
container_name: mysql-node-1
environment:
- MYSQL_ROOT_PASSWORD=${NODE_MYSQL_ROOT_PASSWORD}
- MASTER_MYSQL_ROOT_PASSWORD=${MASTER_MYSQL_ROOT_PASSWORD}
- TZ=Asia/Shanghai
ports:
- "3307:3306"
depends_on:
- mysql-master
volumes:
- ./mysql-node-1-data:/var/lib/mysql
- ./init-db-sql/sakila-schema.sql:/docker-entrypoint-initdb.d/1-schema.sql
- ./init-db-sql/sakila-data.sql:/docker-entrypoint-initdb.d/2-data.sql
- ./init-db-sql/init-node.sh:/docker-entrypoint-initdb.d/3-init-node.sh
command: [
"--server-id=${NODE_1_SERVER_ID}",
"--character-set-server=utf8mb4",
"--collation-server=utf8mb4_unicode_ci",
]
mysql-node-2:
<<: *mysql-node
container_name: mysql-node-2
environment:
- TZ=Asia/Shanghai
ports:
- "3308:3306"
volumes:
- ./mysql-node-2-data:/var/lib/mysql
- ./init-db-sql/sakila-schema.sql:/docker-entrypoint-initdb.d/1-schema.sql
- ./init-db-sql/sakila-data.sql:/docker-entrypoint-initdb.d/2-data.sql
- ./init-db-sql/init-node.sh:/docker-entrypoint-initdb.d/3-init-node.sh
command: [
"--server-id=${NODE_2_SERVER_ID}",
"--character-set-server=utf8mb4",
"--collation-server=utf8mb4_unicode_ci",
]
networks:
default:
external:
name: maxcloud
第二步: 编写环境变量配置文件.env(隐藏文件,在目录看不到,用ls -a可看)
# image tag
TAG=5.7.21
MASTER_SERVER_ID=1
NODE_1_SERVER_ID=10
NODE_2_SERVER_ID=20
MASTER_MYSQL_ROOT_PASSWORD=123
NODE_MYSQL_ROOT_PASSWORD=123
第三步:创建init-db-sql文件夹,并在其中编写相应文件
1.init-master.sh
#!/bin/bash
set -e
# create replication user
mysql_net=$(ip route | awk '$1=="default" {print $3}' | sed "s/\.[0-9]\+$/.%/g")
MYSQL_PWD=${MYSQL_ROOT_PASSWORD} mysql -u root \
-e "CREATE USER '${MYSQL_REPLICATION_USER}'@'${mysql_net}' IDENTIFIED BY '${MYSQL_REPLICATION_PASSWORD}'; \
GRANT REPLICATION SLAVE ON *.* TO '${MYSQL_REPLICATION_USER}'@'${mysql_net}';"
2.init-node.sh
# set node master
MYSQL_PWD=${MYSQL_ROOT_PASSWORD} mysql -u root \
-e "CHANGE MASTER TO MASTER_HOST='mysql-master', \
MASTER_USER='${MYSQL_REPLICATION_USER}', \
MASTER_PASSWORD='${MYSQL_REPLICATION_PASSWORD}', \
MASTER_LOG_FILE='${LOG_FILE}', \
MASTER_LOG_POS=${LOG_POS};"
# start slave and show slave status
MYSQL_PWD=${MYSQL_ROOT_PASSWORD} mysql -u root -e "START SLAVE;show slave status\G"
3.sakila-schema.sql、sakila-data.sql文件官网都有
第四步:检查配置
docker-compose config
第五步:启动容器