Docker Compose

뾰족머리삼돌이·2024년 11월 26일

서버

목록 보기
7/10

Docker Compose

일반적인 컨테이너 생성은 Dockerfile을 작성하고 이미지를 빌드한 뒤, run으로 동작시킨다.
하지만, 서비스는 보통 데이터베이스, 캐시, API 서버 등의 구성요소들로 이루어져있다. 이런상황에서 일반적인 컨테이너 생성방식은 각각의 구성요소마다 컨테이너를 생성해줘야하는 번거로움이 생긴다.

이를 해결하기위한 도구가 Docker Compose다.
yml 형식의 단일파일을 통해 서비스 구성요소 전체에 대한 요구사항들( 네트워크 설정, 의존성 등 )을 작성하고 한번에 컨테이너를 관리하게 해준다.

# compose.yml 예시
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"

  db:
    image: postgres:13
    environment:
      POSTGRES_USER: example
      POSTGRES_DB: exampledb

Docker Compose를 위한 설정파일은 compose.yml, 이전버전과의 호환을 위해 docker-compose.yml로 작성된다.
파일에서 애플리케이션의 구성요소들은 service로 불리며, network를 통해 통신한다. 영구데이터의 경우에는 volume을 통해 저장 및 공유된다.

이렇게 작성된 compose파일이 존재한다면, CLI에서 docker compose 명령과 통해 상호작용이 가능하다.

docker compose up은 파일내의 모든 서비스들을 시작하고,
docker compose down은 실행중인 서비스들을 중지 및 제거하며,
docker compose logs는 실행중인 컨테이너를 모니터링하고 디버깅하기 위한 로그확인이 가능하며,
docker compose ps는 모든 서비스들을 현재 상태와 함께 표시한다.

이러한 CLI 명령 종류들은 참조문서에서 확인할 수 있다.

사용예시

프론트와 백엔드로 구분된 애플리케이션을 가정해보자.

프론트엔드 서비스는 인프라에 의해 관리되는 HTTP 구성파일과 HTTPS 서버인증서가 필요하며,
백엔드 서비스는 영구적인 데이터저장이 가능해야한다.

각각의 서비스는 내부 네트워크를 통해 통신하며, 프론트엔드 서비스는 외부에서의 접근을 위해 443포트를 개방해야한다.

이런 상황을 가정했을 때, 작성되는 compose.yml은 아래와 같다.

services:
  frontend:
    image: example/webapp
    ports:
      - "443:8043"				# 호스트 시스템의 443포트를 컨테이너 내의 8043포트와 연결
    networks:
      - front-tier 				# 서비스 사용자에게 노출하기 위한 네트워크( 외부통신 ) 
      - back-tier				# 백엔드 통신을 위한 네트워크( 내부통신 )
    configs:
      - httpd-config			# HTTP 서버 구성 파일을 컨테이너에 제공
    secrets:
      - server-certificate		# HTTPS 설정에 필요한 인증서를 secret으로 관리

  backend:
    image: example/database
    volumes:
      - db-data:/etc/data		# 데이터 영구저장을 위한 볼륨설정
    networks:
      - back-tier				# 프론트엔드 통신을 위한 네트워크( 내부통신 )

volumes:
  db-data:						# 볼륨이름
    driver: flocker				# Flocker 드라이버를 사용하여 볼륨관리
    driver_opts:
      size: "10GiB"				# 최대 저장공간을 10GB로 제한

configs:
  httpd-config:					# config이름, HTTP config 정의
    external: true				# 외부 설정파일 사용

secrets:
  server-certificate:			# secret이름, HTTPS 인증서 secret 정의
    external: true				# 외부 설정파일 사용

networks:
  # The presence of these objects is sufficient to define them
  front-tier: {}
  back-tier: {}

compose.yml을 작성하고 난 후에는 CLI 명령을 통해 서비스들을 시작하면 된다.

docker compose ps

NAME                IMAGE                COMMAND                  SERVICE             CREATED             STATUS              PORTS
example-frontend-1  example/webapp       "nginx -g 'daemon of…"   frontend            2 minutes ago       Up 2 minutes        0.0.0.0:443->8043/tcp
example-backend-1   example/database     "docker-entrypoint.s…"   backend             2 minutes ago       Up 2 minutes

참고

0개의 댓글