지난 포스팅에서는 도커의 기본 개념에 대해 알아보았다.
이전 글 참조 | 2026.03.29 - [Development] - [Docker] 도커(Docker)란?
오늘은 도커 컴포즈(Docker Compose)와 도커 볼륨(Docker Volume)에 대해 알아보도록 하겠다.
도커 컴포즈(Docker Compose)
저번 시간에는 하나의 컨테이너를 빌드하고 실행하는 방법에 대해 살펴보았다.
하지만 실제 애플리케이션 환경에서는 하나의 컨테이너만으로 모든 서비스를 구성하기란 어렵다..
도커 컴포즈(Docker Compose)는 여러 개의 도커 컨테이너를 모아 한 번에 띄울 수 있게 해주는 도구이다.
도커 컴포즈의 역할은 다음과 같다.
여러 컨테이너 관리
도커 컴포즈는 여러 개의 도커 컨테이너를 하나의 설정 파일(docker-compose.yml)로 정의하고, 모든 컨테이너의 속성을 명시할 수 있다.
- 컨테이너들은 동일한 네트워크로 연결되어 서로 데이터를 주고받을 수 있다.
- 컨테이너 간 의존 관계(depends_on)를 설정해 실행 순서를 제어할 수 있다.
설정 파일(docker-compose.yml)의 예시는 다음과 같다.
version: '3'
services:
db:
image: postgres:15
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypass
POSTGRES_DB: mydb
ports:
- "5432:5432"
web:
image: nginx
depends_on:
- db
ports:
- "8080:80"
- version: '3' - compose 파일 버전 3
- services: compose에서 실행할 컨테이너 목록
- db 컨테이너: postgre:15(버전) 이미지 사용
- 환경변수(POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB)로 DB 설정
- 호스트 5432 포트 → 컨테이너 내부 5432 포트로 연결
- web 컨테이너: nginx 이미지 사용
- depends_on: db가 먼저 시작되어야 web이 연결 가능
- 호스트 8080 포트 → 컨테이너 내부 80 포트로 연결
- db 컨테이너: postgre:15(버전) 이미지 사용
도커 컴포즈 실행
위의 docker-compose.yml 파일을 통해 여러 컨테이너를 생성하여 백그라운드에서 실행하는 명령어는 docker compose up -d이다.
-d 옵션을 붙이지 않으면 컨테이너들은 포그라운드에서 실행된다.. (해당 경우에는 ctrl + c를 하면 컨테이너가 종료된다.)
실행한 결과(docker ps)는 다음과 같다.

만약 도커 허브에 있는 이미지를 사용하지 않고, 나의 로컬에 있는 코드를 활용하는 방법은 두 가지이다.
- 미리 빌드해 둔 로컬 이미지 사용하기
- 터미널에서 docker build -t my-docker . 를 통해 수동으로 이미지를 만들어 놓은 경우
- image에 해당 이미지(my-docker) 이름을 명시하면 된다.
services:
my_service:
image: my-docker:latest
- 특정 폴더 자체를 빌드 경로로 설정하기
- 미리 빌드해 둔 이미지가 없고, docker compose up 을 통해 이미지를 생성하고 컨테이너들을 실행하는 경우
- 이때 DockerFile이 위치한 디렉토리 경로를 build 옵션에 생성하여 빌드 경로를 지정할 수 있다.
services:
my_service:
build: ./my-test-folder
도커 볼륨(Docker Volume)
위에서 도커 컴포즈를 통해 여러 컨테이너를 함께 실행하는 방법을 알아보았다.
하지만 컨테이너를 포그라운드 또는 백그라운드에서 실행한 뒤 종료하면, 컨테이너 내부에 저장된 데이터는 사라지게 된다.
따라서 이러한 데이터의 휘발성을 방지하고 "지속적인 데이터 저장을 가능하게 하는 기능"이 바로 Docker Volume이다.
도커 볼륨의 원리는 도커 컨테이너 내부의 특정 폴더가 사용자 로컬(호스트)의 특정 폴더와 연결되어,
두 환경이 동일한 데이터를 공유하도록 하는 것이다!
docker-compose.yml에 볼륨(Volume)을 적용한 예시는 다음과 같다.
version: '3'
services:
db:
image: postgres:15
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypass
POSTGRES_DB: mydb
volumes:
- db_data:/var/lib/postgresql/data
ports:
- "5432:5432"
web:
...
environment:
DATABASE_URL: postgres://myuser:mypass@db:5432/mydb
...
volumes:
db_data:
위 예시와 달라진 점은 다음과 같다.
- services > db > volumes: db의 도커 볼륨을 정의
- db_data:/var/lib/postgresql/data: db_data라는 볼륨을 컨테이너 내부 경로(/var/lib/postgresql/data)에 연결
- volumes > db_data
- db_data 볼륨이 없으면 생성
- db_data 볼륨이 있으면 재사용
❓ 그렇다면 db_data 볼륨에 저장된 데이터는 사용자 PC 내 어디에 위치해 있을까?
❗️주로 Docker가 관리하는 기본 경로(/var/lib/docker/volumes) 내에 위치해 있다.
정확한 경로를 확인하고 싶다면
1) docker volume ls로 볼륨 이름을 먼저 확인한 후,
2) docker volume inspect [볼륨 이름] 으로 상세 정보를 확인해 mountpoint로 경로를 확인해야 한다.


만약 도커 볼륨에 사용자가 원하는 폴더를 지정하고 싶다면 volumes: 하위에 디렉토리 경로를 직접 명시해주면 된다!
👏
[참고]
'Development > 개발 공부' 카테고리의 다른 글
| [JPA] JPA 쿼리 (3) (0) | 2026.03.17 |
|---|---|
| [JPA] 엔티티(Entity) 매핑 (2) (0) | 2026.03.11 |
| [JPA] JPA(Java Persistence API)란? (1) (0) | 2026.02.08 |
| [Git] 깃 브랜치 전략(Git Flow, Github Flow)(+TBD) (0) | 2025.12.14 |
| AOP(Aspect Oriented Programming, 관점 지향 프로그래밍) (0) | 2025.11.10 |
