docker compose란?
하나의 시스템은 여러개의 애플리케이션이 서로 의존하면서 구성되어있다.
하나의 컨테이너가 하나의 에플리케이션을 담당하면 여러개의 컨테이너가 필요하다 .
docker compose를 이용하면 여러개의 컨테이너의 실행을 한번에 관리할 수 있다.
여러 컨테이너를 하나의 파일에 정의해두고 올리거나 내릴 수 있다.
프로젝트 경로 하위에 docker 디렉토리를 생성, docker-compose.yml 생성
로치가 공유해주신 것을 기반으로 docker-compose.yml을 생성했다.
yml파일을 적어준 환경변수를 어떻게 설정하는지 찾아보니 .env파일을 생성하면 된다고 한다.
MASTER_DB_PASSWORD=password
port is already allocated 에러 발생
docker-compose up 명령어로 실행했는데 Cannot start service master-db: driver failed programming external connectivity on endpoint, port is already allocated 에러가 발생했다.
해당 블로그를 보고 이미 할당된 port를 kill 하니 해결했다.
// 특정 포트번호로 사용중인지 확인하는 명령어
$ sudo lsof -i :3306
InnoDB: Unable to lock ./ibdata1 error: 11
다시 실행하니 test-db에 대한 로그가 끊임없이 찍히는데 로그로 봐서는 master-db 와 같은 디비를 사용하려고 해서 그러는게 아닌가 싶다.
알고보니 yml파일을 잘못 작성해서 그렇다... test-db에 대한 volumes을 master-db로 해놔서 에러가 발생했다. test-db로 변경하니 잘 실행된다.
version: "3"
services:
master-db:
image: mysql:5.7
container_name: mysql-master
environment:
MYSQL_DATABASE: "itda"
MYSQL_ROOT_PASSWORD: "${MASTER_DB_PASSWORD}"
TZ: Asia/Seoul
command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
volumes:
- ./master-db:/var/lib/mysql
ports:
- "3306:3306"
restart: always
test-db:
image: mysql:5.7
container_name: mysql-test
environment:
MYSQL_DATABASE: "itda"
MYSQL_ROOT_PASSWORD: "${MASTER_DB_PASSWORD}"
TZ: Asia/Seoul
command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
volumes:
- ./test-db:/var/lib/mysql
ports:
- "3307:3306"
restart: always
volumes에서 앞에 있는 ./test-db가 로컬 경로고, : 뒤에 있는 /var/lib/mysql 경로가 도커 경로
참고: https://junlab.tistory.com/219
https://luran.me/230 (환경변수)