Docker Compose — 여러 컨테이너를 한 덩어리로 묶어 관리하기
이 글은 2022년 10월 기준 기록입니다.
각 서비스를 필요할 때 사용하기 위해 개별적인 컨테이너로 분리했습니다. 그런데 실제로 애플리케이션을 띄우려면 앱 컨테이너와 DB 컨테이너를 매번 각각 실행해야 합니다. 그것들을 필요에 따라 묶어서 동시에 관리할 수 있다면 어떨까요. 그 요구에 답하는 것이 Docker Compose입니다.
Compose는 컨테이너 여러 개를 하나의 덩어리로 만든다
Docker Compose는 여러 개의 컨테이너를 묶어서 한 덩어리로 사용하는 것을 의미합니다. 묶는 기준은 docker-compose.yml 파일이고, Compose는 이 파일의 내용에 따라 작동합니다.
여기서 얻는 것이 두 가지입니다.
첫째, 컨테이너 실행 옵션들과 작동 순서 등을 하나의 파일에서 관리할 수 있습니다.
둘째, Compose로 묶인 컨테이너는 동일한 네트워킹 환경을 공유하므로 호스트를 거치지 않고 서로 접근할 수 있습니다. 이미 만들어 둔 이미지를 사용할 수도 있고, 이미지 빌드 자체를 Compose에 맡길 수도 있습니다.
docker-compose.yml이 곧 구성 전체다
Spring Boot 앱과 PostgreSQL을 함께 띄우는 파일은 다음과 같습니다.
name: spring-db-test # compose 이름 지정
services: # services 항목에서 각 컨테이너를 설정
postgres-db: # 각 컨테이너의 hostname이 됨
image: postgres:12
expose:
- "5432" # 접근에 사용할 포트 번호
volumes: # 컨테이너 외부 볼륨(저장 공간)을 사용
- postgres_data:/var/lib/postgresql/data
environment: # 컨테이너 내부 환경 변수 설정
- POSTGRES_USER=springtest
- POSTGRES_PASSWORD=springtest
spring-crud:
image: test_crud_app:latest
depends_on: # 컨테이너 실행 순서 정의
- postgres-db
ports:
- 8080:8080
volumes: # 외부 볼륨에 대한 설정
postgres_data: # 외부 볼륨의 명칭(compose 내부에서 사용하는 이름)
driver: local
name : postgres_data # 외부 볼륨의 실제 이름(docker app에 표시되는 이름)
눈여겨볼 것은 services 아래에 적은 이름이 그냥 라벨이 아니라는 점입니다. 그 이름이 각 컨테이너의 hostname이 됩니다. depends_on은 컨테이너 실행 순서를 정의하고, volumes는 컨테이너 바깥의 저장 공간을 붙여 줍니다. 볼륨은 Compose 내부에서 부르는 이름과 실제 이름을 따로 지정할 수 있어서, postgres_data라는 키 아래의 name이 Docker 앱에 표시되는 이름이 됩니다.
전체 항목은 Compose specification에 정리되어 있습니다.
세 개의 명령으로 올리고 멈추고 지운다
docker-compose.yml 파일이 있는 위치에서 실행합니다.
$ docker compose up -d
멈출 때는 다음과 같습니다.
$ docker compose stop
아예 제거할 때는 다음과 같습니다.
$ docker compose down
내부 DNS 덕분에 DB를 외부로 노출하지 않아도 된다
하나의 Compose로 동작하는 컨테이너들은 Compose 내부 네트워크를 사용해 통신할 수 있습니다. Compose가 자체적으로 제공하는 내부 DNS가 컨테이너의 services 이름을 그대로 도메인으로 지정해 주기 때문입니다.

구조를 보면 Spring Boot App만 호스트의 8080 포트로 노출되어 있고, PostgreSQL은 Compose 안쪽에서 5432 포트로만 동작합니다. 즉 DB는 외부로 노출하지 않고, DB에 해당하는 서비스 이름인 postgres-db:5432로 다른 내부 컨테이너에서 연결할 수 있습니다.
컨테이너마다 호스트 포트를 뚫어 주고 host.docker.internal로 우회하던 방식과 비교하면, 묶는 것만으로 통신 경로가 단순해집니다.
'IT·테크 > 인프라' 카테고리의 다른 글
| Docker Compose에서 .env 파일 하나만 바꿔 끼우기 (0) | 2026.07.28 |
|---|---|
| Docker External Config — 환경 변수로 이미지 밖에서 설정 주입하기 (0) | 2026.07.28 |
| Docker 이미지와 컨테이너 — Spring Boot 앱으로 직접 만들어 보기 (2) | 2026.07.25 |
| Docker Desktop 설치 — 윈도우에서 WSL2와 Hyper-V가 하는 일 (0) | 2026.07.24 |
| 컨테이너와 Docker — 가상화의 단위가 애플리케이션으로 내려온다 (0) | 2026.07.23 |