

root
ㄴ
ㄴ master
ㄴ ㄴ Dockerfile
ㄴ ㄴ my.cnf
ㄴ
ㄴ slave
ㄴ ㄴ Dockerfile
ㄴ ㄴ my.cnf
ㄴ
ㄴ docker-compose.yml
FROM mysql:8.0
COPY ./master/my.cnf /etc/mysql/my.cnf
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
# MySQL 서버(daemon)의 설정을 지정한다.
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-time-zone='+9:00'
# 이진 로그를 사용해서 MySQL 서버에서 발행하는 변경 사항을 기록한다. mysql-bin은 이진로그의 파일 이름을 지정한다.
log-bin = mysql-bin
# MySQL 서버의 고유한 식별자를 설정한다. 이 식별자는 MySQL 복제(replication) 설정에서 사용된다.
server-id = 1
# MySQL 사용자의 인증 플러그인을 mysql_native_password로 지정한다 -> 5.7 이전 버전과의 호환성을 유지하기 위해 사용되는 매커니즘이다.
default_authentication_plugin=mysql_native_password
FROM mysql:8.0
COPY ./slave/my.cnf /etc/mysql/my.cnf
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-time-zone='+9:00'
log_bin = mysql-bin
server_id = 2
# MySQL 슬레이브 서버에서 사용되는 중계로그(relay log)의 저장 위치를 지정한다.
relay_log = /var/lib/mysql/mysql-relay-bin
# 슬레이브 서버에서 발행하는 변경 사항도 이진 로그에 기록하도록 하게 하는 설정이다. 기본적으로 슬레이브 서버의 변경 사항은 이진 로그에 기록되지 않는다.
log_slave_updates = 1
# 슬레이브 서버를 읽기 전용 모드로 설정한다.
read_only = 1
default_authentication_plugin=mysql_native_password
services:
# 서비스의 이름
db-master:
# 도커 이미지를 빌드하는 방법을 지정
build:
# 현재 디렉토리를 빌드 컨텍스트로 사용
context: ./
# master 디렉토리에 위치한 Dockerfile을 사용하여 도커 이미지를 빌드
dockerfile: master/Dockerfile
# 컨테이너가 비정상적으로 종료되었을 때 자동으로 재시작
restart: always
# 컨테이너가 실행될 플랫폼을 지정
platform: linux/x86_64
# 컨테이너 내에서 사용할 환경 변수를 설정
environment:
# MySQL 데이터베이스의 이름을 db로 설정
MYSQL_DATABASE: 'db'
# MySQL에서 사용될 사용자 이름을 설정
MYSQL_USER: 'user'
# MySQL에서 사용될 사용자의 비빌번호를 설정
MYSQL_PASSWORD: '1234'
# MySQL 루트 사용자의 비밀번호를 설정
MYSQL_ROOT_PASSWORD: '1234'
# 호스트와 컨테이너 간의 포트 매핑을 정의한다 -> 호스트의 3306 포트와 컨테이너의 3306 포트를 연결
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
ports:
- '3308:3306'
# 컨테이너 이름을 정의
container_name: master-db
# 데이터를 영속적으로 저장할 볼륨을 정의 -> 볼륨은 컨테이너가 시작될 때 생성되고 컨테이너가 종료되어도 데이터가 유지된다.
volumes:
- my-db-master:/var/lib/mysql
- my-db-master:/var/lib/mysql-files
# 서비스가 연결될 네트워크를 지정
networks:
- net-mysql
db-slave:
build:
context: ./
dockerfile: slave/Dockerfile
restart: always
platform: linux/x86_64
environment:
MYSQL_DATABASE: 'db'
MYSQL_USER: 'user'
MYSQL_PASSWORD: '1234'
MYSQL_ROOT_PASSWORD: '1234'
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
ports:
- '3309:3306'
container_name: slave-db
# Where our data will be persisted
volumes:
- my-db-slave:/var/lib/mysql
- my-db-slave:/var/lib/mysql-files
networks:
- net-mysql
# 컨테이너에서 사용할 볼륨의 이름을 정의한다.
volumes:
my-db-master:
my-db-slave:
# net-mysql 이라는 이름의 네트워크를 정의한다.
networks:
net-mysql:
# 이 네트워크는 Docker 컨테이너들 사이의 통신을 가능하게 하는 bridge 네트워크임을 정의
driver: bridge
docker-compose up -d

docker network ls

docker inspect {bridge의 network Id}

docker exec -it master-db mysql -u root -p'1234';
show master status;

CHANGE MASTER TO
MASTER_HOST='172.19.0.2',
MASTER_USER='root',
MASTER_PASSWORD='1234',
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=157;
start slave;
show slave status\G;

create database master;
use master;
create table member (id int, name varchar(30));
insert into member (id,name) values (1,'test');
select * from member;


