Docker Compose

2023년 7월 9일 수정

Docker Compose(도커 컴포즈)는 Docker 컨테이너를 띄우는 명령을 스크립트로 명시해서 좀 더 쉽게 컨테이너를 띄우거나 다수의 컨테이너를 한 번에 띄울 수 있도록 도와주는 도구이다. Dockerfile을 이용해 이미지를 필요할 때 자동으로 빌드 할 수도 있다.

개인적으로 개발 환경에서 자주 사용한다. 서버와 비슷한 상황을 로컬에 구현해 두고 도커로 테스트할 때 편하다.

명세 파일은 docker-compose.yml 이라는 이름을 YAML 기반의 DSL을 사용한다.

파일 이름은 물론 마음대로 지어도 상관은 없지만 파일 이름이 다르면 커맨드가 좀 더 길어진다는 단점이 있다.

명령어 예제

docker-compose up
모든 서비스를 실행한다. Ctrl-C 키로 종료시킬 수 있다.
docker-compose up -d
데몬 모드(백그라운드)로 모든 서비스를 실행시킨다.
docker-compose -f some-docker-compose-file.yml up
명세 파일 이름으로 특정 파일 이름(위 예에서는 some-docker-compose-file.yml)을 사용해 서비스를 올린다.
docker-compose down
모든 중지된 서비스를 내린다.
docker-compose exec service_name command
특정 실행 중인 컨테이너에서 특정 커맨드를 실행시킨다.
docker-compose run service_name command
특정 서비스 컨테이너를 특정 커맨드로 실행시킨다. 컨테이너가 새로 생성되는 점이 exec 명령어와 다르다.
docker-compose restart service_name
특정 서비스를 재시작한다. 서비스 이름을 지정하지 않을 경우 모든 서비스를 재시작한다.

참고로 이제는 docker-compose가 docker에 편입되어서 별도 설치가 필요 없고 docker-compose 대신 docker compose 명령도 쓸 수도 있다.

명세 파일 예제

version: '3'
services:
  mongo:
    image: mongo
    container_name: mongo
    ports:
      - "27017:27017"
    environment:
      - MONGO_DATA_DIR=/data/db
    volumes:
      - /tmp/mongo:/data/db
  redis:
    image: redis
    container_name: redis
    ports:
      - "6379:6379"
  app:
    build:
      context: .
      dockerfile: ./app-dockerfile
    container_name: app
    depends_on:
      - "redis"
      - "mongo"
    volumes:
      - ./:/tmp/app
      - /tmp/appdata:/tmp/appdata

이 예제는 3 버전 스펙에 맞는 Docker Compose 파일이다. 그리고 mongo, redis, app 이라는 3개의 서비스로 구성되어 있다.

mongo 서비스는 mongo 라는 이미지를 통해 실행되는 컨테이너다. 내부 27017 포트는 외부 27017 포트로 연결한다. 환경변수로 MONGO_DATE_DIR 을 정의하고 있다. 그리고 내 컴퓨터의 /tmp/mongo 디렉터리는 컨테이너 내부에서 /data/db 라는 이름의 디렉터리로 공유한다.

redis 서비스는 redis 라는 이미지를 통해 실행되는 컨테이너다. 이 컨테이너 내부의 6379 포트는 내 컴퓨터의 6379 포트와 연결된다.

app이라는 서비스는 별도로 작성된 app-dockerfile 이라는 도커 명세로 빌드 하는 이미지로 구동 된다. 이 컨테이너는 redis와 mongo가 먼저 실행된 후에 실행된다. 공유 볼륨으로 현재 디렉터리(즉 프로젝트 디렉터리)는 /tmp/app 디렉토리와 공유되고, 내 컴퓨터의 /tmp/appdata 디렉터리는 컨테이너 내부의 /tmp/appdata 라는 똑같은 이름으로 공유된다.

이렇게 3개의 서비스를 하나의 Docker Compose 파일을 통해 구동할 수 있다. 심지어 많은 명령을 입력할 필요 없이 그저 아래 커맨드 하나면 손쉽게 컨테이너들이 구동 된다.

docker-compose up