Docker Compose

2024. 11. 29. 12:17Docker

Docker Compose


1. Docker Compose란?

Docker Compose는 여러 Docker 컨테이너로 이루어진 애플리케이션을 정의하고 관리하는 데 사용되는 도구입니다. 단일 YAML 파일을 작성하여 서비스(컨테이너), 네트워크, 볼륨 등을 설정하고, 단일 명령으로 애플리케이션의 모든 구성 요소를 실행, 중지 및 관리할 수 있습니다.


2. Docker Compose의 필요성

컨테이너 기반 환경에서는 보통 하나의 애플리케이션이 여러 컨테이너(서비스)로 구성됩니다.
예를 들어:

  • 웹 서버 (Nginx, Apache)
  • 애플리케이션 서버 (Flask, Spring Boot, Node.js)
  • 데이터베이스 (PostgreSQL, MySQL, MongoDB)
  • 캐시 (Redis, Memcached)
  • 메시지 브로커 (RabbitMQ, Kafka)

이 모든 것을 개별적으로 관리하려면 다음과 같은 어려움이 있습니다:

  • 각 컨테이너의 실행 명령을 기억하고 작성해야 함
  • 포트와 네트워크를 개별적으로 설정해야 함
  • 데이터 영속성을 위해 볼륨을 매번 수동 설정해야 함
  • 의존성 순서를 일일이 고려해야 함

Docker Compose는 이러한 문제를 해결합니다.


3. Docker Compose 아키텍처와 작동 방식

3.1. 주요 아키텍처

Docker Compose는 아래 3단계로 작동합니다:

  1. Define (정의)
    docker-compose.yml 파일에 각 컨테이너를 서비스 단위로 정의합니다.

  2. Build (빌드)
    정의된 각 서비스가 실행되기 전에 필요한 Docker 이미지를 빌드하거나 가져옵니다.

  3. Run (실행)
    모든 컨테이너를 설정된 의존성, 네트워크, 볼륨과 함께 실행합니다.

3.2. 기본 동작

  • Compose는 모든 컨테이너를 공유 네트워크에 연결하여 컨테이너 간 통신을 가능하게 합니다.
  • 각 서비스는 독립적으로 실행되며, 필요 시 확장(스케일링)할 수 있습니다.
  • 데이터 영속성을 위해 호스트와 컨테이너 간 볼륨 공유를 지원합니다.

4. Docker Compose 파일 구조 (심화)

Compose 파일은 docker-compose.yml이라는 이름의 YAML 파일로 작성됩니다.
구조를 최대한 상세히 살펴봅니다.

4.1. Version

Compose 파일의 버전을 지정합니다.
버전에 따라 사용할 수 있는 기능이 다릅니다. 현재 최신 버전은 3.9입니다.

version: "3.9"

4.2. Services

services는 애플리케이션의 구성 요소(컨테이너)를 정의합니다.
각 서비스는 이름과 함께 이미지, 포트, 환경 변수 등을 설정할 수 있습니다.

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
서비스 정의 속성들 (심화):
  • image: 사용할 Docker 이미지를 명시.
  • build: Dockerfile 경로를 지정하여 이미지를 빌드.
  • ports: 호스트와 컨테이너 간 포트를 매핑.
  • volumes: 데이터 지속성을 위한 볼륨 설정.
  • environment: 컨테이너 실행 시 전달할 환경 변수.
  • depends_on: 특정 서비스 실행 순서 지정.
  • restart: 컨테이너 재시작 정책 설정. (예: always, on-failure)

4.3. Networks

네트워크는 서비스 간 통신을 위한 환경을 제공합니다.
Compose는 기본적으로 모든 서비스에 하나의 네트워크를 자동 생성하지만, 명시적으로 정의도 가능합니다.

networks:
  my_network:
    driver: bridge
네트워크 드라이버:
  • bridge (기본값): 컨테이너 간 통신을 위한 가상 네트워크.
  • host: 컨테이너가 호스트의 네트워크를 직접 사용.
  • none: 네트워크를 비활성화.

4.4. Volumes

볼륨은 컨테이너의 데이터 영속성을 제공합니다.
컨테이너가 삭제되더라도 데이터는 유지됩니다.

volumes:
  db_data:
    driver: local
볼륨 드라이버:
  • local: 호스트 파일 시스템에 데이터를 저장.
  • nfs, cifs: 네트워크 파일 공유.
  • tmpfs: 휘발성 메모리 저장소.

5. Docker Compose 사용법: 단계별 설명

5.1. Docker Compose 파일 예제

아래는 간단한 Nginx + Redis 애플리케이션 구성 예제입니다.

version: "3.9"

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    networks:
      - app_network

  redis:
    image: redis:6.2
    ports:
      - "6379:6379"
    networks:
      - app_network

networks:
  app_network:

5.2. 명령 실행

  1. Compose 파일 작성

    nano docker-compose.yml
  2. 서비스 시작

    docker compose up -d
  3. 상태 확인

    docker compose ps
  4. 로그 확인

    docker compose logs -f
  5. 서비스 중지 및 제거

    docker compose down

6. Docker Compose 심화 명령어

6.1. 컨테이너 상태 확인

docker compose ps
  • 실행 중인 서비스의 이름, 상태, 포트 매핑, 컨테이너 ID 등을 표시합니다.

6.2. 특정 컨테이너 실행

docker compose exec redis redis-cli
  • redis 컨테이너 내부에서 Redis CLI 실행.

6.3. 스케일링

docker compose up --scale web=3
  • web 서비스를 3개의 컨테이너로 실행하여 부하 분산 테스트 가능.

6.4. 볼륨 정리

docker volume prune
  • 사용하지 않는 Docker 볼륨을 제거.

7. Docker Compose 활용 사례

7.1. 로컬 개발 환경

Compose를 사용하여 개발 환경에서 데이터베이스, 캐시, 메시지 브로커 등을 간단히 실행할 수 있습니다. 이는 테스트 환경과 프로덕션 환경을 동일하게 유지하는 데 도움이 됩니다.

7.2. CI/CD 파이프라인

테스트 및 빌드 과정에서 Compose를 사용하면 동일한 컨테이너 환경에서 애플리케이션을 실행하고 테스트할 수 있습니다.

7.3. 프로덕션 배포

Compose는 기본적으로 로컬 개발 환경에 최적화되어 있지만, Docker Swarm이나 Kubernetes와 결합하여 프로덕션에서도 사용할 수 있습니다.


8. Compose 파일 심화 예제: 완벽한 3계층 아키텍처

아래는 Nginx, Flask, PostgreSQL로 구성된 복잡한 애플리케이션의 예제입니다.

version: "3.9"

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    networks:
      - app_network
    depends_on:
      - app

  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "5000:5000"
    environment:
      DATABASE_URL: postgresql://user:password@db:5432/mydb
    networks:
      - app_network

  db:
    image: postgres:13
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - db_data:/var/lib/postgresql/data
    networks:
      - app_network

networks:
  app_network:

volumes:
  db_data:

실행:

docker compose up -d

9. Docker Compose 사용 시 주의점

  1. 의존성 설정 (depends_on)
    depends_on은 서비스 실행 순서를 보장하지만, 실제 의존성(예: 데이터베이스 준비 완료 여부)은 보장하지 않습니다. 이를 위해 헬스체크를 사용하세요.

  2. 환경 변수 관리
    .env 파일을 사용하여 환경별 설정을 분리하세요.

  3. 리소스 제한 설정
    프로덕션 환경에서는 CPU와 메모리 제한을 설정해 과도한 리소스 사용을 방지하세요.



Docker Compose는 복잡한 컨테이너 기반 애플리케이션의 배포와 관리를 단순화합니다. YAML 파일만으로 다양한 설정을 관리할 수 있으며, 단일 명령어로 애플리케이션의 모든 구성 요소를 실행할 수 있습니다. 개발, 테스트, 운영 환경 어디서든 유용하게 사용할 수 있는 강력한 도구입니다.

'Docker' 카테고리의 다른 글

Docker 커맨드와 컨셉 이해  (0) 2024.12.06
shell vs exec  (0) 2024.11.25
Bridge Network  (0) 2024.11.21
Linux Name  (0) 2024.11.21
alpine  (0) 2024.11.21