Docker Compose 이해

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. 핵심 사용법 및 워크플로우

컴포즈를 사용하는 과정은 매우 직관적

  1. 서비스 실행 (up)
docker-compose up -d
  • 설정된 모든 서비스를 백그라운드(-d)에서 실행
  • 이미지가 없다면 빌드하거나 내려받고, 네트워크와 볼륨도 자동으로 생성
  1. 상태 확인 및 로그 (ps, logs)
docker-compose ps        # 실행 중인 서비스 목록 확인
docker-compose logs -f   # 전체 혹은 특정 서비스의 로그를 실시간 확인
  1. 서비스 중지 및 삭제 (down)
docker-compose down
  • 실행 중인 컨테이너를 멈추고 삭제
  • 생성된 가상 네트워크도 함께 삭제되어 시스템을 깨끗하게 유지 (단, 볼륨은 명시하지 않으면 보존됨)

4. 컴포즈 활용 팁 (Best Practices)

  • 서비스 이름으로 통신하기 (Service Discovery)
    • 컴포즈로 띄운 컨테이너들은 동일한 기본 네트워크에 속함
    • 이때 컨테이너의 IP 주소를 알 필요 없이, YAML 파일에 정의한 서비스 이름을 호스트 이름처럼 사용하여 통신할 수 있음
      • 예: 웹 앱 설정 파일에서 DB 접속 주소를 localhost가 아닌 db로 설정하면 도커가 알아서 연결해 줌
  • depends_on의 한계 이해
    • depends_on은 컨테이너의 실행 순서만 보장함
    • DB 컨테이너가 켜졌다고 해서 그 안의 DB 서비스가 즉시 쿼리를 받을 준비가 된 것은 아닐 수 있음
    • 이를 해결하기 위해 애플리케이션 코드 내에서 재시도(Retry) 로직을 넣거나 wait-for-it 같은 스크립트를 사용하기도 함
  • 볼륨 매핑을 통한 실시간 개발
    • 개발 환경에서는 소스 코드를 수정할 때마다 이미지를 다시 빌드하는 것이 번거울 수 있음
    • volumes 설정을 통해 호스트의 소스 폴더를 컨테이너에 동기화하면, 코드 수정 즉시 컨테이너 안에 반영되어 매우 효율적
  • 요약
  • Docker Compose는 “여러 컨테이너를 묶어서 하나의 패키지처럼 관리하는 마법 지팡이”
    1. Dockerfile로 개별 컴포넌트(클래스)를 만들고,
    2. docker-compose.yml로 그들의 관계(시스템 구성)를 정의하며,
    3. docker-compose up으로 전체 시스템(애플리케이션)을 구동하는 흐름을 익히면
      실무 역량이 한 단계 더 높아질 것

© 2020. AiDALab Co. All rights reserved.

Powered by Hydejack v9.2.1