Docker Compose 버전 2 살펴보기

MX ·2025년 8월 4일

유용한 SW

목록 보기
7/7

구글에 Docker compose를 검색한 뒤 한글로 된 포스트들에서 컨테이너들을 단체로 올리거나 내리는 명령어들을 찾아보면 대부분 이렇게 되어 있다.

docker-compose up -d
docker-compose down

하지만 이 명령어들은 사실 Docker compose 버전 1에서 사용하는 형태라는 것을 적어 놓은 포스트들은 별로 못 봤다. 사실, 도커 컴포즈 v2에 대해 소개한 글들도 대부분 신규 설치/마이그레이션 정도에 머물러 있다. 공식 GitHub 리포지토리에 들어가면 최신 버전은 2025년 8월 4일 기준 무려 2.39.1이다! 반면 위 명령어를 사용하기 위해 docker compose를 설치했다면 현재 1.29.2가 최신이다. 최신 버전과의 간극이 매우 크다.

주의할 것은 여기서 말하는 도커 컴포즈 버전은 docker-compose.yml 내 version 라벨의 값이 아니다. version 라벨은 패키지 버전이 아닌, docker-compose.yaml 파일 양식 규격의 버전을 정하던 과거의 '흔적'이다. 도커 컴포즈는 최신 v1과 최신 v2 모두 이 필드를 무시하고 가장 최근 버전의 스키마를 적용하니 이젠 적을 필요가 아예 없다.

현재의 Docker Compose 버전 2이 버전 1과 비교했을 때 어떤 점이 달라졌고, v2에서만 지원하는 신기능은 무엇이 있는지 알아보자.

설치 시 주의사항

docker compose v1과 v2는 패키지 관리자를 통해 설치할 경우 패키지 이름부터 다르다. 가령 데비안/우분투의 패키지 관리자인 APT를 기준으로 보면,

sudo apt install docker-compose # v1
sudo apt install docker-compose-v2 # v2

이렇게 설치하도록 되어 있다.

명령어 사용

명령어 형태부터 싹 달라졌다. 기존에는 up, down, ps 같은 컨테이너 관련 하위 명령어 동작을 하기 위해

docker-compose (하위 명령어) ...

로 실행하는 형태였다면, 버전 2에서는

docker compose (하위 명령어) ...

형태로 -를 공백으로 바꿔 실행한다. 아마 사실상 docker의 플러그인 형태의 소프트웨어처럼 되어서 이렇게 바꾼 것이 아닐까 추측하고 있다.

예를 들어 도커 컴포즈 v2로 컨테이너를 로그 없이 백그라운드로 전부 실행하려면 docker compose up -d로 적어야 한다.

새로운 기능 목록

include 라벨로 yaml 파일 분할하기

최상위 레벨에 include 라벨을 써서 포함할 하위 yaml 파일의 목록을 나열하는 식으로 docker-compose.yaml 파일을 소스 코드의 모듈화처럼 분할하는 것이 v2.20.0부터 가능해졌다. 심지어 하위 yaml의 경로에 환경 변수를 집어넣을 수도 있다!

프로파일: 원하는 서비스들만 골라서 up!

docker compose --profile (프로파일) up -d의 형태로 docker-compose.yml 안의 일부 서비스만 선택적으로 올릴 수 있다. 이때 선택한 서비스들에는 다음과 같이 profile 설정이 있어야 한다.

  service:
    myservice:
      profiles:
        - (프로파일 이름)

yaml 파일에서 AI 서비스 직접 연결하기

LLM 인공지능의 시대를 맞아 Docker 사가 AI 모델을 도커 컨테이너와 유사하게 캡슐화된 형태인 artifact로 적용할 수 있는 Docker Model Runner 기능을 추가했다. 그리고 상당히 최근에 발표된 v2.38.0부터 Docker compose에 DMR에 맞춰 로컬에서 굴리든 클라우드에서 굴리든 서비스 형태로 제공 중인 AI 모델을 연결할 수 있는 models 라벨이 추가되었다. 이제 AI 세팅도 도커 컴포즈로 간단하게 할 수 있는 시대가 온 것이다.

문제는 하드웨어 요구사항인데, 반드시 NVIDIA의 GPU가 AI 모델을 구동할 서버 인스턴스에 물려져 있는 상태여야 한다. 물리 컴퓨터를 가지고 있는 회사라서 NVIDIA RTX(내지는 Quadro 중에 비교적 최신 버전)을 장착했거나 클라우드에서 NVIDIA GPU 서버 관련 서비스를 제공한다면 괜찮지만 그렇지 않은 상황이면 어쩔 수 없이 다른 클라우드를 알아보거나 AI 서비스는 포기하는 것이 좋다. 구글 Colab의 Pro+ 구독으로 웹 서버를 돌릴까 하는 생각은 접어 두는 것이 좋은게, Pro+ 구독도 인스턴스가 영구적으로 돌아가는 것을 보장하지 않아서 언젠가 AI 모델이 올려진 서버가 꺼질 것이다.

build/deploy/develop: 이제 도커 컴포즈로 CI/CD도 가능합니다!

마지막으로, 이제 build 라벨과 deploy 라벨로 도커 컴포즈가 Dockerfile을 찾아 빌드하고 다시 실행 중인 도커 엔진에 여러 레플리카 컨테이너를 배포하도록 설정할 수 있게 되었다.

다만 주의할 것은 이 deploy 라벨은 도커 컴포즈로 컨테이너를 올리는 호스트 컴퓨터 1대에만 CD를 시행한다는 것이다. Docker 사의 솔루션 내에서 해결하려면 같은 docker-compose.yml을 여러 대에 복사하고 CI/CD를 실행하거나 아니면 Docker Swarm을 이용하는 방법이 있고, 다른 회사나 오픈 소스 프로젝트를 찾는다면 역시 k8s 계열 프로젝트를 고르는 것이 적절할 것이다.

그리고 develop 라벨 아래 watch 라벨을 두어 개발 중인 디렉토리에서 원하는 파일만 선택적으로 CI/CD 과정에 포함하여 비밀번호 같은 민감한 데이터가 이미지에 파일 형태로 삽입되는 사태를 조기에 방지할 수 있는 방법이 나왔다. 주로 sync/restart/rebuild/sync+restart 중에서 골라 파일 내용을 바꾸고 그대로 컨테이너를 내버려둘지, 아니면 컨테이너 재시작을 통한 서비스 재시작을 할 것인지 세밀하게 고를 수 있게 되었다. sync+exec 옵션도 있긴 한데 아마 자카르타 EE 및 스프링 프레임워크로 만든 jar 아카이브를 실행하는 용도 정도로만 쓸 수 있을 것이다. 여기에 ignore 하위 라벨로 이미지 빌드 중 포함시키지 않을 파일/디렉토리를 설정할 수도 있다.

이 내용이 이해되지 않는 사람들을 위해 증분 빌드(Incremental build)를 도커 컴포즈로 할 수 있게 되었다 정도로 생각하면 된다. develop.watch는 2.22.0부터 사용할 수 있다.

글을 마치며...

사실 이 글을 쓰게 된 계기로, 나와 다른 개발자 1명이 관리하는 리버티게임의 CI/CD 개선 계획의 일환으로 다른 개발자가 커스텀 미디어위키 이미지를 만들기 위해 Dockerfile 및 새로운 docker-compose.yml 양식을 포함한 리포지토리를 제작하였다. 하지만 나는 아직 도커 컴포즈에 대한 지식 수준이 v1을 막 마스터한 수준에 머물러 있었기 때문에 그분이 docker-compose.yml에 정의한 서비스에 붙은 build: 라벨을 보고 당황하여 공식 Documentaion을 방문하게 되었고, docker compose가 인터넷에 돌아다니는 블로그 포스트의 내용이나 국비지원 부트캠프에서 알려주는 내용보다 훨씬 더 어마어마하게 발전했다는 사실을 알게 된 것. 그러나 이걸 적어 놓은 한글 포스트가 별로 없어서 여기에 적고 공개해놓는다.

Docker compose는 전반적으로 2.2X.0에는 CI/CD 구성 및 실시간 이미지 빌드 기능에 집중하고, 2.3X.0부터는 최신 IT 트렌드에 따라 새로운 기능을 삽입하려고 준비하는 것 같다.
이런 Docker compose v2가 한국에 무사히 안착하길 바라며 글을 마친다.

profile
공포를 이기고 걸어 나가자

0개의 댓글