개발관련 이것저것
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 # 종료 및 정리