개발관련 이것저것

Docker Compose

이상한나라의개발자 2025. 6. 21. 10:25

Docker Compose는 여러개의 컨테이너로 이루어진 어플리케이션 스택을 정의하고, 한 번에 시작/중지/관리할 수 있게 해주는 도구 입니다. 복잡한 멀티 컨테이너 환경을 간단한 설정 파일 하나로 관리할 수 있어 개발/테스트/배포 과정에서 큰 효율을 제공합니다. 

 

Docker Compose 란?

 

  • 멀티 컨테이너 애플리케이션 정의
    docker-compose.yml 파일 하나에 여러 서비스(컨테이너)를 선언하면, 의존성 순서, 네트워크, 볼륨 등도 함께 설정할 수 있습니다.
  • 명령어 한 번으로 관리
    docker compose up만 실행하면 파일에 정의된 모든 서비스가 순서대로 빌드·시작되며, docker compose down으로 한 번에 종료·정리합니다.
  • 환경 일관성 보장
    개발·테스트·스테이징·프로덕션에서 동일한 설정 파일을 사용해, “내 로컬에서는 되는데…” 문제를 최소화합니다.

 

기본 개념 정리

서비스(service) 실행할 컨테이너 단위. 이미지, 환경 변수, 포트, 볼륨 등을 정의
이미지(image) 컨테이너 실행의 템플릿. Dockerfile로부터 빌드하거나 외부에서 당겨옴
컨테이너(container) 실행 중인 이미지의 인스턴스
네트워크(network) 서비스 간 통신용 가상 네트워크
볼륨(volume) 컨테이너 간 혹은 호스트와 컨테이너 간 영속적 데이터 저장에 사용
의존성(depends_on) 서비스 시작 순서를 지정할 때 사용

 

docker-compose.yml 파일 구조

기본적으로 다음과 같이 4가지의 큰 카테고리로 작성하며, 이 중에서 보통 version 과 service만 설정하여 많이 사용한다.

volumes는 각 컨테이너 설정에서의 volumes로 선언할 수 있고, networks는 컨테이너간 네트워크 분리를 위한 추가 설정 부분임

 

# Docker Compose 파일 포맷 버전 지장
version:

# 컨테이너 설정
services:

# 컨테이너에서 사용하는 volume 설정으로 대체 가능 ( 옵션 )
volumes:

# 컨테이너간 네트워크 분리를 위한 추가 설정 부분 ( 옵션 )
networks:
version: '3.8'

services:
  app:
    build:
      context: .    # 도커 파일 위치 
      dockerfile: Dockerfile # 도커 파일 명 
    image: dockercomposetest-app:latest
    container_name: demo-app
    ports:
      - "8080:8080"
    restart: unless-stopped
    # depends_on: db 컨테이너가 먼저 실행이된 후 실행
    #  - db 
    # 필요하다면 환경변수 추가
    # environment:
    #   SPRING_PROFILES_ACTIVE: dev
    # 헬스체크(선택)
    # healthcheck:
        # test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
        # interval: 30s
        # timeout: 10s
        # retries: 3

 

 

주요 명령어

명령어 설명

docker compose up [-d] 서비스 시작 (-d: 백그라운드)
docker compose down 컨테이너·네트워크·볼륨 정리 (종료 포함)
docker compose ps 실행 중인 서비스 목록 조회
docker compose logs [-f] [서비스명] 전체/특정 서비스 로그 보기 (-f: 실시간)
docker compose exec 서비스명 sh 실행 중인 컨테이너에 쉘 접속
docker compose build [서비스명] 이미지 빌드 또는 재빌드
docker compose stop [서비스명] 서비스 중지
docker compose start [서비스명] 서비스 재시작
docker compose restart [서비스명] 중지 후 재시작

 

간단한 예제

Springboot 프로젝트를 만들어 web 의존성만 추가하고 진행합니다.

프로젝트 구조

 

Dockerfile  작성

* 도커 파일은 컨테이너 이미지를 어떻게 만들어야 할지를 명세하는 텍스트 파일입니다. 각 명령어는 이미지 레이어(layer)를 하나씩 추가하며 순차적으로 실행됩니다.

# --- 1) Builder 단계: Gradle Wrapper로 앱 패키징 ---
FROM openjdk:17-jdk-slim AS builder
WORKDIR /app

# Gradle Wrapper 및 설정 복사
COPY gradlew .
COPY gradle/ gradle/
COPY settings.gradle .
COPY build.gradle .

# 실행 권한 부여 & 의존성 다운로드
RUN chmod +x gradlew \
    && ./gradlew --no-daemon dependencies

# 소스 복사 후 JAR 생성
COPY src/ src/
RUN ./gradlew --no-daemon clean bootJar -x test

# --- 2) Run 단계: 경량 JRE 이미지에 결과물 복사 ---
FROM openjdk:17-jdk-slim
WORKDIR /app

COPY --from=builder /app/build/libs/*.jar app.jar

# 문서화용 포트
EXPOSE 8080

ENTRYPOINT ["java","-jar","app.jar"]

 

docker-compose.yml 작성

version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: dockercomposetest-app:latest
    container_name: demo-app
    ports:
      - "8080:8080"
    restart: unless-stopped
    # 필요하다면 환경변수 추가
    # environment:
    #   SPRING_PROFILES_ACTIVE: dev
    # 헬스체크(선택)
#    healthcheck:
#      test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
#      interval: 30s
#      timeout: 10s
#      retries: 3

 

실행

docker compose up -d --build # 서비스 빌드 및 백그라운드 시작 
docker compose ps # 상태 확인 
docker logs -f demo-app # 로그 확인 
http://localhost:8080/hello # 브라우저 확인 
docker compose down # 종료 및 정리