데브옵스/Docker

[Docker] docker-compose.yml 작성하기

SparkIT 2025. 4. 16. 20:04

도커 컴포즈는 여러 개의 컨테이너를 하나의 docker-compose.yml이라는 설정 파일을 이용해 관리할 수 있게하는 서비스입니다. 저는 개인적으로 도커 컴포즈를 활용해 어플리케이션 컨테이너, 데이터베이스 컨테이너 등을 묶어 한 번에 실행시키며 개발을 진행합니다. 이를 통해 빠른 개발이 가능해집니다.

 

최상단 프로퍼티 종류

docker.compose.yml 파일에 작성해야할 프로퍼티는 다음과 같습니다.

 

version

해당 프로퍼티는 예전에 사용되던 프로퍼티로 도커 컴포즈 버전을 명시하도록 되어있었습니다. 하지만 현재는 해당 프로퍼티가 삭제되어 작성하면 에러가 발생합니다. 현재는 필요 없는 프로퍼티입니다.

 

Version and name top-level elements

Understand when and if to set the version and name top-level element

docs.docker.com

 

name

기본적으로 도커 컴포즈는 묶어서 실행되는 컨테이너들을 하나의 프로젝트명으로 모아둡니다. 이때 사용되는 프로젝트명은 해당 도커 컴포즈 yaml 파일이 위치한 디렉토리명입니다. 이를 사용하기 싫고 "내가 직접 프로젝트명을 짓겠다!"라는 생각을 가지고 있다면 해당 name 프로퍼티를 통해 설정하면 됩니다.

myapp 이라는 프로젝트명을 사용하는 예시

name: myapp

services:
  foo:
    image: busybox
    command: echo "I'm running ${COMPOSE_PROJECT_NAME}"

 

 services

컴포즈 파일에서 가장 핵심인 부분입니다. 서비스들(컨테이너들)을 컴포즈 파일에 나열하기 시작함을 표시하는 프로퍼티입니다. 해당 프로퍼티 하위에 여러 서비스들을 작성하시면 됩니다.

services:
    1번서비스:
        ...
    2번서비스:
        ...
    3번서비스:
        ...

 

각 서비스 하위에 작성해야할 속성 종류는 굉장히 많습니다. 이때 제가 자주 사용하는 속성 몇 개를 소개하겠습니다.

  • #️⃣ container_name

컨테이너명 직접 명시하기

더보기

도커 컴포즈 V2에서는 디폴트로 컨테이너명을 다음과 같이 지어줍니다. `{프로젝트명}-{서비스명}-{번호}`. 이때 번호는 스케일링을 사용해 여러개 띄울 때 구분하기 위한 용도입니다. auto_increment되는 PK값이라고 생각하시면됩니다. 이때 이런 컨테이너명이 마음에 들지 않을 경우 직접 명시해 수정할 수 있습니다.

services:
  web:
    container_name: my-web-container
  • #️⃣ image

컨테이너에 사용할 도커 이미지 명시하기

더보기

컨테이너에 사용할 도커 이미지를 명시합니다. 이때 먼저 로컬에 존재하는 도커 이미지를 조회해 만약 조건에 부합하는 도커 이미지가 존재할 경우 해당 이미지를 사용해 컨테이너를 띄웁니다. 로컬에 해당 도커 이미지가 존재하지 않을 경우는 pull_policy 속성에 따라 처리가 진행됩니다. pull_policy 설정을 따로 하지 않았다면 도커 허브에서 도커 이미지를 pull 받은 후 컨테이너를 띄웁니다.

services:
  redis:
    image: redis
  • #️⃣ build

도커 파일을 이용해 도커 이미지 만들 때 관련 설정 명시하기

더보기

build 속성 하위에도 여러 속성이 존재합니다. 이때 가장 많이 쓰는 속성 2가지는 다음과 같습니다.

  • context : 도커파일 경로
  • dockerfile : 도커파일명
services:
  web:
    build:
      context: ./
      dockerfile: Dockerfile_1
  • #️⃣ ports

컨테이너 포트 관련 설정

더보기

단순히 컨테이너 포트 몇 개를 열 수도 있고, 특정 범위의 포트를 여러 개 열 수도 있습니다. 또한 컨테이너 포트와 호스트 포트를 매핑할 수도 있습니다. 호스트와 포트 매핑하는 경우 전자가 호스트 포트, 후자가 컨테이너 포트입니다.

services:
  web:
    ports:
      - "3000" // 특정 포트 열기
      - "3000-3005" // 범위로 포트 열기
      - "8000:8000" // 호스트-컨테이너 포트 매핑하기
  • #️⃣ volumes

호스트 경로 마운트 관련 설정

더보기

볼륨 옵션을 사용하면 호스트 특정 디렉토리 경로를 컨테이너 내부에 마운트할 수 있습니다. 혹은 도커 자체의 볼륨을 만든 후 이를 컨테이너 내부에 마운트하는 것도 가능합니다. 

services:
  web:
    volumes:
      - 호스트경로:컨테이너경로
  • #️⃣ environment

컨테이너 내부 환경변수 설정

더보기

컨테이너 내부에서 사용할 환경변수를 직접 선언합니다. 선언 방식은 두 가지 방법이 존재합니다. 

Map syntax:

services:
  web:
    environment:
      RACK_ENV: development
      SHOW: "true"
      USER_INPUT:

Array syntax:

services:
  web:
    environment:
      - RACK_ENV=development
      - SHOW=true
      - USER_INPUT
  • #️⃣ depends_on

컨테이너간 의존성 설정

더보기

A 컨테이너가 B 컨테이너보다 먼저 실행되면 문제가 되는 상황이 발생할 수 있습니다. 이런 의존성을 depends_on을 통해 설정할 수 있습니다. 아래는 redis와 db 컨테이너가 먼저 실행되어야 그 다음에 web 컨테이너가 실행되도록 설정한 예시입니다.

services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres
  • #️⃣ restart

컨테이너 재시작 옵션 설정

더보기

컨테이너가 종료되었을 때 어떻게 할 지 정하는 옵션입니다. 옵션 종륜는 다음과 같습니다.

services:
  web:
    restart: "no"
    // restart: always
    // restart: on-failure
    // restart: on-failure:3
    // restart: unless-stopped
  • #️⃣ tty

가상 터미널 할당(도커 컨테이너 실행 명령어 중 -t 옵션과 동일)

더보기

터미널 환경을 통해 콘솔에서 사람이 보기 좋게 인터렉션 가능하게 해주는 역할입니다.

services:
  web:
    tty: true
  • #️⃣ stdin_open

입력 표준 열기(도커 컨테이너 실행 명령어 중 -i 옵션과 동일)

더보기

컨테이너 안에서 명령어를 직접 입력할 수 있도록 입력 스트림을 유지하는 옵션입니다.

services:
  web:
    stdin_open: true

 

 

✅ networks

서비스(컨테이너) 끼리 연결되는 네트워크를 설정하는 프로퍼티입니다. 도커 컴포즈에서 서비스에 추가적인 네트워크 설정을 명시하지 않을 경우 디폴트 네트워크가 적용됩니다. 디폴트 네트워크는 해당 컴포즈 내의 서비스들이 기본적으로 연결되는 네트워크입니다.

하지만 이때 컨테이너간 네트워크를 커스터마이징하고 싶을 수 있습니다. 이때는 아래와 같은 방식으로 설정합니다. 간단한 예제입니다.

services:
  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
    # Specify driver options
    driver: bridge
    driver_opts:
      com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
  backend:
    # Use a custom driver
    driver: custom-driver

 

✅ volumes

볼륨 설정 시 호스트 경로를 마운트할 수도 있지만 도커 자체의 볼륨을 만든 후 해당 볼륨을 마운트할 수 도 있습니다. 이때 생성할 볼륨들을 설정하는 프로퍼티입니다. 간단한 예제입니다.

services:
  backend:
    image: example/database
    volumes:
      - db-data:/etc/data

  backup:
    image: backup-service
    volumes:
      - db-data:/var/lib/backup/data

volumes:
  db-data:

 

✅ configs

 

Configs top-level elements

Explore all the attributes the configs top-level element can have.

docs.docker.com

 

 

✅ secrets

 

Secrets top-level elements

Explore all the attributes the secrets top-level element can have.

docs.docker.com