도커 컴포즈 - 명시적으로 컨테이너 관리하기

Junghun Park·2022년 8월 29일
0

Dev-Ops

목록 보기
8/9

도커 컴포즈

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

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

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

프로젝트

도커 컴포즈에서 다루는 워크스페이스 단위
함께 관리하는 서비스 컨테이너의 묶음 - 하나의 yaml 파일이 프로젝트를 명세
프로젝트 단위로 기본 도커 네트워크가 생성됨

서비스

도커 컴포즈에서 컨테이너를 관리하기 위한 단위
scale에 따라 컨테이너의 수 확장 가능

컨테이너

서비스를 통해 컨테이너 관리

docker-compose.yml

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

version

2021년 11월 기준 3.9가 최신
가능한 최신 버전 사용 권장
도커 엔진 및 도커 컴포즈 버전에 따른 호환성 매트릭스 참조할 것

  • 공식 문서 상의 compose file reference 참조
    버전 3부터 Docker Swarm과 호환
  • Swarm 서비스를 docker-compose.yml로 정의 가능
  • 그렇기 때문엔 명령어를 사용할 때 docker-compose 명령어인지 Swarm 명령어인지 확인할 필요 있음

Docker Swarm

여러 서버를 기반으로 스왐 클러스터를 형성하여 컨테이너를 관리하는 컨테이너 오케스트레이션 시스템
쿠버네티스와 동일한 목적으로 만들어 졌지만 인기를 끌지 못함

Service

프로젝트 하위의 서비스들을 서브키를 활용하여 관리 가능
web:

database:

Networks & Volumes

프로젝트 내에서 사용할 네트워크와 볼륨을 각각 키 내에서 정의하여 사용
네트워크는 정의하지 않아도 디폴트가 있음

docker-compose 명령어

프로젝트 목록

  • 실행중인 프로젝트 목록 확인
    $ docker-compose ls
  • 전체 프로젝트 목록 확인
    $ docker-compose ls -a

실행 및 종료

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

서비스 확장

  • web 서비스를 3개로 확장
    $ docker-compose up —scale web=3 (scale 명령어가 사라져서 up 명령어에 scale 옵션을 주는 방식으로 변경)
  • 스케일을 할 때 호스트의 포트가 지정되어 있으면 포트 충돌이 일어나기 때문에 주의해야함
  • 컨테이너 이름을 지정한 경우에도 충돌이 일어남

기타

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

기타

docker-compose 내의 depends_on 옵션을 이용하여 각 서비스의 의존성 주입 가능

  • depends_on 옵션은 선행 컨테이너의 실행 여부는 보장하지만, 준비 여부는 보장하지 않는다.
  • 때문에 entry point에서 shell 스크립트를 이용하여 실행 여부 확인이 필요하다.

주요 사용 목적

  • 로컬 개발 환경 구성
    특정 프로젝트의 로컬 개발 환경 구성 목적으로 사용
    프로젝트의 의존성 (redis, MySQL, kafka 등)을 쉽게 띄울 수 있음

  • 자동화된 테스트 환경 구성
    CI/CD 파이프라인 중 쉽게 격리된 테스트 환경을 구성하여 테스트 수행 가능

  • 단일 호스트 내 컨테이너를 선언적 관리
    단일 서버에서 컨테이너를 관리할 때 YAML 파일을 통해 선언적으로 관리 가능

0개의 댓글