관련 이미지 몇 장 골랐어요. 블로그에 삽입하시면 해당 내용을 시각적으로 보강하는 데 유용할 겁니다.
원하시면 각 이미지별로 설명 문구도 같이 만들어드릴까요?
도커를 처음 쓸 때는 단일 애플리케이션 하나를 컨테이너로 감싸서 띄우는 게 전부였습니다.
예를 들어 백엔드 서버 하나를 docker run으로 띄우고,
필요하면 docker exec으로 들어가서 로그를 확인하는 식이었죠.
그런데 프로젝트가 커지면 이야기가 달라집니다.
백엔드, 프론트엔드, DB, 캐시 서버까지 한꺼번에 구동해야 하고
이 모든 컨테이너가 네트워크로 연결되어야 하죠.
이걸 일일이 docker run으로 띄우다 보면 금방 정신이 나갑니다.
그때 등장하는 게 바로 Docker Compose입니다.
Compose가 필요한 순간

이전 회사에서 처음 도커를 도입했을 때,
“백엔드와 DB를 함께 도커로 묶어서 배포하자”는 이야기가 나왔습니다.
처음엔 단순히 아래처럼 실행했죠.
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=1234 mysql:8
docker run -d --name backend --link mysql:mysql backend:latest
잘 돌아가는 것 같았는데,
이후 다른 개발자가 DB 이름을 바꾸거나 포트를 바꿔버리면
다시 docker run 명령을 수정해야 했습니다.
결국 매번 실행 옵션을 기억하고 공유하는 게 너무 귀찮았죠.
이때 “아예 설정을 문서로 관리하자”는 생각이 나왔고,
그 문서를 대신하는 게 바로 docker-compose.yml 파일이었습니다.
docker-compose.yml 구조
Compose는 yaml 형식의 설정 파일로 컨테이너 실행 방식을 정의합니다.
예를 들어 이런 식이죠.
version: "3"
services:
db:
image: mysql:8
environment:
- MYSQL_ROOT_PASSWORD=1234
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- db
volumes:
db_data:
이 파일을 한 줄로 실행할 수 있습니다.
docker compose up -d
이 한 명령으로 데이터베이스, 백엔드 서버가 순서대로 띄워지고
서로 같은 네트워크에서 자동으로 통신할 수 있게 됩니다.
이걸 처음 봤을 때 진짜 신세계였습니다.
Compose의 진짜 강점은 “협업”
Compose의 가장 큰 장점은 협업에서 드러납니다.
예를 들어 팀원이 새로 합류했을 때,
과거에는 “MySQL 버전 몇 써요?”, “환경 변수 어디 있어요?” 같은 질문이 쏟아졌습니다.
이제는 그냥 이렇게 말합니다.
“docker compose up 한 줄이면 끝이에요.”
이 한 줄에 환경 설정, 포트 매핑, 네트워크 구성이 전부 들어 있습니다.
덕분에 로컬 개발 환경을 맞추는 데 걸리는 시간이 하루에서 5분으로 줄었습니다.
Compose에서 자주 하는 실수
저도 초기에 몇 가지 실수를 자주 했습니다.
- depends_on을 추가하지 않아 DB보다 서버가 먼저 실행되는 문제
- 로컬 코드 변경이 반영되지 않아서 매번 docker compose build를 다시 해야 했던 문제
- volume을 잘못 지정해서 로컬 DB 데이터가 날아간 문제
이 중에서 가장 큰 실수는 “코드 수정이 반영 안 되는 문제”였습니다.
그 이유는 단순히 Dockerfile에 COPY . .을 써뒀기 때문이죠.
개발 환경에서는 볼륨 마운트를 통해
로컬 소스가 컨테이너 내부에 바로 반영되게 해야 합니다.
volumes:
- ./backend:/app
이 한 줄을 추가하니, 코드 수정 즉시 서버가 리로드되어
Compose를 훨씬 유연하게 쓸 수 있었습니다.
Compose는 결국 “환경 문서화 도구”

결국 Docker Compose는 단순히 여러 컨테이너를 띄우는 도구가 아닙니다.
**“환경을 코드로 문서화하는 도구”**입니다.
누가 봐도 동일한 환경이 재현되고,
서버 설정이 코드로 기록된다는 점이 가장 큽니다.
이게 가능한 이유는 Compose가
컨테이너 실행 설정을 모두 yaml로 정의하고,
그대로 커밋해서 팀원이 동일한 환경을 만들 수 있기 때문입니다.
마무리 전, 실무에서 느낀 팁
- 각 서비스의 이름은 실제 도메인 네임처럼 짓는 게 좋다 (backend, db, cache 등).
- 공통 네트워크를 사용하면 서비스 간 통신이 훨씬 안정적이다.
- Compose 파일 버전 3 이상을 사용하는 걸 추천한다 (리소스 제한 등 추가 기능 지원).
'docker' 카테고리의 다른 글
| 도커 이미지 최적화 — 용량을 줄이고 속도를 높이기 (0) | 2025.11.12 |
|---|---|
| 도커 이미지와 컨테이너, 뭐가 다른 걸까 (0) | 2025.11.12 |
| Dockerfile 이해하기 — 이미지가 만들어지는 과정 (0) | 2025.11.12 |
| 도커로 무중단 배포(Blue-Green Deployment) 구현하기 (0) | 2025.11.12 |
| 도커와 CI/CD — 자동으로 빌드하고 배포하기 (0) | 2025.11.12 |