Docker Compose 애플리케이션 구축 방법

DockerBeginner
지금 연습하기

소개

Docker Compose 는 현대 소프트웨어 개발에 필수적인 도구로, 개발자가 간단하고 선언적인 구성 파일을 통해 복잡한 다중 컨테이너 애플리케이션을 정의하고 관리할 수 있도록 지원합니다. 이 포괄적인 튜토리얼에서는 Docker Compose 의 핵심 개념, 아키텍처, 효율적인 컨테이너 배포 및 관리를 위한 실제 구현 전략을 살펴봅니다.

Docker Compose 기본

Docker Compose 소개

Docker Compose 는 컨테이너 오케스트레이션을 위한 강력한 도구로, 개발자가 손쉽게 다중 컨테이너 애플리케이션을 정의하고 관리할 수 있도록 지원합니다. 현대 소프트웨어 배포의 핵심 구성 요소인 Docker Compose 는 복잡한 애플리케이션 환경을 구성하고 실행하는 과정을 단순화합니다.

핵심 개념 및 아키텍처

Docker Compose 는 YAML 구성 파일을 사용하여 컨테이너화된 애플리케이션의 서비스, 네트워크 및 볼륨을 정의합니다. 주요 목표는 단일 선언적 구성을 통해 상호 연결된 컨테이너의 배포를 간소화하는 것입니다.

graph TD A[Docker Compose] --> B[YAML 구성] B --> C[서비스 정의] B --> D[네트워크 구성] B --> E[볼륨 관리]

Docker Compose 의 주요 구성 요소

구성 요소 설명 목적
서비스 컨테이너 구성 개별 컨테이너를 정의
네트워크 컨테이너 간 통신 컨테이너 간 네트워킹 관리
볼륨 지속적인 데이터 저장소 데이터 지속성 처리

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

다음은 일반적인 웹 애플리케이션을 위한 포괄적인 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. 이 예제는 웹 서버와 데이터베이스라는 두 개의 서비스를 정의합니다.
  2. Nginx 는 로컬 디렉토리의 정적 콘텐츠를 제공합니다.
  3. PostgreSQL 데이터베이스는 지속적인 볼륨으로 구성됩니다.
  4. 포트 매핑을 통해 외부 웹 액세스가 가능합니다.

설치 및 초기화

Ubuntu 22.04 에서 Docker Compose 를 시작하려면 다음 명령어를 사용합니다.

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

실행 및 관리

다중 컨테이너 애플리케이션을 실행하는 것은 간단합니다.

## 백그라운드에서 컨테이너 시작
docker compose up -d

## 실행 중인 컨테이너 보기
docker compose ps

## 컨테이너 중지 및 제거
docker compose down

구성 및 네트워킹

YAML 구성 기본

Docker Compose 는 복잡한 컨테이너 환경을 정의하기 위해 YAML 파일을 사용합니다. 구성 구조는 서비스 배포, 네트워킹 및 환경 설정에 대한 세밀한 제어를 제공합니다.

graph LR A[YAML 구성] --> B[서비스 정의] A --> C[네트워크 구성] A --> D[환경 변수]

서비스 정의 전략

구성 옵션 목적 예시
image 컨테이너 기본 이미지 지정 nginx:latest
ports 컨테이너를 호스트 포트에 매핑 "8080:80"
environment 런타임 변수 설정 DATABASE_URL=postgres://...
volumes 지속적인 저장소 관리 ./data:/app/data

고급 네트워크 구성

Docker Compose 는 사용자 정의 네트워크 정의를 통해 정교한 네트워킹 시나리오를 지원합니다.

version: "3.8"
services:
  frontend:
    image: nginx:alpine
    networks:
      - frontend_network

  backend:
    image: python:3.9
    networks:
      - backend_network
      - frontend_network

networks:
  frontend_network:
    driver: bridge
  backend_network:
    driver: overlay

환경 변수 관리

유연한 환경 구성은 다양한 배포 시나리오를 지원합니다.

## .env 파일 생성
echo "DATABASE_PASSWORD=secretpassword" > .env

## Docker Compose 구성
version: '3.8'
services:
database:
image: postgres:13
environment:
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}

네트워크 분리 및 통신

graph TD A[Frontend 서비스] -->|격리된 네트워크| B[Backend 서비스] B -->|공유 네트워크| C[Database 서비스]

실용적인 네트워킹 명령어

## Docker 네트워크 목록
docker network ls

## 특정 네트워크 검사
docker network inspect frontend_network

## 사용자 정의 네트워크 생성
docker network create myapp_network

컨테이너 연결성 확인

## 서비스 연결성 확인
docker compose exec frontend ping backend

## 네트워크 세부 정보 보기
docker compose config --resolve-env-vars

고급 배포 전략

서비스 동적 확장

Docker Compose 는 컨테이너 인스턴스를 관리하기 위한 강력한 확장 메커니즘을 제공합니다.

## 특정 서비스 확장
docker compose up --scale web=3 -d
graph LR A[로드 밸런서] --> B[웹 서비스 1] A --> C[웹 서비스 2] A --> D[웹 서비스 3]

서비스 종속성 관리

적절한 시작 순서 및 서비스 간 종속성을 보장합니다.

version: "3.8"
services:
  database:
    image: postgres:13
    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 10s
      timeout: 5s
      retries: 5

  backend:
    image: myapp-backend
    depends_on:
      database:
        condition: service_healthy

모니터링 및 상태 확인

모니터링 기법 설명 구현 방식
상태 확인 서비스 준비 여부 확인 사용자 지정 명령어 실행
리소스 제한 컨테이너 리소스 제어 CPU/메모리 제약
로깅 중앙 집중형 로그 관리 ELK 스택 통합

리소스 제약 구성

services:
  web:
    image: nginx
    deploy:
      resources:
        limits:
          cpus: "0.50"
          memory: 512M
        reservations:
          cpus: "0.25"
          memory: 256M

고급 문제 해결 기법

## 상세 서비스 로그
docker compose logs -f backend

## 실시간 리소스 모니터링
docker stats

## 포괄적인 시스템 진단
docker compose ps
docker compose config

서비스 검색 및 네트워크 복잡성

graph TD A[서비스 레지스트리] --> B[Frontend 서비스] A --> C[Backend 서비스] A --> D[마이크로서비스 1] A --> E[마이크로서비스 2]

지속적인 배포 워크플로우

version: "3.8"
services:
  ci-runner:
    image: docker:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: |
      sh -c "
        docker compose pull
        docker compose up -d --build
        docker compose ps
      "

성능 최적화 전략

## 병렬 서비스 시작
docker compose up -d --parallel

## 선택적 서비스 관리
docker compose up frontend backend

요약

Docker Compose 를 마스터함으로써 개발자는 애플리케이션 배포를 간소화하고, 컨테이너 구성을 단순화하며, 확장 가능하고 재현 가능한 환경을 만들 수 있습니다. 이 튜토리얼은 기본 서비스 정의부터 고급 네트워킹 및 볼륨 관리까지 필수적인 기술을 다루며, 컨테이너화된 애플리케이션 개발 및 오케스트레이션을 위한 견고한 기반을 제공합니다.