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: 종료 코드와 관계없이 컨테이너를 다시 시작, 서비스가 중지되거나 제거되면 다시 시작을 중지
- restart options :
- 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만 연결.
- frontend
- 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: frontend ↔ backend 간 내부 통신 전용 네트워크
- => 네트워크 분리 이유: 보안성과 효율성을 위해 외부와 내부 네트워크를 구분
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 |