소개
Docker Compose 는 개발자가 컨테이너 관리 및 애플리케이션 배포를 효율화하기 위한 필수적인 도구입니다. 이 포괄적인 튜토리얼은 Docker Compose 의 기본 원리를 탐구하며, 복잡한 다중 컨테이너 환경을 효율적이고 체계적으로 구성, 배포 및 관리하는 실질적인 통찰력을 제공합니다.
Docker Compose 기본 개념
Docker Compose 소개
Docker Compose 는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 강력한 도구입니다. YAML 파일을 사용하여 애플리케이션 서비스, 네트워크 및 볼륨을 구성할 수 있으므로 컨테이너 오케스트레이션 및 관리 프로세스를 간소화합니다.
핵심 개념 및 아키텍처
graph TD
A[Docker Compose] --> B[서비스 구성]
A --> C[다중 컨테이너 관리]
A --> D[선언적 인프라]
| 핵심 개념 | 설명 |
|---|---|
| docker-compose.yml | 서비스, 네트워크 및 볼륨을 정의하는 구성 파일 |
| 서비스 | 애플리케이션을 구성하는 개별 컨테이너 |
| 볼륨 | 컨테이너의 지속적인 데이터 저장소 |
| 네트워크 | 컨테이너 간 통신을 위한 사용자 정의 네트워크 구성 |
실제 예제: 웹 애플리케이션 설정
다음은 일반적인 웹 애플리케이션에 대한 Docker Compose 구성을 보여주는 포괄적인 예제입니다.
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./website:/usr/share/nginx/html
database:
image: postgres:13
environment:
POSTGRES_PASSWORD: mysecretpassword
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
코드 분석
version: '3.8'은 Docker Compose 파일 형식을 지정합니다.services섹션은 웹 서버와 데이터베이스라는 두 개의 컨테이너를 정의합니다.nginx서비스는 호스트 포트 80 을 컨테이너 포트 80 으로 매핑합니다.postgres서비스는 지속적인 볼륨 저장소를 사용하여 데이터베이스를 설정합니다.
설치 및 기본 명령어
Ubuntu 22.04 에 Docker Compose 를 설치하려면 다음과 같이 합니다.
sudo apt update
sudo apt install docker-compose-plugin
docker compose version
주요 Docker Compose 명령어:
docker compose up: 모든 서비스 시작docker compose down: 컨테이너 중지 및 제거docker compose ps: 실행 중인 서비스 목록docker compose logs: 서비스 로그 보기
구성 및 배포
Docker Compose 파일 구조
Docker Compose 구성은 전체 애플리케이션 인프라를 정의하는 YAML 파일을 기반으로 합니다. 표준 파일 이름은 docker-compose.yml이며, 포괄적인 서비스 정의를 포함합니다.
graph TD
A[docker-compose.yml] --> B[서비스]
A --> C[네트워크]
A --> D[볼륨]
A --> E[환경 변수]
서비스 구성 상세 예제
version: "3.8"
services:
backend:
image: python:3.9
build:
context: ./backend
dockerfile: Dockerfile
ports:
- "5000:5000"
environment:
- DATABASE_URL=postgresql://user:password@database:5432/appdb
depends_on:
- database
database:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: secretpassword
volumes:
postgres_data:
구성 매개변수
| 매개변수 | 설명 | 예시 |
|---|---|---|
image |
기본 컨테이너 이미지 | nginx:latest |
build |
사용자 정의 이미지 빌드 구성 | context: ./app |
ports |
포트 매핑 | "8080:80" |
volumes |
지속적인 데이터 저장소 | - ./data:/app/data |
environment |
컨테이너 환경 변수 | DATABASE_HOST=localhost |
배포 전략
graph LR
A[로컬 개발] --> B[스테이징 환경]
B --> C[생산 배포]
C --> D[서비스 확장]
배포 명령어
Ubuntu 22.04 에서 일반적인 배포 워크플로우:
## compose 파일 유효성 검사
docker compose config
## 서비스 빌드
docker compose build
## 서비스 시작
docker compose up -d
## 실행 중인 서비스 확인
docker compose ps
## 로그 보기
docker compose logs backend
## 서비스 중지
docker compose down
고급 구성 기법
services:
webserver:
restart: always
healthcheck:
test: ["CMD", "curl", "-f", "
interval: 30s
timeout: 10s
retries: 3
고급 Compose 전략
다중 환경 구성
Docker Compose 는 여러 구성 파일과 재정의 메커니즘을 통해 정교한 환경 관리를 지원합니다.
graph LR
A[기본 구성] --> B[개발 재정의]
A --> C[생산 재정의]
A --> D[스테이징 재정의]
환경별 구성
version: "3.8"
services:
application:
image: myapp:latest
environment:
- APP_ENV=${DEPLOY_ENV:-development}
- DATABASE_URL=${DATABASE_CONNECTION}
서비스 동적 확장
## web 서비스를 3개 인스턴스로 확장
docker compose up -d --scale web=3
고급 네트워크 구성
| 네트워크 모드 | 설명 | 사용 사례 |
|---|---|---|
| bridge | 기본 네트워크 | 격리된 컨테이너 간 통신 |
| host | 직접 호스트 네트워크 | 고성능 시나리오 |
| custom | 사용자 정의 네트워크 | 복잡한 마이크로서비스 아키텍처 |
생산 환경 준비 Compose 예제
version: '3.8'
services:
webserver:
image: nginx:alpine
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
healthcheck:
test: ["CMD", "curl", "-f", "
interval: 30s
timeout: 10s
retries: 3
backend:
image: myapp:${VERSION}
secrets:
- db_password
configs:
- source: app_config
target: /app/config.json
secrets:
db_password:
external: true
configs:
app_config:
file: ./config.json
컨테이너 버전 관리 전략
## 버전이 지정된 이미지 태그 및 푸시
docker build -t myapp:v1.0 .
docker compose push
배포 워크플로우
graph TD
A[이미지 빌드] --> B[테스트 실행]
B --> C[레지스트리에 푸시]
C --> D[컨테이너 배포]
D --> E[성능 모니터링]
보안 및 규정 준수 명령어
## 취약점에 대한 compose 서비스 스캔
docker compose config --resolve-env-vars
docker scan docker-compose.yml
요약
Docker Compose 를 마스터함으로써 개발자는 컨테이너 오케스트레이션을 단순화하고, 인프라를 코드로 정의하며, 확장 가능하고 재현 가능한 애플리케이션 환경을 만들 수 있습니다. 이 튜토리얼은 핵심 개념, 구성 전략, 그리고 다양한 인프라 시나리오에서 원활한 멀티 컨테이너 애플리케이션 개발 및 배포를 가능하게 하는 실질적인 구현 기법을 다룹니다.



