10.2.도커 컴포즈의 오버라이드 파일

도커 컴포즈 오버라이드(overide)

  • 도커 컴포즈는 여러 파일을 합처 컴포즈 파일을 구성하는데, 나중에 지정된 파일의 내용이 이전 파일의 내용을 덮어 쓰기 한다.
  • 오버라이드 파일을 이용해 여러 환경에 대한 설정을 담으면서도 유지 보수성이 좋은 컴포즈 파일을 만들 수 있다.
  • 모든 환경에 공통적으로 적용될 내용을 변경하고 싶다면 기본 파일을 수정한다.
  • 어느 특정 환경에만 적용하고 싶은 변경 내용이라면 해당 환경의 오버라이드 파일만 수정한다.
  • 오버라이드 파일에는 각 환경의 차이점만 정리돼 있을 것이므로 그 자체로 문서 역할을 할 수도 있다.

간단한 예시

  • 오버라이드 파일에는 해당 환경에서 변경할 항목만 기술하면 된다.
  • 그러나 기본 컴포즈 파일의 구조를 유지해야 도커 컴포즈가 두 정의를 연결 지을 수 있다.
001) # docker-compose.yml - 기본 파일
002) version: "3.7"
003) 
004) services:
005)   todo-web:
006)     image: diamol/ch06-todo-list
007)     ports:
008)       - 80
009)     environment:
010)       - Database:Provider=Sqlite
011)     networks:
012)       - app-net
013) 
014) networks:
015)   app-net:
016) 
017) # docker-compose-v2.yml - 오버라이드 파일
018) version: "3.7"
019) 
020) services:
021)   todo-web:
022)     image: diamol/ch06-todo-list:v2
  1. 022: todo-web 서비스의 이미지의 버전을 오버라이드

config 부명령 * 이 부명령은 입력 파일의 내용을 검증해 내용이 유효한 경우에만 최종 출력을 내놓는다. * 이 최종 출력이 실제 반영되는 컴포즈 파일이 되므로 오버라이드 파일을 적용한 결과를 예상할 수 있다.

001)  docker-compose -f ./todo-list/docker-compose.yml -f ./todo-list/docker-compose-v2.yml config
002) name: todo-list
003) services:
004)   todo-web:
005)     environment:
006)       Database:Provider: Sqlite
007)     image: diamol/ch06-todo-list:v2
008)     networks:
009)       app-net: null
010)     ports:
011)     - mode: ingress
012)       target: 80
013)       protocol: tcp
014) networks:
015)   app-net:
016)     name: todo-list_app-net
  1. 001: 도커 컴포즈가 오버라이드 파일을 병합하는 순서는 인자로 받은 순서를 따른다.
  2. 007: todo-web 서비스의 이미지의 버전이 오버라이드 되었다.

환경별 도커 컴포즈 오버라이드

  • docker-compose.yml:
  • 기본 컴포즈 파일.
  • 웹 및 API 서비스가 정의됐으나 포트나 도커 네트워크에 대한 정의는 빠져 있다.
  • docker-compose-dev.yml:
  • 개발 환경 대상의 설정
  • 도커 네트워크 및 서비스의 공개 포트를 정의하고 헬스 체크와 디펜던시 체크를 비활성화한다.
  • 개발자들이 빠르게 애플리케이션을 실행하는 것을 목적으로 한다.
  • docker-compose-test.yml:
  • 테스트 환경 대상의 설정.
  • 도커 네트워크를 정의하고, 헬스 체크를 설정하고, 웹 서비스의 공개 포트를 정의한다.
  • 그러나 API 서비스의 포트는 공개하지 않는다.
  • docker-compose-uat.yml:
  • 사용자 인수 테스트 환경 대상의 설정.
  • 도커 네트워크를 설정하고, 웹 서비스는 80번 표준 포트로 공개하고, 서비스가 오류 발생 시 항상 재시작하도록 설정하고, 헬스 체크를 좀 더 꼼꼼하게 하도록 지정한다.

환경별 도커 컴포즈 실행 * 도커 컴포즈가 오버라이드 파일을 병합하는 순서는 인자로 받은 순서를 따른다.

# 개발 환경용 설정으로 실행하기
docker-compose -f ./numbers/docker-compose.yml -f ./numbers/docker-compose-dev.yml -p numbers-dev up -d

# 테스트 환경용 설정으로 실행하기
docker-compose -f ./numbers/docker-compose.yml -f ./numbers/docker-compose-test.yml -p numbers-test up -d

# 인수 테스트 환경용 설정으로 실행하기
docker-compose -f ./numbers/docker-compose.yml -f ./numbers/docker-compose-uat.yml -p numbers-uat up -d
  • 이들 각각은 모두 별개의 도커 네트워크를 사용하므로 서로 독립적이다.
  • 개발 팀에서는 이들 모두를 한 서버에서 실행하고, 팀마다 포트를 달리해 자신의 업무와 관련된 환경에 접근할 수 있다.
  • 사용자 인수 테스트 환경은 80번 포트
  • 시스템 테스트 환경은 8080번 포트
  • 개발팀의 통합 테스트 환경은 8088번 포트

도커 컴포즈 제거 * 프로젝트 이름을 기본값에서 변경하고 오버라이드한 경우 사용한 모든 파일과 프로젝트 정보를 정확히 지정 해야 한다.

# 프로젝트 이름을 기본값에서 변경하지 않고
# 기본 컴포즈 파일만 사용했다면 이 명령이 동작했을 것이다
docker-compose down

# 프로젝트 이름 변경 없이
# 오버라이드 파일만 지정했다면 이 명령도 동작했을 것이다
docker-compose -f ./numbers/docker-compose.yml -f ./numbers/docker-compose-test.yml down

# 하지만 프로젝트 이름을 기본값에서 변경했으니
# 애즘리케이션을 종료할 때도 다시 프로젝트 이름을 정확하게 지정해야 한다
docker-compose -f ./numbers/docker-compose.yml -f ./numbers/docker-compose-test.yml -p numbers-test down

주의

  • 오버라이드 파일을 사용하면 애플리케이션 정의를 재사용할 수 있지만 그만큼 오버라이드 관리에 드는 오버헤드도 발생한다.
  • 애플리케이션 배포 및 폐기 스크립트의 작성과 자동화를 익혀 둘 필요가 있다.

links

social