🚀 강의 목표
- Docker Compose의 기본 개념과 설치 방법을 이해합니다.
- docker-compose.yml 파일 작성법을 익히고, 여러 서비스를 동시에 구동하는 방법을 학습합니다.
- 실습 예제를 통해 웹 서버 + DB + 캐시 등 멀티 컨테이너 환경을 구축합니다.
- Compose 파일 작성 시 발생할 수 있는 오류를 Tip 형태로 해결책과 함께 소개합니다.
🧐 Docker Compose란 무엇인가?
Docker Compose는 여러 컨테이너를 한 번에 정의하고 실행할 수 있는 선언적 구성 도구입니다.
- 장점
- 서비스 단위 관리: 웹 서버, DB, 캐시 등을 서비스(Service) 단위로 구분하여, 한 파일(docker-compose.yml)에서 통합 관리.
- 재현성: 모든 설정이 하나의 YAML 파일로 정의되므로, 동일한 환경을 누구나 쉽게 재현할 수 있음.
- 의존성 처리: 서비스 간 의존성(예: DB가 구동된 후 웹 서버 실행)을 선언적으로 설정 가능.
Tip: 개발 환경에서의 Compose
개발자들이 “웹 + DB” 구조를 로컬에서 테스트할 때 자주 사용합니다. 배포 환경에서는 Swarm이나 Kubernetes 같은 오케스트레이션 툴을 쓸 수도 있지만, 작은 규모의 프로젝트라면 Compose만으로도 충분한 경우가 많습니다.
🏗️ Docker Compose 설치하기
1. Docker Desktop 사용자
- Windows/macOS에서 Docker Desktop을 설치하면 자동으로 Compose가 포함되어 있습니다.
- docker compose version 명령으로 확인해 보세요.
2. Linux 사용자
- Ubuntu (예시)
sudo apt-get update sudo apt-get install docker-compose-plugin
- Compose 플러그인 버전이 설치된 후, 아래 명령으로 확인합니다:
docker compose version
Tip: Legacy 버전 vs 플러그인 버전
예전에는 pip install docker-compose 방식으로 설치했지만, Docker CLI 플러그인 형태가 표준화되면서 docker compose 명령을 사용하는 방식을 권장합니다.
📝 docker-compose.yml 기본 구조
version: "3.8"
services:
<서비스이름>:
image: <이미지>
container_name: <컨테이너이름>
ports:
- "호스트포트:컨테이너포트"
volumes:
- "볼륨명/바인드마운트:컨테이너경로"
environment:
- KEY=VALUE
depends_on:
- <다른서비스>
networks:
<네트워크이름>:
driver: bridge
volumes:
<볼륨이름>:
driver: local
- version: Compose 파일 버전(최신은 보통 “3.8” 사용).
- services: 멀티 컨테이너를 정의하는 핵심 섹션.
- networks: 사용자 정의 네트워크 정의 가능.
- volumes: 볼륨 정의.
🏃 실습 예제: 웹 + DB + 캐시 구성
이번 실습에서는 Nginx(웹 서버), MySQL(데이터베이스), Redis(캐시)를 한 번에 실행하는 구성 예시를 만들어 봅니다.
1. 디렉터리 구조
my-docker-project/
├─ docker-compose.yml
└─ index.html (Nginx에서 서빙할 간단한 웹 페이지)
- index.html은 예시로 “Hello from Docker Compose” 등의 내용을 담고 있는 HTML 파일이라고 가정합니다.
2. docker-compose.yml 작성
version: "3.8"
services:
nginx:
image: nginx:latest
container_name: my-nginx
ports:
- "8080:80"
volumes:
- ./index.html:/usr/share/nginx/html/index.html
depends_on:
- db
- redis
db:
image: mysql:5.7
container_name: my-mysql
environment:
- MYSQL_ROOT_PASSWORD=my-secret-pw
volumes:
- mysql-data:/var/lib/mysql
ports:
- "3306:3306"
redis:
image: redis:latest
container_name: my-redis
ports:
- "6379:6379"
volumes:
mysql-data:
driver: local
- nginx 서비스: 로컬 index.html 파일을 컨테이너 /usr/share/nginx/html/index.html로 바인드 마운트.
- db 서비스 (MySQL): mysql-data 볼륨을 사용해 DB 데이터 영속성 보장.
- redis 서비스: 캐시용. 별도 볼륨 없이 기본 컨테이너 저장소 사용.
- depends_on: nginx는 db, redis가 먼저 실행되길 기대한다는 의존성 설정.
Tip: depends_on은 순서 보장만
depends_on은 단순히 “실행 순서”만 보장합니다. MySQL이 진짜 ‘준비 완료’ 상태(접속 가능)에 대한 보장은 아니므로, 확실한 의존성 처리를 위해서는 healthcheck 설정이나 재시도 로직이 필요할 수 있습니다.
3. Compose 실행 및 확인
3.1 실행
docker compose up -d
- -d: 백그라운드 모드로 실행.
- 결과: 모든 서비스가 자동으로 실행되면서, 아래와 같은 컨테이너가 동시에 기동합니다.
3.2 컨테이너 상태 확인
docker compose ps
- 각 서비스(nginx, my-mysql, my-redis)의 State, Ports 등을 확인할 수 있습니다.
3.3 웹 페이지 접속
- 브라우저에서 http://localhost:8080 으로 접속하면 index.html 내용이 보이면서, “Hello from Docker Compose” 문구가 표시될 것입니다. 🎉
Tip: 바인드 마운트 수정 반영
index.html 파일을 수정하면 컨테이너 내부 파일도 즉시 변경됩니다. 웹 브라우저를 새로고침해 보세요. 이는 개발 환경에서 매우 유용합니다.
⚙️ Docker Compose 명령어
- 서비스 시작:
docker compose up -d
- 서비스 중지:
docker compose down
- 컨테이너가 모두 중지되고 삭제됩니다(볼륨, 네트워크 등은 남거나 삭제될 수 있으니 옵션 확인 필요).
- 로그 확인:
docker compose logs -f
- 여러 서비스의 로그를 실시간으로 모니터링.
- 규모 확장(스케일링):
docker compose up -d --scale nginx=3
- Nginx 컨테이너를 3개로 복제 실행(단, 프록시나 로드밸런서 설정 추가 필요).
Tip: down 시 볼륨 삭제
docker compose down -v 옵션을 사용하면, 현재 프로젝트에서 생성된 볼륨도 함께 삭제됩니다. 중요한 데이터가 들어 있는 볼륨이면 주의하세요!
🛠️ 실습 중 발생할 수 있는 오류 및 해결 (Tip)
1. 포트 충돌
- 현상: docker compose up 시 “port is already allocated” 오류 발생.
- 이유: 8080, 3306, 6379 같은 포트를 이미 사용 중인 컨테이너가 있음.
- 해결:
- 기존 컨테이너 중지/삭제
docker stop <기존_컨테이너_ID> docker rm <기존_컨테이너_ID>
- docker-compose.yml에서 다른 포트 할당(예: "8081:80").
- 기존 컨테이너 중지/삭제
2. MySQL 초기 설정 문제
- 현상: MySQL 컨테이너가 곧바로 종료되거나 Access denied for user 'root'@'...’ 메시지 출력.
- 이유: 이미 mysql-data 볼륨이 다른 환경에서 생성되어 권한 충돌이 생겼을 수 있음.
- 해결:
- docker compose down -v로 기존 볼륨을 삭제 후 재시작,
- 또는 볼륨 이름을 바꿔 새로 생성.
3. 파일 권한 오류 (바인드 마운트)
- 현상: Nginx 컨테이너에서 /usr/share/nginx/html/index.html에 접근할 때 Permission Denied.
- 해결:
- 호스트의 해당 파일 권한 변경 (Linux라면 chmod 644 index.html 등).
- macOS/Windows 환경에서는 Docker Desktop의 파일 공유 설정을 확인.
📝 정리
- 멀티 컨테이너 환경
- docker-compose.yml 한 장으로 여러 서비스를 정의해 개발 및 운영 환경을 표준화할 수 있습니다.
- 각각의 컨테이너를 독립적인 서비스로 바라보고, 네트워크와 볼륨을 통해 연결/공유합니다.
- 개발 vs 운영
- 개발환경에서는 바인드 마운트를 통해 소스 수정 → 즉시 반영이 편리.
- 운영환경에서는 보안과 신뢰성을 위해 이미지 + 볼륨 방식으로 더 안전하게 구성.
- 부가 기능
- depends_on으로 단순 실행 순서를 지정하거나, healthcheck를 통해 좀 더 정교하게 의존성을 관리할 수 있습니다.
- --scale 옵션을 활용하여 간단한 수평 확장 실습도 가능합니다(단, 실제 로드밸런싱을 하려면 추가 설정이 필요).
🎯 다음 강의 예고
다음 강의에서는 Docker 배포 전략: 이미지 최적화와 Private Registry 활용을 다룹니다.
- 멀티스테이지 빌드로 이미지 크기 줄이기
- Docker Registry(프라이빗 레지스트리) 설정과 활용
- CI/CD 파이프라인과 Docker의 연동 개념
Compose를 통해 더욱 편리해진 멀티 컨테이너 환경, 이제 배포 전략도 업그레이드해 봅시다! 😊
더 알아보기: Docker 공식 문서 - Compose
'소프트웨어 개발 > Docker' 카테고리의 다른 글
🐳 Docker 강의 7강: Docker 배포 전략 – 이미지 최적화와 Private Registry 활용 (0) | 2025.01.27 |
---|---|
🐳 Docker 강의 5강: Docker 볼륨과 데이터 관리 (0) | 2025.01.27 |
🐳 Docker 강의 4강: Docker 네트워킹 (0) | 2025.01.27 |
🐳 Docker 강의 2강: Docker 이미지와 컨테이너 기본 사용법 (0) | 2025.01.27 |
🐳 Docker 강의 3강: Dockerfile을 이용한 커스텀 이미지 생성 (0) | 2025.01.27 |