노트

Docker Compose

Docker Compose

인프라#docker · 연결된 개념 7개

쉽게 말하면

Docker Compose는 밴드 공연의 큐시트 같아요. 앱, DB 같은 컨테이너마다 길게 쳐야 했던 실행 옵션을 파일 하나에 적어 두면, 명령 하나로 다 같이 무대에 올리고 내릴 수 있어요.

비유가 깨지는 곳 큐시트에 'DB 다음 앱'이라 적어도 DB가 연주할 준비가 됐는지는 몰라요. depends_on은 시작 순서만 보장하니 healthcheck와 condition: service_healthy를 함께 쓰거나 앱이 재시도하게 해요.

Docker Compose는 여러 컨테이너로 이뤄진 앱 스택을 YAML 파일 하나로 정의하고, 명령 하나로 띄우고 내리는 도구다. 길어지는 docker run 옵션을 선언형 파일로 옮긴 것이라 보면 된다.

# compose.yaml
services:
  app:
    image: node:22-alpine
    command: sh -c "npm install && npm run dev"
    working_dir: /app
    ports: ["3000:3000"]
    volumes: ["./:/app"]
    environment:
      DB_HOST: db
    depends_on: [db]
  db:
    image: postgres:17
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    volumes: ["pgdata:/var/lib/postgresql/data"]
    secrets: [db_password]
volumes:
  pgdata:
secrets:
  db_password:
    file: ./db_password.txt
docker compose up -d        # 네트워크까지 자동 생성
docker compose logs -f app  # 서비스 로그를 한 스트림으로
docker compose down         # 컨테이너·네트워크 제거(볼륨은 남김, -v면 삭제)
  • 서비스 이름이 네트워크 별칭이 되어 db로 접속한다(컨테이너 네트워킹)
  • named volume은 최상위 volumes에 선언해야 한다(도커 볼륨과 바인드 마운트)
  • depends_on은 시작 순서만 보장하고 DB가 접속을 받을 준비가 됐는지는 보장하지 않는다. healthcheck와 condition: service_healthy를 함께 쓰거나 앱이 재시도하게 한다
  • 예전 문서의 version: 키와 docker-compose(하이픈) 명령은 구식이다. 지금은 docker compose 플러그인을 쓴다(2026 기준)

비밀값

environment에 비밀번호를 직접 쓰면 파일과 docker inspect에 그대로 남는다. 개발용이 아니라면 secrets로 파일을 마운트하고, 공식 이미지가 지원하는 *_FILE 변수로 읽는다.

선언한 상태를 맞춰 준다는 점에서 쿠버네티스 핵심 개념의 축소판이고, 운영 매니페스트를 git에서 읽어 로컬 compose를 만드는 식으로 GitOps와 엮기도 한다. 선언형 사고방식 자체는 선언형과 명령형 프로그래밍을 본다.

출처: Compose 애플리케이션 모델 · Compose 네트워킹 · 시작 순서 제어 · Compose에서 secrets 쓰기

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • Dockerfile: 레이어 캐시와 멀티 스테이지

    Dockerfile은 이미지를 만드는 명령을 순서대로 적은 파일이다. 파일시스템을 바꾸는 명령(RUN·COPY·ADD)이 각각 레이어(layer)가 되고, 바뀌지 않은 레이어는 캐시를 재사용한다. 그래서 자주 바뀌는 것을 뒤에 두는 순서가 빌드 속도를 좌우한다.

  • GitLab CI/CD 파이프라인

    GitLab CI/CD(Continuous Integration/Continuous Delivery)는 저장소 루트의 .gitlab-ci.yml에 적은 파이프라인을 커밋·머지 때마다 실행하는 기능이다. 실제 작업은 GitLab 서버가 아니라 따로 등록한 러너(runner)가 수행한다.

  • kubectl 디버깅 치트시트

    kubectl은 쿠버네티스 클러스터를 조회·조작하는 CLI(Command-Line Interface)다. 앱 개발자가 가장 자주 쓰는 건 "내 Pod가 떠 있나, 왜 죽었나"를 확인하는 명령들이다.

  • 모노레포

    모노레포는 여러 프로젝트·패키지를 하나의 저장소에 폴더로 나눠 함께 관리하는 방식이다. 프로젝트마다 저장소를 따로 두는 방식은 멀티레포(폴리레포)라고 부른다. 모노레포가 곧 하나의 거대한 앱(모놀리스, monolith)이라는 뜻은 아니다. 배포 단위는 여전히 따로일 수 있다.

  • IaaS·PaaS·SaaS

    클라우드 서비스를 "어디까지 빌려 쓰고 어디부터 내가 관리하나"로 나눈 구분이다. 아래로 갈수록 내가 관리할 것이 줄어든다.

보기 옵션