Logo

Docker Compose 설정 방법

Docker Compose를 이용하면 여러 개의 컨테이너(container)로 구성된 애플리케이션을 하나의 파일에 정의해놓고 한 번에 올리거나 내릴 수 있습니다. 이러한 편리함 때문에 Docker Compose는 특히 로컬 개발 환경이나 테스트 자동화 환경에서 간단한 컨테이너 오케스트레이션(Container Orchestration) 도구로 많이 사용되고 있는데요. 이번 포스팅에서는 Docker Compose 설정에 사용되는 docker-compose.yml을 작성하는 방법에 대해서 알아보겠습니다.

파일 위치 / 기본 구조

Docker Compose는 기본적으로 docker-compose.yml 파일을 설정 파일로 사용하는데 일반적으로 프로젝트의 최상위 디렉토리에 위치시킵니다. 그래야지 개발자이 프로젝트에 디렉토리에 들어오자 마자 손쉽게 애플리케이션을 올릴 수 있기 때문입니다.

docker-compose.yml 파일은 대략적으로 다음과 같은 구조를 갖습니다.

version: "3.5"
services:
  web:
    # 웹 애플리케이션 설정
  db:
    # 데이터베이스 설정
networks:
  # 네트워크 설정
volumes:
  # 볼륨 설정

맨 위에 Docker Compose 규격의 어떤 버전을 사용하는지 명시하고, 그 아래에 각각 서비스, 네트워크, 볼륨 영역에 대한 설정을 할 수 있습니다. 본 포스팅에서는 가장 많이 사용되는 서비스 영역에 대해서만 다룰 예정이며, 네트워크와 볼륨 영역에 대해서는 추후 기회가 되면 다뤄보도록 하겠습니다.

Docker Compose에서 서비스는 독립된 컨테이너에서 돌아가는 애플리케이션의 구성 요소라고 생각하면 됩니다. 가장 먼저 프로젝트에서 개발하고 있는 애플리케이션 자체가 서비스가 될 것이고, 그 밖에 해당 애플리케이션이 의존하는 데이터베이스나 캐시 등도 서비스가 될 수 있습니다. 쉽게 말해, 메인 애플리케이션 뿐만 아니라 정상적으로 구동되기 위해서 필요한 기반 시스템까지 Docker Compose로 설정한다고 보시면 됩니다. 그렇게 때문에 로컬에 별도로 데이터베이스를 셋업하는 등의 추가 작업이 필요없이 바로 Docker Compose 커맨드 하나로 애플리케이션을 올릴 수 있는 것이지요.

build

build 항목은 해당 서비스의 이미지를 빌드하기 위한 Dockerfile이 위치하는 경로를 지정하기 위해 사용됩니다. 예를 들어, docker-compose.yml 파일과 동일한 디렉토리에 위치한 Dockerfile을 사용해서 web 서비스의 이미지를 빌드하려면 다음과 같이 설정합니다.

services:
  web:
    build: .

Dockerfile이 아닌 다른 이름의 파일로 빌드를 하고 싶거나, 빌드 인자를 넘겨야 하는 경우에는 다음과 같이 하위 항목을 사용해서 좀 더 구체적으로 설정을 해줄 수 있습니다.

services:
  web:
    build:
      context: ./app
      dockerfile: Dockerfile-dev
      args:
        env: "development"

image

프로젝트에서 직접 개발하지 않는 데이터베이스나 캐시와 같은 경우에는 이미지를 직접 빌드하는 대신에 이미지 저장소(repository)로 부터 이미지를 내려받아서 사용하는 것이 일반적입니다.

build 항목은 이미지 저장소로 부터 내려받을 이미지의 이름과 태그를 명시하는데 사용됩니다.

services:
  db:
    image: postgres:13
  cache:
    image: redis

ports

ports 항목은 외부로 노출시킬 포트의 맵핑을 명시합니다. 바인드(bind)가 필요한 호스트 외부 포트와 컨테이너 내부 포트를 지정해주면 됩니다.

services:
  web:
    ports:
      - "8000:8000"
  db:
    ports:
      - "5432:5432"

volumes

volumes 항목은 볼륨 설정을 위해 쓰입니다. 마운트(mount)가 필요한 호스트의 경로와 컨테이너의 경로를 명시해주면 됩니다.

services:
  web:
    volumes:
      - .:/web

depends_on

depends_on 항목은 서비스 간 의존 관계를 지정하기 위해서 사용됩니다. 예를 들어, 웹 애플리케이션이 올라오기 전에 데이터베이스가 먼저 올라와야 한다면 다음과 같이 설정합니다.

services:
  web:
    depends_on:
      - db

command

command 항목은 해당 서비스가 올라올 때 DockerfileCMD 명령문을 무시하고 실행할 명령어를 설정하기 위해서 사용됩니다.

services:
  web:
    command: node .

environment

environment 항목은 환경 변수를 설정하기 위해서 사용됩니다.

environment:
  - POSTGRES_USER=postgres
  - POSTGRES_PASSWORD=postgres

마치면서

이상으로 docker-compose.yml 파일을 작성할 때 자주 사용되는 설정 항목들에 대해서 살펴보았습니다. Docker Compose 이 밖에도 상당히 많은 설정 항목을 가지고 있는데요. 추가로 설정이 필요한 부분은 Docker 공식 레퍼런스를 참고 바랍니다.