다중 컨테이너 Docker 애플리케이션 배포 방법

DockerBeginner
지금 연습하기

소개

Docker Compose 는 개발자가 컨테이너 관리 및 애플리케이션 배포를 효율화하기 위한 필수적인 도구입니다. 이 포괄적인 튜토리얼은 Docker Compose 의 기본 원리를 탐구하며, 복잡한 다중 컨테이너 환경을 효율적이고 체계적으로 구성, 배포 및 관리하는 실질적인 통찰력을 제공합니다.

Docker Compose 기본 개념

Docker Compose 소개

Docker Compose 는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 강력한 도구입니다. YAML 파일을 사용하여 애플리케이션 서비스, 네트워크 및 볼륨을 구성할 수 있으므로 컨테이너 오케스트레이션 및 관리 프로세스를 간소화합니다.

핵심 개념 및 아키텍처

graph TD
    A[Docker Compose] --> B[서비스 구성]
    A --> C[다중 컨테이너 관리]
    A --> D[선언적 인프라]
핵심 개념 설명
docker-compose.yml 서비스, 네트워크 및 볼륨을 정의하는 구성 파일
서비스 애플리케이션을 구성하는 개별 컨테이너
볼륨 컨테이너의 지속적인 데이터 저장소
네트워크 컨테이너 간 통신을 위한 사용자 정의 네트워크 구성

실제 예제: 웹 애플리케이션 설정

다음은 일반적인 웹 애플리케이션에 대한 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. nginx 서비스는 호스트 포트 80 을 컨테이너 포트 80 으로 매핑합니다.
  4. postgres 서비스는 지속적인 볼륨 저장소를 사용하여 데이터베이스를 설정합니다.

설치 및 기본 명령어

Ubuntu 22.04 에 Docker Compose 를 설치하려면 다음과 같이 합니다.

sudo apt update
sudo apt install docker-compose-plugin
docker compose version

주요 Docker Compose 명령어:

  • docker compose up: 모든 서비스 시작
  • docker compose down: 컨테이너 중지 및 제거
  • docker compose ps: 실행 중인 서비스 목록
  • docker compose logs: 서비스 로그 보기

구성 및 배포

Docker Compose 파일 구조

Docker Compose 구성은 전체 애플리케이션 인프라를 정의하는 YAML 파일을 기반으로 합니다. 표준 파일 이름은 docker-compose.yml이며, 포괄적인 서비스 정의를 포함합니다.

graph TD
    A[docker-compose.yml] --> B[서비스]
    A --> C[네트워크]
    A --> D[볼륨]
    A --> E[환경 변수]

서비스 구성 상세 예제

version: "3.8"
services:
  backend:
    image: python:3.9
    build:
      context: ./backend
      dockerfile: Dockerfile
    ports:
      - "5000:5000"
    environment:
      - DATABASE_URL=postgresql://user:password@database:5432/appdb
    depends_on:
      - database

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

volumes:
  postgres_data:

구성 매개변수

매개변수 설명 예시
image 기본 컨테이너 이미지 nginx:latest
build 사용자 정의 이미지 빌드 구성 context: ./app
ports 포트 매핑 "8080:80"
volumes 지속적인 데이터 저장소 - ./data:/app/data
environment 컨테이너 환경 변수 DATABASE_HOST=localhost

배포 전략

graph LR
    A[로컬 개발] --> B[스테이징 환경]
    B --> C[생산 배포]
    C --> D[서비스 확장]

배포 명령어

Ubuntu 22.04 에서 일반적인 배포 워크플로우:

## compose 파일 유효성 검사
docker compose config

## 서비스 빌드
docker compose build

## 서비스 시작
docker compose up -d

## 실행 중인 서비스 확인
docker compose ps

## 로그 보기
docker compose logs backend

## 서비스 중지
docker compose down

고급 구성 기법

services:
  webserver:
    restart: always
    healthcheck:
      test: ["CMD", "curl", "-f", "
      interval: 30s
      timeout: 10s
      retries: 3

고급 Compose 전략

다중 환경 구성

Docker Compose 는 여러 구성 파일과 재정의 메커니즘을 통해 정교한 환경 관리를 지원합니다.

graph LR
    A[기본 구성] --> B[개발 재정의]
    A --> C[생산 재정의]
    A --> D[스테이징 재정의]

환경별 구성

version: "3.8"
services:
  application:
    image: myapp:latest
    environment:
      - APP_ENV=${DEPLOY_ENV:-development}
      - DATABASE_URL=${DATABASE_CONNECTION}

서비스 동적 확장

## web 서비스를 3개 인스턴스로 확장
docker compose up -d --scale web=3

고급 네트워크 구성

네트워크 모드 설명 사용 사례
bridge 기본 네트워크 격리된 컨테이너 간 통신
host 직접 호스트 네트워크 고성능 시나리오
custom 사용자 정의 네트워크 복잡한 마이크로서비스 아키텍처

생산 환경 준비 Compose 예제

version: '3.8'
services:
  webserver:
    image: nginx:alpine
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 10s
    healthcheck:
      test: ["CMD", "curl", "-f", "
      interval: 30s
      timeout: 10s
      retries: 3

  backend:
    image: myapp:${VERSION}
    secrets:
      - db_password
    configs:
      - source: app_config
        target: /app/config.json

secrets:
  db_password:
    external: true

configs:
  app_config:
    file: ./config.json

컨테이너 버전 관리 전략

## 버전이 지정된 이미지 태그 및 푸시
docker build -t myapp:v1.0 .
docker compose push

배포 워크플로우

graph TD
    A[이미지 빌드] --> B[테스트 실행]
    B --> C[레지스트리에 푸시]
    C --> D[컨테이너 배포]
    D --> E[성능 모니터링]

보안 및 규정 준수 명령어

## 취약점에 대한 compose 서비스 스캔
docker compose config --resolve-env-vars
docker scan docker-compose.yml

요약

Docker Compose 를 마스터함으로써 개발자는 컨테이너 오케스트레이션을 단순화하고, 인프라를 코드로 정의하며, 확장 가능하고 재현 가능한 애플리케이션 환경을 만들 수 있습니다. 이 튜토리얼은 핵심 개념, 구성 전략, 그리고 다양한 인프라 시나리오에서 원활한 멀티 컨테이너 애플리케이션 개발 및 배포를 가능하게 하는 실질적인 구현 기법을 다룹니다.