Docker만으로도 강력하지만, Docker Compose(도커 컴포즈)는 여러 개의 컨테이너를 한 번에 정의하고 실행할 수 있도록 도와주는 도구이다.
Docker Compose는 docker-compose.yml이라는 파일 하나로 여러 컨테이너(서비스)를 구성하고 관리할 수 있게 해준다.
예를 들어, 웹 애플리케이션을 실행할 때:
이렇게 여러 개의 컨테이너가 필요하잖아? 이걸 한 번에 설정하고 실행할 수 있도록 해주는 게 Docker Compose다.
docker-compose.yml 예시version: '3'
services:
web:
build: .
ports:
- "8080:8080"
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: mydb
web: Spring 애플리케이션 (Dockerfile 기준으로 빌드)db: MySQL 8.0 컨테이너depends_on: web 서비스가 db가 먼저 실행된 다음에 실행되도록 설정docker-compose up
docker-compose down
| Docker | Docker Compose |
|---|---|
| 하나의 컨테이너만 쉽게 실행 | 여러 개의 컨테이너를 한 번에 실행 |
docker run 명령어 직접 입력 | 설정 파일로 정의해 재사용 가능 |
| 복잡한 의존관계 관리 불편 | depends_on 등으로 쉽게 구성 |
Java Spring 애플리케이션과 MySQL 데이터베이스를 Docker Compose로 구성하는 구체적인 예제를 보자면,
my-spring-app/
├── Dockerfile
├── docker-compose.yml
├── src/...
└── ...
Dockerfile (Spring Boot용)# Base image
FROM openjdk:17-jdk-slim
# Set working directory
WORKDIR /app
# Copy jar file (빌드 후 jar가 생긴다는 가정)
COPY target/myapp.jar app.jar
# Expose port
EXPOSE 8080
# Run the app
ENTRYPOINT ["java", "-jar", "app.jar"]
docker-compose.ymlversion: '3.8'
services:
app:
build: .
container_name: spring-app
ports:
- "8080:8080"
depends_on:
- db
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mydb
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: root
networks:
- spring-net
db:
image: mysql:8.0
container_name: mysql-db
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: mydb
ports:
- "3306:3306"
networks:
- spring-net
networks:
spring-net:
application.properties 또는 application.ymlspring.datasource.url=${SPRING_DATASOURCE_URL}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}
spring.jpa.hibernate.ddl-auto=update
이렇게 환경변수로 값을 받아서 도커 환경에 맞게 자동 설정되도록 만들 수 있다.
mvn package)docker-compose up --build
그러면:
docker-compose down
필요 시 -v 옵션으로 볼륨까지 삭제 가능:
docker-compose down -v