3 minute read

도커 컴포즈 : 명시적으로 여러개의 컨테이너 관리하기

1. 도커 컴포즈 (Docker Compose) 소개

  • 단일 서버에서 여러 컨테이너를 프로젝트 단위로 묶어서 관리
    docker-compose.yml YAML 파일을 통해 명시적으로 관리

  • 주요기능

    1. 프로젝트 단위로 도커 네트워크와 볼륨을 관리
    2. 프로젝트 내 서비스 간 의존성 정의
    3. 프로젝트 내 서비스 디스커버리 자동화
    4. 손 쉬운 컨테이너 수평 확장

2. 프로젝트 / 서비스 / 컨테이너

도커 컴포즈 (Docker Compose) 소개2

  • 프로젝트(Project)
    • docker-compose.yaml 에서 구성하는 프로젝트 명세 내용
    • 도커 컴포즈에서 다루는 워크스페이스 단위.
    • 함께 관리하는 서비스 컨테이너의 묶음.
    • 프로젝트 단위로 기본 도커 네트워크가 생성 됨.
  • 서비스(Services)
    • 도커 컴포즈에서 컨테이너를 관리하기 위한 단위.
    • scale을 통해 서비스 컨테이너의 수 확장 가능.
  • 컨테이너(Containers)
    • 서비스를 통해 컨테이너 관리.

3. docker-compose.yml

도커 컴포즈 (Docker Compose) 소개2

  • version, services, networks, volumes 총 4개의 최상위 옵션

  • 버전 (version)
    • 가능한 최신 버전 사용 권장
    • 도커 엔진 및 도커 컴포즈 버전에 따른 호환성 매트릭스 참조
    • cf) 버전 3 부터 도커 스웜(Docker Swarm)과 호환
      -> Swarm 서비스를 docker-compose.yml로 정의 가능
      -> docker-compose.yml의 옵션 가운데 docker swarm에서 사용가능한 옵션인지 아닌지 구분 필요!

    • 도커 스웜(Docker Swarm)
      • 여러 서버를 기반으로 스웜 클러스터를 형성하여 컨테이너를 관리하는
        컨테이너 오케스트레이션 시스템.
      • 쿠버네트스와 동일한 목적으로 만들어 졌지만 인기가 쿠버네티스만 못함
  • 서비스 (Services)

  • 네트웍스 (networks)
    • default 옵션이 있음
  • 볼륨 (volumes)

4. docker-compose 명령어

  • docker-compose 명령어 : 프로젝트 목록
# 실행중인 프로젝트 목록 확인
$ docker-compose ls
# 전체 프로젝트 모록 확인
$ docker-compose ls -a
  • docker for windows

PS C:\Workspace\docker\fastcampus-devops\3-docker-kubernetes\4-docker-compose\build> docker-compose -p my-project up -d
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
[+] Running 3/3
 - Network my-project_default    Created                                                                           0.8s
 - Container my-project-web-1    Started                                                                           1.7s
 - Container my-project-redis-1  Started                                                                           1.7s
PS C:\Workspace\docker\fastcampus-devops\3-docker-kubernetes\4-docker-compose\build> docker-compose ls
NAME                STATUS              CONFIG FILES
my-project          running(2)          C:\Workspace\docker\fastcampus-devops\3-docker-kubernetes\4-docker-compose\build\docker-compose.yml
PS C:\Workspace\docker\fastcampus-devops\3-docker-kubernetes\4-docker-compose\build> docker-compose ls -a
NAME                STATUS              CONFIG FILES
build               exited(2)           C:\Workspace\docker\fastcampus-devops\3-docker-kubernetes\4-docker-compose\build\docker-compose.yml
my-project          running(2)          C:\Workspace\docker\fastcampus-devops\3-docker-kubernetes\4-docker-compose\build\docker-compose.yml


  • docker-compose 명령어 : 실행 및 종료

# Foreground로 도커 컴포즈 프로젝트 실행
$ docker-compose up
# Background로 도커 컴포즈 프로젝트 실행
$ docker-compose up -d
# 프로젝트 이름 my-project로 변경하여 도커 컴포즈 프로젝트 실행
$ docker-compose up -p my-project -d
# 프로젝트 내 컨테이너 및 네트워크 종료 및 제거
$ docker-compose down
# 프로젝트 내 컨테이너, 네트워크 및 볼륨 종료 및 제거
$ docker-compose down -v

  • docker-compose 명령어 : 서비스 확장

# 'web'이라는 서비스를 3개로 확장, 같은 서비스가 3개로 확장되어 실행
$ docker-compose up --scale web=3

  • 조건 1 : 호스트 port 번호를 셋팅하면 안된다. -> 충돌 발생

  • docker for windows


PS C:\Workspace\docker\fastcampus-devops\3-docker-kubernetes\4-docker-compose\build> docker-compose -p my-project up --scale web=3 -d
[+] Running 4/4
 - Container my-project-redis-1  Running                                                                                                                                                                      0.0s
 - Container my-project-web-3    Started                                                                                                                                                                     12.6s
 - Container my-project-web-2    Started                                                                                                                                                                     13.1s
 - Container my-project-web-1    Started                                                                                                                                                                     13.5s
PS C:\Workspace\docker\fastcampus-devops\3-docker-kubernetes\4-docker-compose\build> docker-compose -p my-project ps
NAME                 COMMAND                  SERVICE             STATUS              PORTS
my-project-redis-1   "docker-entrypoint.s…"   redis               running             6379/tcp
my-project-web-1     "flask run"              web                 running             0.0.0.0:62351->5000/tcp
my-project-web-2     "flask run"              web                 running             0.0.0.0:62350->5000/tcp
my-project-web-3     "flask run"              web                 running             0.0.0.0:62348->5000/tcp

  • docker-compose 명령어 : docker-compose 이벤트 및 상황 확인

# 프로젝트 내 서비스 로그 확인
$ docker-compose logs
# 프로젝트 내 컨테이너 이벤트 확인
$ docker-compose events
# 프로젝트 내 이미지 목록
$ docker-compose images
# 프로젝트 내 컨테이너 목록
$ docker-compose ps
# 프로젝트 내 실행중인 프로세스 목록
$ docker-compose top

  • docker-compose.yml 기본적인 문법

# 프로젝트의 버전
version: '3.9'
# 서비스의 목록
services:
  # db 서비스
  db:
    image: mysql:5.7
    volumes:
    - db:/var/lib/mysql
    restart: always
    environment:
    - MYSQL_ROOT_PASSWORD=wordpress
    - MYSQL_DATABASE=wordpress
    - MYSQL_USER=wordpress
    - MYSQL_PASSWORD=wordpress
    networks:
    - wordpress
  # wordpress 서비스
  wordpress:
    depends_on:
    - db
    image: wordpress:latest
    ports:
    - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    networks:
    - wordpress

# 주사용 볼륨
volumes:
  db: {}

# 네트워크 셋팅 (브릿지)
networks:
  wordpress: {}

5. 주요 사용 목적

  • 로컬 개발 환경 구성
    • 특정 프로젝트의 로컬 개발 환경 구성 목적으로 사용
    • 프로젝트의 의존성(Redis, MySQL, Kafka 등)을 쉽게 띄울 수 있음
      • 프로젝트 안에 참여하는 서비스가 얽기고 섥기면 띄우기가 어려워짐
  • 자동화된 테스트 환경 구성
    • CI/CD 파이프라인 중 쉽게 격리된 테스트 환경을 구성하여 테스트 수행 가능
  • 단일 호스트 내 컨테이너를 “선언적” 관리
    • 단일 서버에서 컨테이너를 관리할 때 YAML 파일을 통해 선언적으로 관리 가능

Categories:

Updated:

Comments