Docker Compose란?
여러 개의 Docker 컨테이너들을 하나의 서비스로 정의하고 구성해 하나의 묶음으로 관리할 수 있게 도와주는 툴이다.
Docker Compose를 왜 사용할까?
1. 여러 개의 컨테이너를 관리 하는데 용이하다.
- 여러 개의 컨테이너로 이루어진 복잡한 애플리케이션을 한 번에 관리할 수 있게 해준다. 여러 컨테이너를 하나의 환경에서 실행하고 관리하는데 도움이 된다.
2. 복잡한 명령어로 실행 시키던 걸 간소화 시킬 수 있다.
- 이전에 MySQL 이미지를 컨테이너로 실행 시킬 때 'MYSQL_ROOT_PASSWORD ~'에서 부터 복잡한 명령어를 실행 시켰다. DockerCompose를 사용하면 컨테이너를 실행 시킬 때 마다 복잡한 명령어를 입력하지 않아도 된다. docker compose up 명령어만 사용하면 된다.
예제
1. Nginx 실행 예제.
[Terminal]
docker run --name webserver -d -p 80:80 nginx
이 명령어를 DockerCompose로 이어보자.
[compose.yml]
# Docker Compose에선 하나의 도커를 Service 라고 부른다.
services:
my-web-server: # 서비스에 대한 이름을 적는 부분
container_name: web-server # 컨테이너 이름을 정의 하는 부분
image: nginx # 어떤 이미지를 기반으로 컨테이너를 띄울 것인지 정의하는 부분
ports:
- 80:80
두 개가 동일한 동작을 하는 명령어다.
compose.yml 파일을 실행 시켜보자.
# foreground에서 실행 됨
~/Desktop/docker/compose-practice ❯ docker compose up
# background에서 실행 됨
~/Desktop/docker/compose-practice ❯ docker compose up -d
컨테이너를 올리는 명령어는 'up' 이라면, 내리는 명령어는 'down' 이다.
~/Desktop/docker/compose-practice ❯ docker compose down 00:29:21
[+] Running 2/2
✔ Container web-server Removed 0.2s
✔ Network compose-practice_default Removed 0.2s
~/Desktop/docker/compose-practice ❯ docker ps 00:30:43
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2. Redis 실행 예제.
기존에는 컨테이너를 띄울 때 아래와 같이 명령어를 입력해서 컨테이너를 띄웠다.
[Terminal]
$ docker run -d -p 6379:6379 redis
Docker Compose를 적용해보자.
[Compose.xml]
services:
my-cache-server:
image: redis
ports:
- 6379:6379
아래 명령어를 입력해서 컨테이너를 띄워보자.
docker compose up -d
docker ps / docker compose ps 명령어로 확인해보면, 잘 생성 된 것을 확인할 수 있다.
3. Mysql 실행 예제
[Terminal]
$ docker run -e MYSQL_ROOT_PASSWORD=pwd1234 -p 3306:3306 -v /User/Jihwan/Documnets/docker-mysql/mysql_data:/var/lib/mysql -d mysql
[compose.yml]
services:
my-db:
image: mysql
environment: # 환경변수
MYSQL_ROOT_PASSWORD: pwd1234
volumes:
- ./mysql_data:/var/lib/mysql
ports:
- 3306:3306
변환된 부분을 확인할 수 있다.
4. SpringBoot 실행 예제
Dockerfile로 이미지를 만드는 부분부터 Compose로 실행시키는 과정을 살펴보겠다.
[Dockerfile]
FROM openjdk:17-jdk
# jar파일 복사
COPY build/lib/*SNAPSHOT.jar app.jar
ENTRYPOINT["java", "-jar", "/app.jar"]
빌드 후(./gradlew clean build) 이전에는 아래 명령어를 사용 했었다.
[Termianl]
$ docker build -t my-server .
[compose.yml]
services:
my-server:
build: . #경로/도커파일이 위치한 경로
ports:
- 8080:8080
# 1. Dockerfile로 생성된 이미지를 기반으로 띄움 > 띄운 컨테이너는 8080포트로 매핑을 시켜서 사용
[Termianl]
docker compose up -d --build
#compose.yml에서 적은 image를 '다시!' 빌드하고 띄움
5. 두 개의 컨테이너를 띄우는 예제(Mysql, Redis)
[compose.yml]
services:
my-db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: pwd1234
volumes:
- ./mysql_data:/var/lib/mysql
ports:
- 3306:3306
my-cache-server: # Redis 부분
image: redis
ports:
- 6679:6679
[Termianl]
~/Desktop/docker/compose-practice ❯ docker compose up -d
6. 두 개의 컨테이너를 띄우는 예제(SpringBoot, MySQL)
[compose.yml]
services:
my-server:
build: .
ports:
- 8080:8080
depends_on: # SpringBoot보다 디비가 먼저 떠야 되기 때문에 사용하는 예약어
my-db:
condition: service_healthy # 디비 헬스체크를 하고 난 뒤 조건이 만족되면 스프링부트가 띄워짐
my-db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: pwd1234
MYSQL_DATABASE: mysql
volumes:
- ./mysql_data:/var/lib/mysql
ports:
- 3306:3306
healthcheck: #헬스체크 기준
test: ["CMD", "mysqladmin", "ping"]
interval : 5s
retries: 10
컴포즈 파일을 작성하고 실행 시켜보면, 스프링부트를 띄울 때 오류가 발생한다. 디비에 붙어보면, 내가 생성한 my-db가 생성된 것을 확인했다.
무엇이 문제인걸까?

각각의 컨테이너는 자신만의 네트워크망과 IP주소를 가지고 있다. 호스트 컴퓨터 입장에선 localhost는 호스트 컴퓨터를 가리키지만, SpringBoot 컨테이너 입장에서 localhost는 Spring Boot 컨테이너를 가리킨다.
Spring Boot 코드 작성할 때 디비 정보를 아래와 같이 입력한다.
Spring Boot가 실행되는 환경인 컨테이너 입장에선 "localhost:3306" 주소는, Spring Boot 컨테이너 내부에 있는 3306번 포트와 연결을 시도하게 된다. 하지만, Spring Boot가 실행되는 컨테이너 내부의 3306번 포트에는 아무것도 실행되고 있지 않다. 이런 구조상의 문제 때문에 Spring Boot가 MYSQL에 연결이 안 되고 있었던 것이다.
[application.yml]
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: pwd1234
driver-class-name: com.mysql.cj.jdbc.Driver
그럼 어떻게 스프링 부트의 컨테이너에서 다른 컨테이너에 존재하는 MySQL에 연결을 할 수 있을까?
compose.yml에서 정의한 Services 이름으로 서로 통신할 수 있다.
[application.yml 변경]
spring:
datasource:
url: jdbc:mysql://my-db:3306/mydb
username: root
password: pwd1234
driver-class-name: com.mysql.cj.jdbc.Driver
자주 사용하는 Docker Compose CLI 명령어
1. docker compose up (foreground)
- 포그라운드 모드로 컨테이너 실행
- 백그라운드 실행은 (-d) 옵션 사용(docker compose up -d)
2. docker compose ps
- docker ps는 전체 Docker 컨테이너 중 실행중인 것을 보여줌
- docker compose ps는 현재 Compose 프로젝트의 컨테이너 중 실행 중인 것만 보여줌
- 모든 실행, 종료된 컨테이너를 보고 싶다면 (-a) 옵션 사용 (docker compose ps -a)
3. docker compose logs
- 로그 조회 할 때 사용
4. docker compose up --build
- 이미지를 다시 빌드해서 컨테이너를 실행 시켜야 할 때 사용
5. docker compose pull
- Compose.yml에 정의된 이미지 변경 및 다운로드
6. docker compose down
- 종료할 때 사용
'Study > 도커' 카테고리의 다른 글
| 스웜 모드(Swram mode) - 개념 및 manager, worker node (0) | 2025.06.29 |
|---|---|
| 쿠버네티스(Kubernetes)란? (0) | 2025.06.25 |
| Spring Boot 프로젝트를 Docker로 실행 시키기 (1) | 2025.06.17 |
| Dockerfile이란? (2) | 2025.06.16 |
| Docker로 Mysql 실행시켜보기 (3) (0) | 2025.06.09 |