도커 컴포즈는 다중 컨테이너 설정을 손쉽게 하는 도구이다.
docker build , docker run 명령을 대체할 수 있다.
도커 컴포즈에선 다중 컨테이너 하나하나를 서비스 라고 부른다.
서비스가 사용할 포트, 환경변수, 볼륨, 네트워크 를 지정할 수 있다. 이는 도커 명령어로 가능하다.
version: '3.8'
services:
mongodb:
image: 'mongo'
volumes:
- data:/data/db
environment:
- MONGO_INITDB_ROOT_USERNAME=max
- MONGO_INITDB_ROOT_PASSWORD=secret
# env_file:
# - ./env/mongo.env
# networks:
# - goals-net
backend:
build: ./backend
# build:
# context: ./backend
# dockerfile: Dockerfile
# args:
# - name=value
ports:
- "80:80"
volumes:
- logs:/app/logs
- ./backend:/app
- /app/node_modules
env_file:
- ./env/backend.env
depends_on:
- mongodb
frontend:
build: ./frontend
ports:
- "3000:3000"
volumes:
- ./frontend/src:/app/src
stdin_open: true # -i 를 의미
tty: true # -t 를 의미
depends_on:
- backend
# 뵬륨의 key를 다시 명시하는 이유는 명명된 볼륨을 식별하기 위함
volumes:
data:
logs:
도커 컴포즈는 서비스들을 default로 --rm 를 사용한다.
(도커 컴포즈 자체는 attached 모드로 작동한다.)
그리고 도커 컴포즈를 사용하면 특정된 모든 서비스에 대해 새 환경을 자동으로 생성하고 그 네트워크로 묶는다.
docker-compose up -d
으로 dettach 모드로 시작하고 docker-compose down
으로 중지할 수 있다. (이때 명명된 볼륨은 살아있게 되는데 이를 삭제하려면 docker-compose down -v
를 사용하면 볼륨까지 깨끗하게 삭제할 수 있다.)
backend 의 경우 우리가 빌드한 이미지로 도커 컴포즈를 구성해야 한다.
build의 value로 도커파일이 있는 곳으로 지정하거나 더 길게 작성할 수 있다.
context 는 도커파일을 보고 이미지를 빌드하는데 필요한 파일이 존재하는 디렉토리를 의미한다.
depends_on
는 도커컴포즈에만 있는 명령이다. 도커 컴포즈는 동시에 여러 컨테이너가 생성되는데 이때 순서가 필요한 경우 사용한다.
도커컴포즈는 이미지가 존재한다면 이미지를 재사용한다. 만약 build를 강제하고 싶다면 docker-compose build
나 docker-compose up --build
를 사용하면 된다.