Photo by Rubaitul Azad on Unsplash
—network 설정을 통해서 다중 컨테이너 사용이 가능하다. 그러나 일일히 네트워크 설정을 해가며 컨테이너를 하나씩 띄워야 한다는 번거로움이 있다.
다중 컨테이너 설정을 더 쉽게 만들기 위해서 도커 컴포즈를 제공한다.
도커 컴포즈는
더 알아야 할 것들
docker-compose.yaml
# 버전을 명시하는 것으로 시작한다.
# 코드의 버전이 아니고 도커 컴포즈의 버전이다.
version: "3.8"
# 컨테이너들을 명시하기 위한 명령어
services:
# 원하는 컨테이너 이름을 만들어준다. 강의에서는 몽고디비, 백엔드 프론트엔드로 나누었다,
mongodb:
# 몽고db라는 컨테이너에서 사용할 이미지 이름을 적어준다.
image: 'mongo'
# -v 태그로 볼륨을 선언했던 것과 같은 값을 넣어주면 된다.
# 아래와 같이 -로 구분하여 여러개의 볼륨을 선언할 수도 있다.
volumes:
- data:/data/db
environment:
# 아래와 같이 환경변수를 설정할 수도 있고
MONGO_INITDB_ROOT_USERNAME: root
# 아래와 같이 설정할 수도 있다.
- MONGO_INITDB_ROOT_USERNAME=root
# env파일을 명시해줄 수도 있다.
env_file:
- ./env/mongo.env
# networks를 통해서 네트워크를 설정할 수 있으나 services내에 있는 컨테이너는
# 도커가 알아서 네트워크로 묶어준다.
networks:
backend:
# 이미지를 가져오는 것도 가능하지만 직접 작성한 dockerfile을 통해 빌드도 가능하다.
# 빌드 명령어와 도커파일이 있는 위치를 명시해주면 이미지를 빌드할 수 있다.
build: ./backend
# 도커파일의 이름이 다를 경우 아래와 같이 빌드할 수 있다.
build:
context: ./backend
dockerfile: Dockerfile
# 아래와 같이 아규먼트 값도 넣어줄 수 있다.
args:
some-arg:1
ports:
- '80:80'
volumes:
- logs:/app/logs
- ./backend:/app
- /app/node_modules
env_files:
- ./env/backend.env
# 한 컨테이너가 다른 컨테이너에 의존할 수가 있다. 이 이 yaml파일을 예로들면 백엔드는 mongodb에 의존한다.
depends_on:
- mongodb
frontend:
build: ./frontend
ports:
- '3000:3000'
volumes:
- ./frontend/src:/app/src
# 리액트의 특성상 docker run에 -it 태그를 추가해주어야 하는데 이 it 모드는 아래와 같이 추가해줄 수 있다.
stdin_open: true
tty: true
depends_on:
- backend
# 서비스 안쪽이 아닌 서비스 아래쪽 인덴트에 named volume을 명시해주어야 한다.
volumes:
# 콜론 뒤에 무언가 적어줄 필요는 없다. 도커가 named volume을 인식할 수 있게 하는 구문이다.
data:
logs:
# 컴포즈 파일에서 찾을 수 있는 모든 서비스가 한꺼번에 시작된다.
# -d 태그를 통해서 디태치 모드로 서비스를 시작할 수 있다.
# --build 태그를 추가해주면 이미지 리빌드를 강제로 실행할 수 있다.
docker-compose up
# 모든 컨테이너가 삭제되고 생성된 디폴트 네트워크가 종료된다.
# -v 태그를 추가해서 볼륨도 삭제해줄 수 있다.
docker-compose down