DockerCompose사용법 완벽 가이드 – 초보자도 쉽게 따라하는 단계별 설정법
개발 환경 설정 때문에 하루 종일 시간을 낭비한 경험이 있으신가요? 팀원마다 다른 환경으로 인해 “내 컴퓨터에서는 잘 되는데”라는 말을 자주 듣고 계신가요? DockerCompose사용법을 익히면 이런 문제들을 한 번에 해결할 수 있습니다. 이 글에서는 Docker 초보자도 쉽게 따라할 수 있는 실전 가이드를 제공합니다.
목차
Docker Compose란 무엇인가
Docker Compose는 여러 개의 Docker 컨테이너를 하나의 서비스로 정의하고 관리하는 도구입니다. DockerCompose사용법을 익히면 복잡한 다중 컨테이너 애플리케이션을 간단하게 배포하고 관리할 수 있습니다.
왜 Docker Compose가 필요한가
기존 Docker 사용법으로는 각 컨테이너를 개별적으로 실행해야 했습니다. 예를 들어 웹 서버, 데이터베이스, 캐시 서버가 필요한 프로젝트라면 세 개의 명령어를 각각 실행해야 했죠.
docker run -d --name db mysql:8.0
docker run -d --name redis redis:7
docker run -d --name web nginx:latest
하지만 DockerCompose사용법을 활용하면 단 하나의 명령어로 모든 서비스를 실행할 수 있습니다.
docker-compose up -d
Docker Compose의 주요 장점
- 환경 일관성: 개발, 테스트, 프로덕션 환경이 동일합니다
- 간편한 배포: 한 번의 명령으로 전체 서비스 배포가 가능합니다
- 네트워킹 자동화: 컨테이너 간 네트워크 설정이 자동으로 처리됩니다
- 스케일링: 서비스 인스턴스 수를 쉽게 조절할 수 있습니다
설치 및 준비사항
DockerCompose사용법을 익히기 전에 필요한 도구들을 설치해보겠습니다.
Docker 설치 확인
먼저 Docker가 설치되어 있는지 확인합니다.
docker --version
만약 Docker가 설치되어 있지 않다면, 공식 홈페이지에서 Docker Desktop을 다운로드하여 설치하세요.
Docker Compose 설치
최신 버전의 Docker Desktop에는 Docker Compose가 함께 설치됩니다. 설치 확인은 다음 명령어로 할 수 있습니다.
docker-compose --version
개발 환경 준비
DockerCompose사용법 실습을 위해 다음과 같은 디렉토리 구조를 만들어보겠습니다.
my-docker-project/
├── docker-compose.yml
├── app/
│ ├── Dockerfile
│ └── app.py
└── nginx/
└── nginx.conf
기본 설정 파일 작성법
DockerCompose사용법의 핵심은 docker-compose.yml 파일 작성입니다. 이 파일에서 모든 서비스를 정의합니다.
docker-compose.yml 기본 구조
가장 간단한 형태의 설정 파일을 살펴보겠습니다.
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: myapp
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
설정 파일 구성 요소 설명
version: Docker Compose 파일 형식 버전을 지정합니다. 최신 기능을 사용하려면 ‘3.8’ 이상을 권장합니다.
services: 각 컨테이너를 서비스 단위로 정의합니다. DockerCompose사용법에서 가장 중요한 섹션입니다.
volumes: 데이터 영속성을 위한 볼륨을 정의합니다.
환경 변수 설정
Docker설정에서 환경 변수는 매우 중요합니다. 다양한 방법으로 환경 변수를 설정할 수 있습니다.
services:
app:
image: myapp:latest
environment:
- NODE_ENV=production
- DATABASE_URL=mysql://user:pass@db:3306/myapp
env_file:
- .env
실전 예제로 배우는 사용법
이제 실제 웹 애플리케이션을 구축하면서 DockerCompose사용법을 익혀보겠습니다.
예제 1: WordPress 블로그 구축
WordPress와 MySQL 데이터베이스를 함께 실행하는 예제입니다.
version: '3.8'
services:
wordpress:
image: wordpress:latest
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress_data:/var/www/html
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
MYSQL_ROOT_PASSWORD: rootpassword
volumes:
- db_data:/var/lib/mysql
volumes:
wordpress_data:
db_data:
이 설정으로 DockerCompose사용법을 실습해보세요.
# 서비스 실행
docker-compose up -d
# 서비스 상태 확인
docker-compose ps
# 로그 확인
docker-compose logs wordpress
예제 2: Node.js + Redis + MongoDB 스택
더 복잡한 예제로 Node.js 애플리케이션을 구축해보겠습니다.
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=development
- REDIS_URL=redis://redis:6379
- MONGODB_URL=mongodb://mongo:27017/myapp
depends_on:
- redis
- mongo
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
redis:
image: redis:7-alpine
ports:
- "6379:6379"
mongo:
image: mongo:5
ports:
- "27017:27017"
environment:
- MONGO_INITDB_DATABASE=myapp
volumes:
- mongo_data:/data/db
volumes:
mongo_data:
서비스 간 통신 설정
DockerCompose사용법에서 중요한 부분은 서비스 간 통신입니다. 각 서비스는 서비스명으로 서로를 찾을 수 있습니다.
// Node.js 애플리케이션에서 MongoDB 연결
const mongoose = require('mongoose');
mongoose.connect('mongodb://mongo:27017/myapp');
// Redis 연결
const redis = require('redis');
const client = redis.createClient({
host: 'redis',
port: 6379
});
고급 설정과 옵션들
DockerCompose사용법을 더 깊이 이해하기 위해 고급 설정들을 알아보겠습니다.
네트워크 설정
사용자 정의 네트워크를 만들어 보안과 격리를 강화할 수 있습니다.
version: '3.8'
services:
frontend:
image: nginx:latest
networks:
- frontend-network
- backend-network
backend:
image: node:16-alpine
networks:
- backend-network
- database-network
database:
image: postgres:13
networks:
- database-network
networks:
frontend-network:
driver: bridge
backend-network:
driver: bridge
database-network:
driver: bridge
internal: true
헬스체크 설정
서비스 상태를 모니터링하는 헬스체크를 설정할 수 있습니다.
services:
web:
image: nginx:latest
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
리소스 제한
컨테이너의 리소스 사용량을 제한하는 것도 중요한 DockerCompose사용법입니다.
services:
app:
image: myapp:latest
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
성능 최적화 방법
DockerCompose사용법을 익힌 후에는 성능 최적화도 고려해야 합니다.
이미지 최적화
멀티 스테이지 빌드를 활용하여 이미지 크기를 줄입니다.
# 빌드 스테이지
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
# 실행 스테이지
FROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
CMD ["node", "app.js"]
볼륨 캐싱 전략
개발 환경에서는 바인드 마운트를, 프로덕션에서는 네임드 볼륨을 사용합니다.
services:
app:
image: myapp:latest
volumes:
# 개발용 바인드 마운트
- .:/usr/src/app:cached
# 프로덕션용 네임드 볼륨
- app_data:/usr/src/app/data
빌드 캐시 활용
Docker 레이어 캐싱을 효과적으로 활용합니다.
FROM node:16-alpine
WORKDIR /app
# 의존성 파일만 먼저 복사
COPY package*.json ./
RUN npm ci
# 애플리케이션 코드 복사
COPY . .
CMD ["npm", "start"]
자주 발생하는 문제 해결법
DockerCompose사용법을 익히는 과정에서 자주 마주치는 문제들과 해결 방법을 알아보겠습니다.
포트 충돌 문제
이미 사용 중인 포트로 인한 오류를 해결하는 방법입니다.
# 포트 사용 확인
netstat -tulpn | grep :8080
# 다른 포트로 변경
docker-compose down
# docker-compose.yml에서 포트 변경 후
docker-compose up -d
볼륨 권한 문제
Linux 환경에서 볼륨 권한 문제가 발생할 때의 해결법입니다.
services:
app:
image: myapp:latest
user: "${UID:-1000}:${GID:-1000}"
volumes:
- ./data:/app/data
네트워크 연결 오류
서비스 간 통신이 되지 않을 때의 해결 방법입니다.
# 네트워크 상태 확인
docker network ls
docker network inspect myproject_default
# 컨테이너 네트워크 연결 확인
docker exec -it container_name ping other_service_name
메모리 부족 문제
컨테이너 메모리 사용량을 모니터링하고 제한하는 방법입니다.
# 컨테이너 리소스 사용량 확인
docker stats
# 메모리 제한 설정
services:
app:
image: myapp:latest
mem_limit: 512m
memswap_limit: 1g
로그 관리
로그가 계속 쌓여서 디스크 공간을 차지하는 문제를 해결합니다.
services:
app:
image: myapp:latest
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
FAQ
Q: DockerCompose사용법에서 환경별로 다른 설정을 사용하려면 어떻게 하나요?
여러 개의 compose 파일을 조합하여 사용할 수 있습니다.
# 기본 설정 + 개발 환경
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up
# 기본 설정 + 프로덕션 환경
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
개발용 설정 파일 예시:
# docker-compose.dev.yml
version: '3.8'
services:
app:
volumes:
- .:/usr/src/app
environment:
- NODE_ENV=development
Q: Docker 사용법에서 데이터베이스 데이터를 백업하려면 어떻게 하나요?
볼륨을 이용한 백업 방법입니다.
# MySQL 백업
docker-compose exec db mysqldump -u root -p database_name > backup.sql
# PostgreSQL 백업
docker-compose exec db pg_dump -U username database_name > backup.sql
# 볼륨 전체 백업
docker run --rm -v myproject_db_data:/data -v $(pwd):/backup alpine tar czf /backup/backup.tar.gz -C /data .
Q: Docker설정에서 SSL/HTTPS를 적용하려면 어떻게 하나요?
Nginx 컨테이너를 프록시로 사용하여 SSL을 설정할 수 있습니다.
services:
nginx:
image: nginx:alpine
ports:
- "443:443"
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/ssl/certs
depends_on:
- app
app:
image: myapp:latest
expose:
- "3000"
Q: 초보자가이드로 Docker Compose 학습 순서를 추천해주세요.
다음 순서로 학습하시면 효과적입니다:
- 기본 개념 이해: Docker와 컨테이너 개념 학습
- 단일 서비스 실행: 간단한 웹 서버 컨테이너 실행
- 다중 서비스 구성: 웹 서버 + 데이터베이스 조합
- 네트워킹 이해: 서비스 간 통신 방법 학습
- 볼륨 관리: 데이터 영속성 구현
- 환경 변수 활용: 설정 관리 방법
- 실전 프로젝트: 실제 애플리케이션 구축
Q: DockerCompose사용법에서 성능 모니터링은 어떻게 하나요?
다양한 모니터링 도구를 Docker Compose로 구성할 수 있습니다.
services:
app:
image: myapp:latest
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
기본 모니터링 명령어:
# 컨테이너 리소스 사용량 실시간 확인
docker-compose exec app top
# 로그 실시간 확인
docker-compose logs -f app
# 컨테이너 상태 확인
docker-compose ps
결론
이 글에서는 DockerCompose사용법의 기초부터 고급 활용법까지 체계적으로 다뤄보았습니다. Docker설정의 핵심 개념부터 실전 예제, 트러블슈팅까지 초보자가이드로 구성했으니 단계별로 따라 해보시기 바랍니다.
핵심 포인트를 요약하면 다음과 같습니다:
- Docker Compose는 다중 컨테이너 애플리케이션을 쉽게 관리하는 도구입니다
- docker-compose.yml 파일로 모든 서비스를 정의하고 관리합니다
- 네트워킹과 볼륨 관리가 자동화되어 개발 효율성이 크게 향상됩니다
- 환경별 설정 분리와 스케일링이 용이합니다
- 적절한 최적화와 모니터링으로 안정적인 서비스 운영이 가능합니다
지금 바로 첫 번째 Docker Compose 프로젝트를 시작해보세요. 개발 환경 설정 때문에 고민하는 시간을 줄이고, 더 중요한 비즈니스 로직 개발에 집중할 수 있을 것입니다.