Docker 기본: Docker Compose
Docker Compose란 무엇인가?
2025년 5월 7일
조회 1
✅ Docker Compose란?
Docker Compose는 여러 개의 Docker 컨테이너를 하나의 파일로 정의하고, 한 번에 실행·관리할 수 있게 해주는 도구이다.
조금 더 풀어서 말하면:
-
보통 하나의 애플리케이션은 여러 서비스로 구성된다.
(예: 웹 서버 + 데이터베이스 + 캐시 서버)
-
이때 각각을 따로
docker run명령으로 하나하나 띄우는 건 굉장히 번거롭다. -
그래서,
- 어떤 컨테이너를,
- 어떤 이미지로,
- 어떤 환경변수 설정으로,
- 어떤 포트를 열고,
- 서로 어떻게 연결할지,
-
이런 모든 것을
docker-compose.yml이라는 파일에 한 번에 정의하는 것이다. -
그리고
docker compose up한 줄로 모든 서비스를 한꺼번에 실행할 수 있다.
📚 예시
웹 서버 + 데이터베이스 구성 시 일반 Docker 명령 방식
docker run -d --name db -e MYSQL_ROOT_PASSWORD=root mysql:5.7
docker run -d --name web -p 8080:80 --link db:mysql nginx
→ 컨테이너가 2개 이상이면 명령어 관리가 복잡해짐.
Docker Compose로 쓰면
docker-compose.yml
version: "3"
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
web:
image: nginx
ports:
- "8080:80"
depends_on:
- db
그리고 터미널에서는 단 한 줄:
docker compose up -d
→ 웹 서버와 DB가 동시에 연결되어 실행된다.
✅ Docker Compose를 쓰면 뭐가 좋은가?
| 항목 | 설명 |
|---|---|
| 실행 자동화 | 여러 컨테이너를 한 번에 실행하고 관리할 수 있다 |
| 설정 일원화 | docker-compose.yml 하나만 수정하면 서비스 전체 설정 관리 가능 |
| 코드처럼 관리 | YAML 파일이기 때문에 Git 버전 관리가 가능하다 |
| 네트워킹 자동화 | 컨테이너끼리 자동으로 내부 네트워크로 연결된다 (link 따로 안 걸어도 됨) |
| 포트, 볼륨, 환경변수 설정 편리 | 명령어로 일일이 입력할 필요 없이 파일에 모두 정리해놓을 수 있다 |
| 복잡한 앱 아키텍처 지원 | 마이크로서비스, 풀스택 앱 등을 깔끔하게 정의할 수 있다 |
| 테스트 환경 구축 | 개발/테스트 서버를 쉽게 똑같이 재현할 수 있다 (로컬=서버 환경 일치) |
🔥 Docker Compose를 꼭 쓰는 대표적인 상황
- 웹 서버 + DB 서버 + 캐시 서버를 동시에 구성해야 할 때
- 마이크로서비스(수십 개 API) 환경을 관리할 때
- 개발환경(로컬)과 프로덕션 환경(서버)을 일치시킬 때
- 테스트 환경을 매번 손쉽게 초기화하고 복원할 때
- DevOps 자동화(CI/CD 파이프라인 구축)에 연동할 때
🎯 요약
Docker Compose는 복잡한 Docker 컨테이너 구성을 코드화(YAML)해서 한 번에 실행하고 관리하는 도구다.
단일 명령어로 전체 애플리케이션 아키텍처를 자동화하고 재현할 수 있게 한다.
✅ 사용 명령어 기본 정리
| 명령어 | 설명 |
|---|---|
docker compose up -d | docker-compose.yml을 기준으로 모든 컨테이너를 생성/실행 (백그라운드) |
docker compose down | 생성된 모든 컨테이너, 네트워크, 볼륨 제거 |
docker compose ps | 실행 중인 서비스 목록 보기 |
docker compose logs | 서비스 로그 보기 |
docker compose build | 변경된 이미지 다시 빌드 |
🧠 추가로 알아두면 좋은 점
- 최신 Docker 버전(Docker 20.10 이상)에서는
docker-compose명령어가 →docker compose(띄어쓰기)로 통합되었다. - docker-compose.yml 파일은 항상 현재 디렉토리에 있어야 자동으로 인식한다.
- 각 컨테이너는 **자동으로 별도의 네트워크(docker network)**에 묶인다. (내부 통신 자동 지원)
✅ Docker Compose 실전 예시
🛠️ 상황 설정
- 웹 서버: Node.js로 간단한 API 서버
- 데이터베이스: MySQL 5.7
- 요구사항:
- Node.js 서버가 MySQL에 연결해야 한다.
- 두 컨테이너를 하나의 명령어로 동시에 띄운다.
- 외부에서는 Node.js 서버에만 접근 가능하게 한다.
📄 docker-compose.yml 예시
version: "3.9" # docker compose 파일 버전
services:
db:
image: mysql:5.7
container_name: mysql-db
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: myappdb
MYSQL_USER: myappuser
MYSQL_PASSWORD: myapppassword
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
app:
build: ./app # app 폴더에 Dockerfile이 있다고 가정
container_name: node-app
restart: always
ports:
- "3000:3000"
environment:
DB_HOST: db
DB_USER: myappuser
DB_PASSWORD: myapppassword
DB_DATABASE: myappdb
depends_on:
- db
volumes:
db_data:
🧩 구성 해설
| 항목 | 설명 |
|---|---|
services | 실행할 컨테이너 정의 (db, app) |
image | 사용할 Docker Hub 이미지 (mysql:5.7) |
build | 직접 빌드할 앱 (Node.js 앱 Dockerfile 경로) |
container_name | 컨테이너 이름 지정 |
restart: always | 서버 재부팅해도 자동 재시작 |
environment | 컨테이너에 전달할 환경변수 설정 |
ports | 호스트와 컨테이너 간 포트 매핑 |
depends_on | db가 먼저 준비된 후 app이 실행되도록 설정 |
volumes | MySQL 데이터가 날아가지 않도록 데이터 영속화 |
🖥️ 디렉토리 구조 예시
project-root/
├── docker-compose.yml
└── app/
├── Dockerfile
├── package.json
└── index.js
app/폴더 안에 Node.js 서버 소스코드와 Dockerfile이 있는 구조입니다.
🛠️ app/Dockerfile 예시 (Node.js 서버용)
FROM node:18
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
🚀 실행 방법
1. docker-compose.yml 파일이 있는 경로로 이동
cd project-root/
2. 전체 서비스 빌드 + 실행
docker compose up -d
d옵션은 백그라운드 모드 실행 (detached)
3. 컨테이너 상태 확인
docker compose ps
- db와 app 컨테이너가 모두 떠 있는지 확인
✅ 실행 결과
- Node.js 앱은
서버IP:3000으로 접근 가능 - Node.js 앱은 내부적으로
db라는 이름으로 MySQL에 접속 가능 (Compose가 내부 네트워킹을 자동 연결해줌) - MySQL 데이터는
db_data볼륨에 안전하게 저장됨
📚 최종 흐름 요약
docker-compose.yml 작성
↓
Dockerfile 준비 (app 서버용)
↓
docker compose up -d
↓
모든 컨테이너 자동 생성 + 실행
↓
서비스 운영
🎯 최종 결론
Docker Compose는 여러 컨테이너를 하나의 파일로 정의하고,
한 번에 생성/실행/관리할 수 있게 하는 최고의 방법이다.
실전에서는 웹 서버 + DB 같이 여러 서비스를 구성할 때 필수로 사용된다.
댓글