Docker Compose 간편 가이드 - 예제와 함께 가장 유용한 명령어

한 가지 참고로, docker-compose는 docker compose와는 다릅니다.

Page content

다음은 제공된 Hugo 페이지 내용을 영어에서 한국어로 번역한 것입니다. 모든 Hugo 단축 코드, 기술적 요소, 구조, 포맷은 그대로 유지되었으며, 한국어의 문법, 표현, 타이포그래피에 맞게 자연스럽게 번역되었습니다.


다음은
Docker Compose 간편 가이드
으로, Compose 파일과 명령어를 빠르게 정리하고 익히는 데 도움이 되는 주석이 달린 예제입니다.

docker-compose 스키마

Compose 파일 참조: docker-compose.yml

핵심 구조:

version: '3'       # Compose 파일 형식 버전

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"   # 호스트 포트 8080: 컨테이너 포트 80
  db:
    image: postgres
    environment:            # 환경 변수
      POSTGRES_PASSWORD: example
    volumes:
      - db_data:/var/lib/postgresql/data

networks:          # 커스텀 네트워크
  appnet:
    driver: bridge

volumes:           # 네임드 볼륨
  db_data:
  • services: 다중 컨테이너 애플리케이션의 각 컨테이너입니다. 위 예제에서는 webdb 두 서비스가 있습니다.
  • networks & volumes: 고립된 네트워크와 지속 가능한 저장소를 정의합니다. 여기서는 appnet 네트워크와 db_data 볼륨이 있습니다.

예제

포트 매핑이 있는 단일 서비스

services:
  app:
    build: .
    ports:
      - "8000:80"   # 호스트 포트 8000: 컨테이너 포트 80

호스트 포트 8000에 앱을 노출하고 현재 디렉토리의 Dockerfile에서 빌드합니다.

공유 볼륨과 커스텀 네트워크가 있는 다중 서비스

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - type: bind
        source: ./app
        target: /app
    networks:
      - mynet
  db:
    image: postgres
    volumes:
      - db_data:/var/lib/postgresql/data
    networks:
      - mynet

networks:
  mynet:

volumes:
  db_data:

웹과 DB가 동일한 네트워크에 연결되어 있으며, DB는 지속 가능한 네임드 볼륨 db_data를 사용합니다.

빌드 컨텍스트와 Dockerfile 경로 사용

Dockerfile에서 지정된 docker-compose.yml 파일을 기반으로 Docker 이미지 빌드를 필요에 따라 수행할 수 있습니다.

services:
  app:
    build:
      context: .
      dockerfile: docker/MyDockerfile

서비스 간 데이터 공유

services:
  web:
    image: nginx
    volumes:
      - shared_data:/usr/share/nginx/html
  worker:
    image: myworker
    volumes:
      - shared_data:/usr/src/app/data

volumes:
  shared_data:

두 서비스 모두 동일한 볼륨 shared_data에 접근하여 정적 파일이나 데이터 교환에 사용합니다.

고급 Compose 파일 옵션

  • environment: 컨테이너에 환경 변수를 설정합니다.
  • depends_on: 서비스 시작 순서를 제어합니다.
  • deploy.replicas: Swarm 모드에서 서비스를 확장합니다.

예시:

services:
  web:
    image: nginx
    deploy:
      replicas: 3
    depends_on:
      - db

3개의 웹 인스턴스를 시작하며, 시작 순서만 제어하고 준비 상태는 제어하지 않습니다.

필수 Docker Compose 명령

명령 설명 예시 사용법
docker-compose up 컨테이너 생성 및 시작 docker-compose up
docker-compose up -d 백그라운드에서 실행 docker-compose up -d
docker-compose exec 실행 중인 컨테이너에서 명령 실행 docker-compose exec web bash
docker-compose build 이미지 빌드/재빌드 docker-compose build
docker-compose down 컨테이너, 네트워크, 볼륨, 이미지 중지 및 제거 docker-compose down
docker-compose logs -f 로그 확인 및 실시간 추적 docker-compose logs -f
docker-compose ps 실행 중인 컨테이너 목록 보기 docker-compose ps
docker-compose run Compose 파일의 명령을 우회하고 일회성 명령 실행 docker-compose run web python manage.py migrate
docker-compose stop 실행 중인 컨테이너 중지 (재시작은 start으로 가능) docker-compose stop
docker-compose restart 서비스 재시작 docker-compose restart web
docker-compose pull 서비스 이미지 끌어오기 docker-compose pull
docker-compose rm 중지된 서비스 컨테이너 제거 docker-compose rm web
docker-compose config Compose 파일 검증 및 보기 docker-compose config
docker-compose up --scale web=3 서비스의 여러 인스턴스 시작 docker-compose up --scale web=3

일반적인 Compose 패턴

  • 지속 가능한 데이터를 가진 데이터베이스

    services:
      mysql:
        image: mysql
        environment:
          MYSQL_ROOT_PASSWORD: password
        volumes:
          - mysql_data:/var/lib/mysql
    
    volumes:
      mysql_data:
    

    DB 데이터는 컨테이너 재시작 시 mysql_data 볼륨에 지속됩니다.

  • 개발을 위한 코드 바인드 마운트

    services:
      app:
        build: .
        volumes:
          - .:/app
    

    호스트에서 코드를 실시간으로 편집하면 컨테이너에 자동으로 반영됩니다.

유용한 플래그

  • -d: 백그라운드 모드 실행.
  • --build: 시작 전 이미지 강제 재빌드.
  • --force-recreate: 변경되지 않았어도 컨테이너 재생성.
  • --remove-orphans: Compose 파일에 정의되지 않은 컨테이너 제거.

서비스 정의 및 커스터마이징

docker-compose.yml 파일을 활용하여 Docker Compose에서 서비스, 네트워크, 볼륨을 정의하고 커스터마이징할 수 있습니다. 이 파일은 애플리케이션의 구성과 오케스트레이션 요구사항을 중앙 집중적으로 관리합니다.

  • 서비스services 키 아래에 정의됩니다.
  • 각 서비스는 컨테이너 구성으로, 다음을 설정할 수 있습니다:
    • Image: Docker Hub 또는 다른 레지스트리에서 이미지를 선택합니다.
    • Ports: 컨테이너 포트를 호스트 포트에 매핑합니다.
    • Environment variables: 구성 값을 전달합니다.
    • Volumes: 데이터를 지속하거나 호스트 또는 다른 서비스와 파일/폴더를 공유합니다.
    • Networks: 서비스가 접근할 수 있는 네트워크를 제어합니다.

예시:

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"   # 호스트 포트 8080: 컨테이너 포트 80
    environment:
      - NGINX_HOST=localhost
    volumes:
      - web_data:/usr/share/nginx/html
    networks:
      - frontend

  db:
    image: postgres:13
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: secret
    volumes:
      - db_data:/var/lib/postgresql/data
    networks:
      - backend
  • 여기서 web 서비스는 nginx 이미지를 사용하고 환경 변수를 설정하며 볼륨을 연결하고 호스트의 8080 포트로 컨테이너의 80 포트를 열고 frontend 네트워크에 연결합니다. db 서비스는 PostgreSQL에 대해 유사한 작업을 수행합니다.

네트워크 커스터마이징

  • 네트워크는 서비스 간 통신을 제어합니다. Compose는 기본 네트워크를 생성하지만, 더 많은 네트워크를 정의하고, 커스텀 드라이버를 지정하고, 옵션을 설정하고, 서비스가 어떤 네트워크에 연결되는지 결정하여 세부적인 고립을 달성할 수 있습니다.
  • 네트워크는 최상위 networks 아래에서 정의하고, 서비스 수준의 networks 키를 통해 서비스가 연결되어야 할 네트워크를 나열합니다.

예시:

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
  • 네트워크를 서비스에 연결:
services:
  app:
    networks:
      - frontend
      - backend
  db:
    networks:
      - backend
  • 이 설정은 app 서비스가 frontendbackend 네트워크 모두에 접근할 수 있도록 하며, db 서비스는 backend 네트워크 내부에서만 접근 가능하도록 합니다.

볼륨 커스터마이징

  • 볼륨은 최상위 volumes 키 아래에서 정의됩니다. 서비스 아래의 volumes 키를 사용하여 컨테이너에 마운트합니다.
  • 볼륨은 이름을 가질 수 있고, 커스텀 드라이버를 사용할 수 있으며, 여러 서비스 간 데이터 지속성 및 공유를 위해 사용할 수 있습니다.

예시:

volumes:
  web_data:                # 웹 콘텐츠를 위한 네임드 볼륨
  db_data:                 # 데이터베이스를 위한 네임드 볼륨

services:
  web:
    volumes:
      - web_data:/usr/share/nginx/html

  db:
    volumes:
      - db_data:/var/lib/postgresql/data
  • 이 예시에서 web_data는 마운트된 컨테이너에 지속되어 사용 가능합니다. db_data는 컨테이너 재생성 시에도 데이터가 손실되지 않도록 보장합니다.
  • 고급 사례를 위해 커스텀 드라이버 옵션을 사용한 바인드 마운트를 정의할 수 있습니다:
volumes:
  db_data:
    driver: local
    driver_opts:
      type: none
      device: /data/db_data
      o: bind
  • 이 설정은 호스트 경로 /data/db_data를 컨테이너에 바인드 마운트합니다.

최선의 실천 요약:

  • 서비스 간 통신을 위해 서비스 이름을 DNS 호스트 이름으로 사용합니다.
  • 필요한 경우 서비스를 여러 네트워크에 연결하여 접근을 제어합니다.
  • 지속 가능한 저장소와 데이터 공유를 위해 네임드 볼륨을 사용합니다.
  • YAML을 사용하여 모든 것을 정의함으로써 버전 관리 및 쉽게 배포 스크립트를 사용할 수 있습니다.

여러 Compose 파일 사용

복잡한 다중 서비스 설정을 정리하기 위해 Docker Compose에서 여러 Compose 파일과 오버라이드 파일을 사용할 수 있습니다. 이는 모듈화된, 환경별, 확장 가능한 구성이 가능하게 합니다. 이는 어떻게 작동하는지 아래에 설명합니다:

  1. 기본 및 오버라이드 파일 구조
  • 기본 파일(compose.yaml 또는 docker-compose.yml)을 생성하여 모든 공통, 기본 서비스 정의를 포함합니다.
  • 환경별 오버라이드 파일(docker-compose.override.yml, docker-compose.dev.yml, docker-compose.prod.yml)을 추가합니다.

예시 파일 구조:

/project-directory
|-- docker-compose.yml           # 기본 구성
|-- docker-compose.override.yml  # 로컬/개발 오버라이드 (자동으로 적용됨)
|-- docker-compose.prod.yml      # 프로덕션 오버라이드
|-- docker-compose.test.yml      # 테스트 오버라이드 (필요 시)

기본 구성은 핵심 서비스를 정의하고, 각 오버라이드는 특정 환경 또는 사례에 맞는 설정을 커스터마이징합니다.

  1. 파일 오버라이드 작동 방식
  • 병합: docker compose up을 실행할 때 Docker Compose는 기본 파일과 오버라이드 파일을 순서에 따라 병합합니다. 이후 파일은 이전 파일의 설정을 덮어쓰거나 확장하거나 추가할 수 있습니다.
  • 필드 오버라이드: 여러 파일에서 서비스나 필드가 정의된 경우, 마지막에 지정된 파일의 값이 사용됩니다. 새 필드는 추가됩니다.

예시 병합:

  • docker-compose.yml:
    services:
      web:
        image: myapp
        ports:
          - "8000:80"
    
  • docker-compose.override.yml:
    services:
      web:
        environment:
          - DEBUG=true
    
  • 결과: web 서비스는 기본 이미지와 포트에 더하여 오버라이드된 DEBUG 환경 변수를 사용합니다.
  1. 여러 파일 사용 시 명령어
  • 기본 동작: 존재하는 경우, docker compose up을 실행할 때 docker-compose.override.yml이 자동으로 docker-compose.yml과 함께 로드됩니다.
  • 수동 파일 지정: -f 플래그를 사용하여 병합할 파일과 순서를 제어할 수 있습니다:
    docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
    
    • 이 명령은 기본 오버라이드를 무시하고 프로덕션 설정을 사용합니다.
  1. 실용적인 조직 전략
  • 환경 분리: 개발, 테스트, 프로덕션 등 환경별로 하나의 오버라이드 파일을 사용합니다.
  • 마이크로서비스 및 팀: 다른 서비스나 팀별로 구성 파일을 분리하고 필요에 따라 결합합니다.
  • 기능 토글: 임시 요구사항(예: compose.debug.yml으로 추가 로깅)을 위한 추가 파일을 사용할 수 있습니다.
  1. 장점
  • 명확성: 개별 파일이 작고 초점이 맞춰져 있습니다.
  • 확장성: 새로운 서비스, 환경, 설정을 쉽게 추가할 수 있습니다.
  • 유지보수성: 특정 배포에 필요한 섹션만 변경하거나 검토할 수 있습니다.
  1. 예시: 환경 전환

개발:

docker compose -f docker-compose.yml -f docker-compose.dev.yml up

프로덕션:

docker compose -f docker.docker-compose.yml -f docker-compose.prod.yml up -d

각 환경은 필요한 구성만 받고, 공통 구성은 기본 파일에 있습니다.

복잡한 Compose 설정을 여러 파일로 구성하고 오버라이드/병합 시스템을 활용함으로써, 대규모 다중 서비스 Docker 애플리케이션에 모듈화, 환경별 커스터마이징, 쉽게 확장이 가능해집니다.

유용한 링크