웹 서비스를 위한 Docker Compose 마스터 가이드

DockerBeginner
지금 연습하기

소개

이 포괄적인 튜토리얼은 다중 컨테이너 Docker 애플리케이션을 정의하고 관리하는 강력한 도구인 Docker Compose 를 탐구합니다. 개발자 및 DevOps 전문가를 위해 설계된 이 가이드는 확장 가능하고 효율적인 컨테이너화된 환경을 만드는 데 필요한 핵심 개념, 구성 기술 및 실용적인 구현 전략을 다룹니다.

Docker Compose 기본

Docker Compose 소개

Docker Compose 는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하는 강력한 도구입니다. 컨테이너 오케스트레이션의 핵심 구성 요소로서, 개발자는 단일 YAML 구성 파일을 사용하여 복잡한 애플리케이션 환경을 구성하고 관리할 수 있습니다.

핵심 개념 및 아키텍처

Docker Compose 는 선언적 (declarative) 접근 방식을 통해 여러 개의 상호 연결된 컨테이너를 관리하는 프로세스를 단순화합니다. 주요 구성 요소는 다음과 같습니다.

구성 요소 설명
docker-compose.yml 서비스, 네트워크 및 볼륨을 정의하는 구성 파일
서비스 애플리케이션을 구성하는 개별 컨테이너
네트워크 컨테이너 간의 통신 채널
볼륨 지속적인 데이터 저장 메커니즘
graph TD
    A[Docker Compose] --> B[docker-compose.yml]
    B --> C[Service 1]
    B --> D[Service 2]
    B --> E[Service 3]
    C --> F[Network]
    D --> F
    E --> F

실용적인 예: 웹 애플리케이션 설정

다음은 일반적인 웹 애플리케이션에 대한 Docker Compose 구성을 보여주는 포괄적인 예입니다.

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./website:/usr/share/nginx/html
  database:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: mysecretpassword
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

코드 분석

  1. version: '3.8': Docker Compose 파일 형식을 지정합니다.
  2. services: 개별 컨테이너를 정의합니다.
  3. web: Nginx 웹 서버 구성
    • 포트 80 을 매핑합니다.
    • 로컬 웹사이트 파일을 마운트합니다.
  4. database: PostgreSQL 데이터베이스 구성
    • 환경 변수를 설정합니다.
    • 데이터 저장을 위한 지속적인 볼륨을 만듭니다.

Docker Compose 의 주요 이점

  • 다중 컨테이너 애플리케이션 관리 단순화
  • 일관된 개발 및 프로덕션 환경
  • 수평 확장 용이
  • 선언적 인프라 구성

명령줄 작업

컨테이너 관리를 위한 필수 Docker Compose 명령어:

명령어 기능
docker-compose up 정의된 모든 서비스 시작
docker-compose down 컨테이너 중지 및 제거
docker-compose ps 실행 중인 컨테이너 목록
docker-compose logs 컨테이너 로그 보기

Docker Compose 를 활용하여 개발자는 최소한의 구성 오버헤드로 복잡한 컨테이너화된 애플리케이션을 효율적으로 관리할 수 있습니다.

구성 및 서비스

YAML 구성 구조

Docker Compose 는 YAML 파일을 사용하여 복잡한 다중 컨테이너 환경을 정의합니다. 이 구성은 서비스 정의, 네트워킹 및 환경 관리에 대한 포괄적인 접근 방식을 제공합니다.

서비스 정의 구문

version: "3.8"
services:
  application:
    image: ubuntu:22.04
    container_name: my_app
    ports:
      - "8080:80"
    volumes:
      - ./app:/var/www/html
    environment:
      - DEBUG=true
    networks:
      - backend

구성 매개변수

매개변수 설명 예시
image 기본 컨테이너 이미지 ubuntu:22.04
ports 포트 매핑 "8080:80"
volumes 지속적인 저장소 ./app:/var/www/html
environment 환경 변수 DEBUG=true

컨테이너 네트워킹

graph TD
    A[Docker Compose 네트워크] --> B[Service 1]
    A --> C[Service 2]
    A --> D[Service 3]
    B --- E[내부 통신]
    C --- E
    D --- E

고급 서비스 구성

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      - database
    restart: always
    healthcheck:
      test: ["CMD", "curl", "-f", "
      interval: 30s
      timeout: 10s
      retries: 3

  database:
    image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: secretpassword

volumes:
  postgres_data:

환경 관리

Docker Compose 는 여러 환경 구성 방법을 지원합니다.

방법 설명
.env 파일 환경 변수 저장
environment 직접 변수 정의
외부 환경 시스템 수준 변수

네트워킹 모드

네트워크 유형 사용 사례
Bridge 기본 컨테이너 네트워크
Host 직접 호스트 네트워크 접근
Overlay 멀티 호스트 통신
Custom 사용자 정의 네트워크 구성

고급 Docker 배포

프로덕션 환경에 적합한 배포 전략

고급 Docker 배포는 다양한 환경에서 성능, 보안 및 확장성을 종합적으로 고려해야 합니다.

확장성 구성

version: "3.8"
services:
  web:
    image: nginx:latest
    deploy:
      replicas: 4
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
        max_attempts: 3

컨테이너 오케스트레이션 아키텍처

graph TD
    A[로드 밸런서] --> B[컨테이너 클러스터]
    B --> C[서비스 1]
    B --> D[서비스 2]
    B --> E[서비스 3]
    C --> F[수평 확장]
    D --> F
    E --> F

보안 권장 사항

보안 측면 구현 방법
루트 사용자 아님 권한이 없는 사용자로 컨테이너 실행
네트워크 분리 사용자 정의 네트워크 사용
시크릿 관리 Docker 시크릿 활용
리소스 제한 CPU/메모리 제약 설정

고급 네트워크 구성

networks:
  backend:
    driver: overlay
    attachable: true
  frontend:
    driver: bridge
    internal: true

성능 최적화 기법

최적화 설명
다단계 빌드 이미지 크기 축소
캐싱 전략 빌드 시간 최소화
리소스 할당 CPU/메모리 제한 구성
헬스체크 컨테이너 안정성 보장

배포 스크립트 예시

#!/bin/bash
docker-compose up -d --scale web=3 --remove-orphans
docker-compose ps
docker-compose logs

모니터링 및 로깅

services:
  monitoring:
    image: prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
  logging:
    image: grafana/grafana
    ports:
      - "3000:3000"

요약

Docker Compose 는 선언적 방식의 컨테이너 관리를 제공하여 복잡한 애플리케이션 배포를 단순화합니다. 구성 구문을 숙달하고, 서비스 상호 작용을 이해하며, 볼륨 및 네트워크 구성을 활용함으로써 개발자는 개발, 테스트 및 프로덕션 워크플로우를 간소화하는 강력하고 재현 가능한 컨테이너 환경을 만들 수 있습니다.