본문 바로가기
프로그래밍/DevOps & MLops 관련정보

[Docker] Docker Compose

by 물박사의 저장공간 2025. 8. 13.

도커를 이용해서 실제 서비스를 할 때 우리는 종종 여러 컨테이너를 띄워야 하는 상황을 마주하게 됩니다. 예를 들어, 웹 애플리케이션(Node.js, Python 등) 컨테이너, 데이터베이스(MySQL, PostgreSQL) 컨테이너, 캐시(Redis) 컨테이너를 함께 실행해야 하나의 서비스가 완성됩니다.

이때 Docker Compose가 없다면, 각 컨테이너를 docker run 명령어로 일일이 실행해야 합니다. 이 과정에서 네트워크 연결, 볼륨 설정, 환경 변수 주입 등 길고 복잡한 명령어를 여러 번 입력해야 하므로 번거롭고 실수가 발생하기 쉽습니다. Docker Compose는 이 모든 과정을 하나의 설계도 파일(docker-compose.yml)에 담아 문제를 해결합니다. (그리고 이 파일은 보통 프로젝트의 최상위 디렉토리에 위치합니다)

 

 

Dockerfile : 개별 요리(예: 스테이크, 샐러드)를 위한 레시피입니다.

docker run : 레시피를 보고 요리 하나를 직접 만드는 행위입니다.

docker-compose.yml : 스테이크, 샐러드, 수프로 구성된 코스 요리 전체의 계획서입니다. 각 요리가 무엇이고, 어떤 순서로, 어떻게 함께 나가야 하는지 정의합니다.


 

docker-compose up : 계획서를 보고 주방팀 전체에 "코스 요리 시작해!"라고 지시하는 것과 같습니다. 모든 요리가 알아서 조리되고 준비됩니다.

# 포그라운드에서 실행 (로그가 터미널에 계속 출력됨)
docker-compose up

# 백그라운드(detached mode)에서 실행 (가장 일반적으로 사용)
docker-compose up -d

 

docker-compose down : up으로 생성된 컨테이너, 네트워크 등 모든 리소스를 중지하고 제거합니다.

docker-compose down

# 컨테이너와 함께 볼륨(데이터)까지 모두 삭제
docker-compose down -v

 

docker-compose ps : 서비스 상태 확인

 

docker-compose logs : 로그 확인

# 모든 서비스의 로그 보기
docker-compose logs

# 특정 서비스(예: web)의 로그만 보기
docker-compose logs web

# 실시간으로 로그 추적하기 (-f 옵션)
docker-compose logs -f web

 

docker-compose build : Dockerfile이 변경되었을 때 이미지를 다시 빌드합니다.

 

 

  • services : 실행하려는 각 컨테이너(서비스)를 정의하는 최상위 키입니다.
  • 서비스 이름 (예: web, db) : 각 서비스를 식별하는 이름입니다. 이 이름은 컨테이너 간의 네트워크 통신에서 호스트 이름으로 사용됩니다.
  • image : 사용할 Docker 이미지 이름을 지정합니다. (예: nginx:latest, mysql:8.0)
  • build : Docker 이미지를 직접 빌드할 경우, Dockerfile이 있는 경로를 지정합니다.
  • links : Docker run 명령어의 --link와 같으며 다른 서비스에 서비스 명만으로 접근할 수 있도록 설정
  • ports : 호스트와 컨테이너 간의 포트를 연결합니다. ("호스트_포트:컨테이너_포트")
  • volumes : 데이터를 영속적으로 저장하거나, 호스트의 파일을 컨테이너와 공유할 때 사용합니다. ("호스트_경로:컨테이너_경로")
  • environment : 컨테이너 내부에서 사용할 환경 변수를 설정합니다. (예: 데이터베이스 접속 정보. docker run 명령어의 --env, -e 옵션과 동일)
  • networks : 컨테이너들이 사용할 네트워크를 정의합니다. (지정하지 않으면 Compose가 기본 네트워크를 생성해 줍니다.)
  • depends_on : 서비스 간의 의존 관계를 설정합니다. 예를 들어, web 서비스가 db 서비스에 의존한다면, db가 시작된 후에 web이 시작됩니다.

 

YAML 예시

# docker-compose.yml

version: '3.8' # 파일 형식 버전을 지정 (최신 버전 권장)

services:
  # 1. 웹 애플리케이션 서비스 (Node.js)
  web:
    # 현재 디렉토리의 Dockerfile을 사용하여 이미지 빌드
    build: .
    # 호스트의 8080 포트를 컨테이너의 3000 포트로 연결
    ports:
      - "8080:3000"
    # 현재 디렉토리 전체를 컨테이너의 /usr/src/app 경로와 동기화
    volumes:
      - .:/usr/src/app
    # 환경 변수 설정
    environment:
      - REDIS_HOST=redis
    # 'redis' 서비스가 시작된 후에 이 서비스를 시작
    depends_on:
      - redis

  # 2. 데이터베이스 서비스 (Redis)
  redis:
    # Docker Hub에서 redis:alpine 이미지를 가져와 사용
    image: "redis:alpine"
    # 'db-data'라는 이름의 볼륨을 컨테이너의 /data 경로에 마운트
    # 이렇게 하면 컨테이너가 사라져도 데이터는 보존됨
    volumes:
      - db-data:/data

# 데이터 영속성을 위해 사용할 Docker 볼륨 정의
volumes:
  db-data: