Docker Compose 개념 & 실습#

alt text

Docker Compose는 “여러 컨테이너를 하나의 애플리케이션으로 정의·실행”하기 위한 도구입니다.
여러 서비스를 하나의 설정 파일(docker-compose.yml)에 선언하고, 단일 명령으로 전체 스택을 관리할 수 있습니다.

Docker compose#

Compose의 역할#

  • 여러 컨테이너(서비스)를 선언적(Declarative)으로 정의

  • 네트워크, 볼륨, 의존성 등 설정을 코드로 관리

  • 개발·테스트·CI 환경에서 동일한 스택을 쉽게 재현

주요 구성 요소#

  • services

    • 애플리케이션을 구성하는 각 컨테이너(service)를 정의

  • networks (Option)

    • 서비스 간 통신을 위한 네트워크 설정

  • volumes (Option)

    • 컨테이너를 지워도 데이터가 사라지지 않도록 호스트의 디스크나 Docker 볼륨을 연결하여 파일을 보관

  • depends_on (Option)

    • 서비스 간 “시작 순서” 의존성을 선언

장점#

  • 일관성: 로컬 · CI · 프로덕션에서 동일한 설정

  • 편의성: up·down·logs만으로 전체 스택 관리

  • 버전 관리: YAML 파일로 Git에 커밋 가능

Docker compose example#

아래 예제는 웹 서버(Nginx) + Redis 스택입니다.

프로젝트 구조#

.
├── docker-compose.yaml
└── html/
    └── index.html

docker-compose.yaml 작성#

version: "3.8"    # Compose 파일 형식 버전

services:
  web:    # 웹 서버 서비스 정의
    image: nginx:stable-alpine    # 경량 Alpine 기반 Nginx 공식 이미지 사용
    ports:
      - "8080:80"    # 호스트 8080 포트를 컨테이너 80 포트로 포워딩
    volumes:
      - ./html:/usr/share/nginx/html:ro  
        # 로컬의 html/ 디렉터리를 컨테이너의 웹 루트(/usr/share/nginx/html)에 
        # 읽기 전용(ro)으로 마운트
    depends_on:
      - redis    # web 서비스가 시작되기 전에 redis 서비스가 먼저 기동되도록 설정

  redis:   # Redis 서비스 정의 (캐시/데이터 저장소)
    image: redis:6-alpine   # 경량 Alpine 기반 Redis 6 공식 이미지 사용
    volumes:
      - redis-data:/data    # named volume 'redis-data'를 컨테이너의 /data에 마운트하여
                            # 데이터 영속성 확보

volumes:
  redis-data:    # named volume 정의
                 # - Redis 컨테이너가 삭제되어도 데이터가 유지됨
                 # - 호스트에서 위치는 Docker가 관리하며 필요 시 직접 마운트 가능

html/index.html 작성#

<!-- 원하는 문구를 입력하세요. -->
Hello World !

docker compose up#

  • 역할

    • docker-compose.yml에 정의된 모든 서비스를 생성하고 시작합니다.

  • 주요 옵션

    • -d, --detach : 백그라운드 모드로 실행

    • --build : 시작 전에 이미지 재빌드

    • --force-recreate : 기존 컨테이너를 강제로 재생성

    • --remove-orphans : YAML 파일에 없는 이전에 생성된 컨테이너(orphans)를 삭제

docker compose down#

  • 역할

    • up으로 생성한 컨테이너, 네트워크, 기본적으로 생성된 볼륨 등을 일괄 삭제합니다.

  • 주요 옵션

    • --volumes : 정의된 named volumes까지 함께 삭제

    • --remove-orphans : 현재 YAML에 없는 orphan 컨테이너도 삭제

docker compose ps#

  • 역할

    • Compose 프로젝트 내 서비스별 컨테이너 상태를 조회합니다.

  • 주요 옵션

    • -a, --all : 중지된 컨테이너까지 모두 표시

    • --services : 서비스 이름만 나열

docker compose logs#

  • 역할

    • 전체 또는 특정 서비스의 로그를 조회 및 실시간 스트리밍합니다.

    • 주요 옵션

      • -f, --follow : 실시간 로그 스트리밍

      • --tail <N> : 최근 N줄만 출력

      • --timestamps : 로그에 타임스탬프 포함

실습#

# 백그라운드 실행
docker compose up -d

# 실행 중인 컨테이너 조회
docker compose ps 

# web 서비스 로그
docker compose logs web

# 전체 서비스 실시간 로그
docker compose logs -f

# 컨테이너·네트워크·볼륨(옵션) 일괄 제거
docker compose down --volumes

Tip:

  • docker compose build로 서비스 이미지를 재빌드할 수 있습니다.

  • docker compose up --build 로 실행 시 자동 빌드 후 재시작합니다.


이제 Docker에 대한 기본 명령어들을 모두 익혔습니다.
다음 챕터에서는 Docker를 이용해서 Ollama 내 로컬에 띄워봅시다.