올 것이 왔다..

바로 앞 포스팅에서 배운 여러 컨테이너를 사용하는 앱을 한방에 관리하기 위한 것이 바로 Docker Compose 이다.
일단 앞 포스팅에서 컨테이너 하나를 실행시킬 때 사용했던 스크립트를 docker-compose.yml 로 옮겨보자
docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:12-alpine \
sh -c "yarn install && yarn run dev"
이거의 뜻을 복습해보자
-w - 컨테이너 안에서 스크립트를 실행할 디렉토리-v - Named Volume이나 Bind mounts 지정--network - 컨테이너가 속할 네트워크 지정-e 컨테이너 안의 환경변수 지정node:12-alphine 컨테이너 생성할 이미지sh -c - 컨테이너 안에서 실행할 스크립트이거를 docker-compose.yml로 옮기면 다음과 같다
version: "3.7"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
각각의 의미를 하나씩 뜯어보자. 일단은 기본적으로 yml파일이므로 yml의 구조를 그대로 가져간다.
version: - docker-compose의 버전을 지정해준다. 공식문서에 찾아보면 docker-compose의 버전 기록이 나와있는데, 최신 버전을 사용하는 것이 좋다고 한다. 튜토리얼에는 3.7로 돼있는데 현재 최신 버전은 3.8이다services: - 이 docker-compose.yml로 관리할 컨테이너들의 목록이 들어온다. services 안에 있는 컨테이너들은 자동으로 같은 네트워크 하나에 연결된다!app: - 컨테이너의 이름을 적어준 것인데 여기에선 그냥 app으로 한다. 여기에 적은 이름은 자동으로 network-alias로 지정이 되는 것을 기억하고 가자!image, command는 초반에 넣는다고 한다.여기 까지하면 컨테이너 하나만 관리하는 docker-compose.yml 파일을 하나 만든거다. 우리는 여러 컨테이너를 사용할꺼니까? 바로 이어서 MySQL 예시도 같이 알아보자.
version: "3.7"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
새로 생긴 부분들만 확인해보자
mysql로 했다. 마찬가지로 이게 network-alias로 지정해주니까 이름을 짓는데 신중해야한다.volumes:는 마지막에 가장 상위 레벨에 작성했는데, 여기에 하면 볼륨을 생성할 수 있다. 지금은 todo-mysql-data 이라는 Named Volume을 생성해준다.version: "3.8"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:5.7
platform: linux/amd64
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
다른점은
version 을 최신버전인 3.8로 해줬다.mysql 컨테이너를 생성할 때 앞 포스팅에서 플랫폼지정을 해줘서 여기도 해줬다.실행하려면 앱 디렉토리에 가서
docker compose up -d
그러면! 한방에 되는게 무섭긴 하지만 한방에 너무 잘 된다! 헉~ㅋㅋ -d 옵션은 백그라운드에서 계속 실행시킨다는 옵션이다
내 앱 디렉토리는 이렇다! 혹시나 이걸 따라하면서 이상하다고 뭐라고 말자
.
├── node_modules
├── Dockerfile
├── docker-compose.yml
├── package.json
├── spec
│ ├── persistence
│ └── routes
├── src
│ ├── index.js
│ ├── persistence
│ ├── routes
│ └── static
└── yarn.lock


컨테이너들을 킬 때는 docker compose up -d 으로 켰으니까, 반대로 끌 때는 docker compose down으로 끄면 된다. 그런데 만약에 볼륨을 생성했다면 --volumes 옵션을 꼭 줘야 같이 사라진다!

docker-compose.yml 로 관리되는 컨테이너들을 실행하려면 docker compose up -ddocker compose down --volumes여기까지 해서 일단 공식문서 튜토리얼 에 있는 내용을 쭉 한번 다뤘다! 9번이랑 10번은 예시들이랑 이제 뭘 더 공부해보아라~ 같은 내용이라 앞으로의 도컨살은 진짜 15GG 백엔드에 적용하면서 생기는 문제들에 대해서 포스팅 해야겠다!