Docker Compose 이해
- 1. Docker Compose의 핵심 철학: “정의서 한 장으로 인프라 구축”
- 2. docker-compose.yml의 구조 이해
- 3. 핵심 사용법 및 워크플로우
- 4. 컴포즈 활용 팁 (Best Practices)
Docker Compose는 여러 개의 컨테이너로 구성된 애플리케이션을 정의하고 실행하기 위한 도구입니다. 현대적인 웹 서비스는 보통 웹 서버, API 서버, 데이터베이스, 캐시 서버 등이 함께 유기적으로 돌아가야 하는데, 이를 일일이 docker run으로 실행하는 불편함을 해결해 줍니다.
1. Docker Compose의 핵심 철학: “정의서 한 장으로 인프라 구축”
도커 컴포즈의 핵심은 docker-compose.yml이라는 YAML 형식의 설정 파일입니다. 이 파일에 애플리케이션에 필요한 서비스, 네트워크, 볼륨 등을 선언적으로 기술합니다.
주요 이점
- 다중 컨테이너 관리: 여러 컨테이너를 하나의 명령으로 시작, 중지, 재생성할 수 있습니다.
- 환경 격리: 각 프로젝트별로 독립된 가상 네트워크를 생성하여 컨테이너 간 간섭을 방지합니다.
- 서비스 가속화: 변경된 컨테이너만 다시 생성하므로 설정 변경 시 매우 빠릅니다.
- 변수 활용:
.env파일을 통해 환경별(개발, 테스트, 운영) 설정을 쉽게 바꿀 수 있습니다.
2. docker-compose.yml의 구조 이해
파일은 크게 세 가지 주요 섹션으로 나뉩니다.
version: '3.8' # 파일 규격 버전 (최근에는 생략 가능)
services: # 1. 실행할 컨테이너들의 정의
web-app:
build: . # 현재 디렉토리의 Dockerfile을 빌드
ports:
- "8080:80"
depends_on:
- db # db 서비스가 먼저 실행된 후 시작됨
environment:
- DB_HOST=db
db:
image: postgres:15
volumes:
- db-data:/var/lib/postgresql/data # 2. 데이터 영속성을 위한 볼륨
networks: # 3. 컨테이너 간 통신을 위한 네트워크 (자동 생성됨)
default:
volumes: # 물리적인 저장소 공간 정의
db-data:
3. 핵심 사용법 및 워크플로우
컴포즈를 사용하는 과정은 매우 직관적
- 서비스 실행 (
up)
docker-compose up -d
- 설정된 모든 서비스를 백그라운드(
-d)에서 실행 - 이미지가 없다면 빌드하거나 내려받고, 네트워크와 볼륨도 자동으로 생성
- 상태 확인 및 로그 (
ps,logs)
docker-compose ps # 실행 중인 서비스 목록 확인
docker-compose logs -f # 전체 혹은 특정 서비스의 로그를 실시간 확인
- 서비스 중지 및 삭제 (
down)
docker-compose down
- 실행 중인 컨테이너를 멈추고 삭제
- 생성된 가상 네트워크도 함께 삭제되어 시스템을 깨끗하게 유지 (단, 볼륨은 명시하지 않으면 보존됨)
4. 컴포즈 활용 팁 (Best Practices)
- 서비스 이름으로 통신하기 (Service Discovery)
- 컴포즈로 띄운 컨테이너들은 동일한 기본 네트워크에 속함
- 이때 컨테이너의 IP 주소를 알 필요 없이, YAML 파일에 정의한 서비스 이름을 호스트 이름처럼 사용하여 통신할 수 있음
- 예: 웹 앱 설정 파일에서 DB 접속 주소를
localhost가 아닌db로 설정하면 도커가 알아서 연결해 줌
- 예: 웹 앱 설정 파일에서 DB 접속 주소를
depends_on의 한계 이해depends_on은 컨테이너의 실행 순서만 보장함- DB 컨테이너가 켜졌다고 해서 그 안의 DB 서비스가 즉시 쿼리를 받을 준비가 된 것은 아닐 수 있음
- 이를 해결하기 위해 애플리케이션 코드 내에서 재시도(Retry) 로직을 넣거나
wait-for-it같은 스크립트를 사용하기도 함
- 볼륨 매핑을 통한 실시간 개발
- 개발 환경에서는 소스 코드를 수정할 때마다 이미지를 다시 빌드하는 것이 번거울 수 있음
volumes설정을 통해 호스트의 소스 폴더를 컨테이너에 동기화하면, 코드 수정 즉시 컨테이너 안에 반영되어 매우 효율적
- 요약
- Docker Compose는 “여러 컨테이너를 묶어서 하나의 패키지처럼 관리하는 마법 지팡이”
- Dockerfile로 개별 컴포넌트(클래스)를 만들고,
- docker-compose.yml로 그들의 관계(시스템 구성)를 정의하며,
- docker-compose up으로 전체 시스템(애플리케이션)을 구동하는 흐름을 익히면
실무 역량이 한 단계 더 높아질 것