IaC/Container

Docker Compose: 컨테이너화된 애플리케이션 구성 및 실행 가이드

Somaz 2024. 5. 2. 21:16
728x90
반응형

Overview

Docker Compose에 대해서 알아본다.

 


Docker Compose란?

Docker Compose는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구이다. Docker Compose를 사용하면 YAML 파일을 사용하여 애플리케이션 서비스를 구성한다. 그런 다음 단일 명령을 사용하여 구성에서 모든 서비스를 생성하고 시작한다. Docker Compose는 프로덕션 용도에도 적합하지만 CI 워크플로는 물론 개발, 테스트, 스테이징 환경에 특히 유용하다.

 

2023년 7월부터 Compose V1은 업데이트를 중지하였다.

 


 

Docker Compose의 주요 기능

  1. 단일 호스트 배포: Docker Compose는 여러 컨테이너가 연결된 시스템으로 함께 작동하도록 조정되는 단일 호스트에서 이상적으로 사용된다.
  2. YAML 구성 파일: 서비스, 네트워크 및 볼륨은 docker-compose.yml 파일에 정의된다.
  3. 서비스 관리: 쉽게 구축, 시작, 중지, 재구축하고 설정에 있는 모든 서비스의 상태를 확인해야한다.
  4. 환경 분리: 별도의 Compose 파일이나 환경 변수를 통해 관리되는 개발, 테스트 및 프로덕션 환경에 대해 다양한 구성을 가질 수 있다.

 


 

Docker Compose 설치

아래는 최신버전 설치 방법이다.

# Fetch the latest release tag
LATEST_RELEASE=$(curl -s <https://api.github.com/repos/docker/compose/releases/latest> | grep 'tag_name' | cut -d\\" -f4)

# Download the latest version of Docker Compose
sudo curl -L "<https://github.com/docker/compose/releases/download/${LATEST_RELEASE}/docker-compose-$>(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# Set executable permissions
sudo chmod +x /usr/local/bin/docker-compose

# Verify the installation
docker-compose --version

 


 

Docker Compose 명령어

  1. docker-compose up
    • docker-compose.yml 파일에 정의된 모든 컨테이너를 시작한다. 컨테이너가 없으면 Compose가 컨테이너를 빌드한다.
    • '-d'를 추가하면 컨테이너가 백그라운드에서 실행된다(detached mode)).
  2. docker-compose down
    • `docker-compose up` 으로 생성된 모든 컨테이너, 네트워크, 볼륨 및 이미지를 중지하고 제거한다.
    • -v(또는 --volumes): 또한 docker-compose.yml 파일의 volumes 섹션에 선언된 명명된 볼륨과 컨테이너에 연결된 익명 볼륨을 제거한다. 이 옵션이 없으면 컨테이너가 삭제된 후에도 해당 볼륨의 데이터가 유지되므로 이는 데이터 지속성 측면에서 매우 중요하다.
  3. docker-compose build
    • docker-compose.yml 파일에 지정된 서비스를 빌드하거나 다시 빌드한다.
  4. docker-compose ps
    • docker-compose.yml 파일에 선언된 이미지와 관련된 모든 컨테이너를 나열한다.
  5. docker-compose exec
    • 실행 중인 컨테이너에서 명령을 실행한다. 예를 들어 `docker-compose exec web bash` 는 web 서비스 컨테이너 내부에 bash 쉘을 연다.
  6. docker-compose logs
    • 컨테이너에서 로그 출력을 가져온다. `-f` 를 추가하면 로그 출력을 실시간으로 볼 수 있다. ( tail -f 와 유사하다).
  7. docker-compose stop
    • 컨테이너를 제거하지 않고 실행을 중지한다.
  8. docker-compose start
    • 컨테이너를 실행한다.
  9. docker-compose restart
    • 컨테이너를 재실행한다.
  10. docker-compose rm
    • 실행이 중지된 컨테니어를 삭제한다.
# Start all services in the background
docker-compose up -d

# View running containers
docker-compose ps

# Stop all services
docker-compose stop

# Remove all stopped containers
docker-compose rm

# Fetch and view logs of all services
docker-compose logs

# Tear down the entire setup, removing containers, networks, and volumes
docker-compose down -v

 


 

Docker Compose File Example

주의할점은 도커 컴포즈에서 yml파일을 작성할때 Tab을 사용하면 안되고, Space를 사용해 2개의 공백을 만들어줘야 한다.

 

Standard Docker Compose Example

다음은 웹 서버(Nginx) 및 데이터베이스(PostgreSQL)로 간단한 웹 애플리케이션 스택을 설정하는 예시 docker-compose.yml 파일이다.

version: '3.8'

services:
  db:
    image: postgres:13
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    restart: always

  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - db
    restart: always

volumes:
  db_data:
  • version: Docker Compose 버전을 지정합니다. 현재 사용 중인 버전과 일치해야 한다.
  • services: 애플리케이션을 구성하는 다양한 컨테이너를 정의한다.
    • db: 이 서비스는 공식 PostgreSQL 이미지를 사용하고, 데이터베이스 데이터를 유지하기 위해 볼륨을 마운트하고, 데이터베이스 설정을 위한 환경 변수를 설정하고, 서비스가 중지되면 자동으로 다시 시작되도록 한다.
    • web: 이 서비스는 공식 Nginx 이미지를 사용하고, 호스트의 포트 80을 컨테이너의 포트 80에 매핑하고, 호스트의 디렉터리를 컨테이너에 마운트하고(HTML 파일을 제공하기 위해) db 서비스, PostgreSQL이 먼저 시작되도록 한다.

 

Advanced Docker Compose Example

다음은 Flask 및 Redis가 포함된 웹 앱을 포함하는 보다 복잡한 예이며, 소규모 Python 기반 웹 애플리케이션을 설정하는 방법을 보여준다.

version: '3.8'

services:
  redis:
    image: "redis:alpine"
    expose:
      - "6379"

  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
    depends_on:
      - redis
  • redis: Redis 이미지를 사용하고 Docker Compose에서 생성된 네트워크 내부에 포트 6379를 노출하지만 호스트에는 노출하지 않는다.
  • web:
    • build: 이미지를 직접 사용하는 대신 build는 현재 디렉터리에서 `Dockerfile` 을 사용하여 컨테이너 이미지를 빌드하는 방법을 지정한다.
    • ports: 호스트의 포트 5000을 컨테이너의 포트 5000에 매핑한다.
    • volume: 현재 디렉터리를 컨테이너 내부의 `/code` 에 마운트한다.
    • evnironment: 컨테이너의 환경 변수를 설정한다.
    • depends_on: 이 서비스 전에 Redis가 시작되는지 확인한다.

 

다음은 `watch` 구성이 포함된 Docker Compose 파일의 또 다른 예이다.

version: '3.8'
services:
  app:
    build: .
    volumes:
      - .:/app
    develop:
      watch:
        - action: exec
          path: ./src
          target: /app/src
          command: python manage.py makemigrations && python manage.py migrate
  cache:
    image: "redis:alpine"
  • app 서비스: 호스트의 `./src` 디렉토리의 변경 사항을 감시한다.
  • 변경 사항이 감지되면 컨테이너 내부에서 지정된 명령(python Manage.py makemigrations && python Manage.py migration)을 실행한다.
  • 이는 소스 코드가 변경될 때 데이터베이스 마이그레이션과 같은 작업을 트리거하는 데 유용하다.
  • cache 서비스: 개발 감시 기능 없이 표준 Redis 이미지를 사용한다.

 

그리고 아래와 같이 명령을 사용하면된다.

docker compose watch

 

 

 


Reference

https://docs.docker.com/compose/

https://docs.docker.com/compose/install/

728x90
반응형

'IaC > Container' 카테고리의 다른 글

Dockerfile 빌드 원칙 & Layer  (4) 2024.07.22
Dockerfile 보안 설정(Hadolint)  (0) 2024.02.25
Dockerfile이란?  (0) 2023.04.28
Docker(CentOS 7.9)  (0) 2022.03.21
docker(Ubuntu 20.04) / Portainer  (0) 2022.02.04