[Tistory] [MySQL on Docker⑪] Docker Compose를 이용한 일괄 배포

원글 페이지 : 바로가기

지금까지 구성했던 환경에는 여러 개의 컨테이너들이 필요했다. 만약 이 구성의 환경을 다른 곳에도 똑같이 만들려면 하나한 컨테이너 생성해주고 설정해주기에는 오랜 시간이 걸린다. 따라서 배포를 한번에 하기 위해서는 Docker Compose를 사용한다. Docker Compose를 이용해서 한번에 배포를 해볼 것이다. 1. Docker Compse 설치 먼저, Docker Compose를 설치해준다. 아래와 같이 Docker Compose를 추가로 설치한다. Mac 이나 Windows 라면 Docker Desktop을 설치했다면 Docker Compose도 함께 설치되기 때문에 따로 설치해 줄 필요는 없고 확인만 해준다. #설치
curl – L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$ (uname -m)” -o /usr/local/bin/docker-compose
#권한부여
chmod +x /usr/local/bin/docker-compose
#확인
docker-compose -v 2. docker-compose.yml 파일 생성 컨테이너 생성할 때 docker run 명령어에서 사용했던 각 옵션들을 그대로 파일로 옮겨 놓은 것이다. 컨테이너 이름, 호스트 명, 포트 정보, 환경 변수 세팅, 볼륨 정보 , 네트워크 정보까지 사용했던 옵션들을 그대로 나열해주었다. 그리고 Orchestrator, proxySQL, Prometheus, Grafana 까지 설정해준다. version: “3”
services:
db001:
image: mysql57:0.0
container_name: db001
hostname: db001
ports:
– “3306:3306”
environment:
MYSQL_ROOT_PASSWORD: ‘root’
volumes:
– /db/db001/data:/var/lib/mysql
– /db/db001/log:/var/log/mysql
– /db/db001/conf:/etc/percona-server.conf.d
networks:
– mybridge
db002:
image: mysql57:0.0
container_name: db002
hostname: db002
ports:
– “3307:3306”
environment:
MYSQL_ROOT_PASSWORD: ‘root’
volumes:
– /db/db002/data:/var/lib/mysql
– /db/db002/log:/var/log/mysql
– /db/db002/conf:/etc/percona-server.conf.d
networks:
– mybridge
db003:
image: mysql57:0.0
container_name: db003
hostname: db003
ports:
– “3308:3306”
environment:
MYSQL_ROOT_PASSWORD: ‘root’
volumes:
– /db/db003/data:/var/lib/mysql
– /db/db003/log:/var/log/mysql
– /db/db003/conf:/etc/percona-server.conf.d
networks:
– mybridge
orchestrator:
image: openarkcode/orchestrator:latest
container_name: orchestrator
hostname: orchestrator
ports:
– “3000:3000”
networks:
– mybridge
proxysql:
image: proxysql/proxysql
container_name: proxysql
hostname: proxysql
ports:
– “16032:6032”
– “16033:6033”
volumes:
– /db/proxysql/data:/var/lib/proxysql
– /db/proxysql/conf/proxysql.cnf:/etc/proxysql.cnf
networks:
– mybridge
prom001:
image: prom/prometheus-linux-amd64
container_name: prom001
hostname: prom001
ports:
– “9090:9090”
volumes:
– /db/prom001/data:/data
– /db/prom001/conf:/etc/prometheus
networks:
– mybridge
grafana:
image: grafana/grafana
container_name: grafana
hostname: grafana
ports:
– “13000:3000″
networks:
– mybridge

networks:
mybridge:
external: true 3. 모든 컨테이너 삭제 모든 컨테이너 및 data, log 디렉토리의 모든 데이터 삭제해준다. docker stop db001 db002 db003 grafana prom001 proxysql orchestrator
docker rm db001 db002 db003 grafana prom001 proxysql orchestrator
#디렉토리안 데이터 삭제
cd /db/db001/data
rm -rf *
cd /db/db001/data
rm -rf *
cd /db/db003/data
rm -rf *
cd /db/proxysql/data
rm -rf * 4. Docker Compose 실행 docker-compose -p my-project up -d 5. post_script.sh 작성 생성된 컨테이너를 그대로 사용할 수 있는게 아니라 이전에 구성했던 환경과 동일한 환경이 되려면 몇 가지 설정들이 더 필요하다. Replication 설정이나 Orchestrator 설정 그리고 porsySQL 설정 Exporter의 실행 등등 필요한 설정들을 하나의 스크립트로 만들어서 컨테이너가 생성된 후에 해당 스크립트를 실행해서 원하는 환경을 만들어준다. vi post_script.sh
sh post_script.sh MASTER_NODE=’db001′
SLAVE01_NODE=’db002′
SLAVE02_NODE=’db003′

EXEC_MASTER=”docker exec ${MASTER_NODE} mysql -uroot -proot -N -e ”
EXEC_SLAVE01=”docker exec ${SLAVE01_NODE} mysql -uroot -proot -e ”
EXEC_SLAVE02=”docker exec ${SLAVE02_NODE} mysql -uroot -proot -e ”

## For Replication
${EXEC_MASTER} “CREATE USER ‘repl’@’%’ IDENTIFIED BY ‘repl'” 2>&1 | grep -v “Using a password”
${EXEC_MASTER} “GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%'” 2>&1 | grep -v “Using a password”

${EXEC_SLAVE01} “reset master” 2>&1 | grep -v “Using a password”
${EXEC_SLAVE01} “CHANGE MASTER TO MASTER_HOST=’${MASTER_NODE}’, \
MASTER_USER=’repl’, MASTER_PASSWORD=’repl’, \
MASTER_AUTO_POSITION=1” 2>&1 | grep -v “Using a password”
${EXEC_SLAVE01} “START SLAVE” 2>&1 | grep -v “Using a password”

${EXEC_SLAVE02} “reset master” 2>&1 | grep -v “Using a password”
${EXEC_SLAVE02} “CHANGE MASTER TO MASTER_HOST=’${MASTER_NODE}’, \
MASTER_USER=’repl’, MASTER_PASSWORD=’repl’, \
MASTER_AUTO_POSITION=1” 2>&1 | grep -v “Using a password”
${EXEC_SLAVE02} “START SLAVE” 2>&1 | grep -v “Using a password”

## For Orchestrator
${EXEC_MASTER} “CREATE USER orc_client_user@’%’ IDENTIFIED BY ‘orc_client_password'” 2>&1 | grep -v “Using a password”
${EXEC_MASTER} “GRANT SUPER, PROCESS, REPLICATION SLAVE, RELOAD ON *.* TO orc_client_user@’%'” 2>&1 | grep -v “Using a password”
${EXEC_MASTER} “GRANT SELECT ON mysql.slave_master_info TO orc_client_user@’%'” 2>&1 | grep -v “Using a password”

## For ProxySQL
${EXEC_MASTER} “CREATE DATABASE testdb DEFAULT CHARACTER SET=utf8” 2>&1 | grep -v “Using a password”
${EXEC_MASTER} “CREATE USER appuser@’%’ IDENTIFIED BY ‘apppass'” 2>&1 | grep -v “Using a password”
${EXEC_MASTER} “GRANT SELECT, INSERT, UPDATE, DELETE ON testdb.* TO appuser@’%'” 2>&1 | grep -v “Using a password”
${EXEC_MASTER} “CREATE USER monitor@’%’ IDENTIFIED BY ‘monitor'” 2>&1 | grep -v “Using a password”
${EXEC_MASTER} “GRANT REPLICATION CLIENT ON *.* TO monitor@’%'” 2>&1 | grep -v “Using a password”

## For Prometheus
${EXEC_MASTER} “CREATE USER ‘exporter’@’localhost’ IDENTIFIED BY ‘exporter123’ WITH MAX_USER_CONNECTIONS 3” 2>&1 | grep -v “Using a password”
${EXEC_MASTER} “GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO ‘exporter’@’localhost'” 2>&1 | grep -v “Using a password”

docker exec ${MASTER_NODE} sh /opt/exporters/node_exporter/start_node_exporter.sh
docker exec ${MASTER_NODE} sh /opt/exporters/mysqld_exporter/start_mysqld_exporter.sh
docker exec ${SLAVE01_NODE} sh /opt/exporters/node_exporter/start_node_exporter.sh
docker exec ${SLAVE01_NODE} sh /opt/exporters/mysqld_exporter/start_mysqld_exporter.sh
docker exec ${SLAVE02_NODE} sh /opt/exporters/node_exporter/start_node_exporter.sh
docker exec ${SLAVE02_NODE} sh /opt/exporters/mysqld_exporter/start_mysqld_exporter.sh

EXEC_PROXY=”mysql -h127.0.0.1 -P16032 -uradmin -pradmin -e ”

${EXEC_PROXY} “INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (10, ‘db001’, 3306)” 2>&1 | grep -v “Using a password”
${EXEC_PROXY} “INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, ‘db001’, 3306)” 2>&1 | grep -v “Using a password”
${EXEC_PROXY} “INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, ‘db002’, 3306)” 2>&1 | grep -v “Using a password”
${EXEC_PROXY} “INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, ‘db003′, 3306)” 2>&1 | grep -v “Using a password”
${EXEC_PROXY} “INSERT INTO mysql_replication_hostgroups VALUES (10,20,’read_only’,”)” 2>&1 | grep -v “Using a password”
${EXEC_PROXY} “LOAD MYSQL SERVERS TO RUNTIME” 2>&1 | grep -v “Using a password”
${EXEC_PROXY} “SAVE MYSQL SERVERS TO DISK” 2>&1 | grep -v “Using a password”

${EXEC_PROXY} “INSERT INTO mysql_users(username,password,default_hostgroup,transaction_persistent)
VALUES (‘appuser’,’apppass’,10,0)” 2>&1 | grep -v “Using a password”
${EXEC_PROXY} “LOAD MYSQL USERS TO RUNTIME” 2>&1 | grep -v “Using a password”
${EXEC_PROXY} “SAVE MYSQL USERS TO DISK” 2>&1 | grep -v “Using a password”

${EXEC_PROXY} “INSERT INTO mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup)
VALUES (1,1,’^SELECT.*FOR UPDATE$’,10)” 2>&1 | grep -v “Using a password”
${EXEC_PROXY} “INSERT INTO mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup)
VALUES (2,1,’^SELECT’,20)” 2>&1 | grep -v “Using a password”
${EXEC_PROXY} “LOAD MYSQL QUERY RULES TO RUNTIME” 2>&1 | grep -v “Using a password”
${EXEC_PROXY} “SAVE MYSQL QUERY RULES TO DISK” 2>&1 | grep -v “Using a password” 6. 확인 참고 : https://www.inflearn.com/course/mysql-docker/dashboard 이미지 출처 : https://velog.io/@chaerim1001/dockerize%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-docker-compose-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%8B%A4%ED%96%89-%EC%88%9C%EC%84%9C-%EC%A1%B0%EC%A0%95%ED%95%98%EA%B8%B0

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다