DockerCompose사용법 완벽 가이드 – 초보자도 10분만에 마스터

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의 주요 장점

  1. 환경 일관성: 개발, 테스트, 프로덕션 환경이 동일합니다
  2. 간편한 배포: 한 번의 명령으로 전체 서비스 배포가 가능합니다
  3. 네트워킹 자동화: 컨테이너 간 네트워크 설정이 자동으로 처리됩니다
  4. 스케일링: 서비스 인스턴스 수를 쉽게 조절할 수 있습니다

설치 및 준비사항

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 학습 순서를 추천해주세요.

다음 순서로 학습하시면 효과적입니다:

  1. 기본 개념 이해: Docker와 컨테이너 개념 학습
  2. 단일 서비스 실행: 간단한 웹 서버 컨테이너 실행
  3. 다중 서비스 구성: 웹 서버 + 데이터베이스 조합
  4. 네트워킹 이해: 서비스 간 통신 방법 학습
  5. 볼륨 관리: 데이터 영속성 구현
  6. 환경 변수 활용: 설정 관리 방법
  7. 실전 프로젝트: 실제 애플리케이션 구축

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 프로젝트를 시작해보세요. 개발 환경 설정 때문에 고민하는 시간을 줄이고, 더 중요한 비즈니스 로직 개발에 집중할 수 있을 것입니다.

위로 스크롤