docker compose?

  • 다중 컨테이너 애플리케이션을 정의하고 실행하는 도구
  • 전체 애플리케이션 스택의 제어를 간소화하여 서비스, 네트워크 및 볼륨을 이해하기 쉬운 단일 YAML 구성 파일로 쉽게 관리
  • 단일 명령으로 구성 파일에서 모든 서비스를 생성하고 시작

 

docker compose 파일 

  • 사용하는 컴포즈 파일 : 현재 작업 디렉터리에 있는 다음의 파일 사용 
    • compose.yaml (권장) / compose.yml 
    • docker-compose.yaml / docker-compose.yml

 

 

compose.yaml 파일 구성  

  • services: 여러 서비스를 정의 (이름을 string으로)
    •  서비스 이름과 각 서비스 컨테이너에 적용되는 구성이 포함
  • build: 소스에서 컨테이너 이미지를 생성하기 위한 빌드 구성을 지정
  • ports: 호스트 머신과 컨테이너 간의 포트 매핑을 정의
  • image: 컨테이너를 시작할 이미지를 지정
  • environment: 컨테이너에 설정된 환경 변수를 정의
  • volumes: 서비스 컨테이너가 액세스할 수 있는 마운트 호스트 경로 또는 명명된 볼륨을 정의
  • network: 서비스 컨테이너가 연결되는 네트워크를 정의
  • depends_on: 서비스 시작 및 종료 순서를 제어
  • driver_opts: 드라이버에 전달할 키-값 쌍 형태의 옵션 목록을 지정
  • command: 컨테이너 이미지에서 선언된 기본 명령을 재정의
  • restart: 컨테이너 종료 시 플랫폼이 적용하는 정책을 정의
    • restart options :
      • "no": (기본값) 재시작하지 않음
      • always: 컨테이너가 제거될 때까지 항상 컨테이너를 다시 시작
      • on-failure[:max-retries]: 종료 코드가 오류를 나타내는 경우 컨테이너를 다시 시작. [선택적으로 Docker 데몬의 재시작 재시도 횟수를 제한]
      • unless-stopped: 종료 코드와 관계없이 컨테이너를 다시 시작, 서비스가 중지되거나 제거되면 다시 시작을 중지
  • configs: Docker 이미지를 다시 빌드할 필요 없이 서비스가 동작을 조정할 수 있도록 함
  • secrets: 민감한 데이터에 대한 접근 권한을 서비스별로 부여

 

예시 

# compose.yaml

services:
  frontend:
    image: example/webapp
    ports:
      - "443:8043"
    networks:
      - front-tier
      - back-tier
    configs:
      - httpd-config
    secrets:
      - server-certificate

  backend:
    image: example/database
    volumes:
      - db-data:/etc/data
    networks:
      - back-tier

volumes:
  db-data:
    driver: flocker
    driver_opts:
      size: "10GiB"

configs:
  httpd-config:
    external: true

secrets:
  server-certificate:
    external: true

networks:
  # The presence of these objects is sufficient to define them
  front-tier: {}
  back-tier: {}
    • services: 컨테이너로 실행될 서비스 정의
      • frontend 
        • image: example/webapp 이미지를 기반으로 컨테이너 실행
        • ports: 호스트의 443 포트를 컨테이너의 8043 포트에 매핑 (HTTPS 사용 목적)
        • networks: front-tier, back-tier 네트워크에 연결
        • configs: 외부에서 정의된 httpd-config 설정을 주입
        • secrets: server-certificate라는 외부 비밀 데이터를 주입 (보통 SSL 인증서)
        • => frontend 서비스는 웹 서버 역할을 하며 HTTPS 통신을 위한 인증서와 설정 파일이 필요하고, backend와도 통신해야 하므로 두 네트워크에 모두 연결됨 
      • backend
        • image: example/database 이미지를 기반으로 실행
        • volumes: db-data 볼륨을 /etc/data에 마운트
        • networks: back-tier 네트워크에만 연결
        • => backend는 데이터 저장 역할을 하며, db-data 볼륨을 통해 데이터를 유지. frontend와만 통신 가능하도록 back-tier만 연결.
    • volumes: 서비스에 마운트할 외부 스토리지 설정
      • db-data: 이름이 지정된 볼륨
      • driver: flocker: Flocker라는 스토리지 드라이버 사용 (컨테이너 간 데이터 공유 및 영속성을 보장)
      • driver_opts: 크기를 10GiB로 제한
      • => backend가 사용하는 DB 데이터를 외부 스토리지에 영속적으로 저장
  • configs: 서비스에 주입할 외부 설정 파일
    • 외부에 존재하는 설정 파일 (httpd-config)을 Compose 파일에서 참조만 함
    • frontend 서비스에서 사용
    • => 컨테이너에서 필요한 웹 서버 설정 파일을 미리 준비해두고 재사용
  • secrets: 보안 상 민감한 정보 (예: 인증서, 비밀번호 등)
    • 외부에 이미 존재하는 server-certificate 비밀 정보를 Compose에서 참조
    • =>  HTTPS 구성을 위한 SSL 인증서 또는 개인키 등을 안전하게 전달
         
  • networks: 서비스 간 통신을 위한 네트워크 정의
    • 빈 객체로 정의만 하면 Docker가 기본 설정으로 네트워크 생성
    • front-tier: 외부 통신 또는 사용자와 연결되는 네트워크
    • back-tier: frontendbackend 간 내부 통신 전용 네트워크
    • => 네트워크 분리 이유: 보안성과 효율성을 위해 외부와 내부 네트워크를 구분

 

 

docker compose 명령어 

$ docker compose [OPTIONS] COMMAND

 

Options: 

  • -f, --file stringArray                  Compose configuration files
  • -p, --project-name string        Project name

 

Commands :

      • build       Build or rebuild services
      • up           Create and start containers
      • down      Stop and remove containers, networks
      • logs        View output from containers
      • ps           List containers
      • restart    Restart containers

 

 


* docker compose 
https://docs.docker.com/compose/

* Compose file reference
https://docs.docker.com/reference/compose-file/

 

'! > docker' 카테고리의 다른 글

docker network  (0) 2025.04.15
docker volume, bind mounts  (0) 2025.04.12
Dockerfile  (0) 2025.04.04
Docker CLI 명령어  (0) 2024.11.14
Docker 설치 (MacOS)  (0) 2022.09.05

+ Recent posts