도커 컴포즈 오버라이드(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
- 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
- 001: 도커 컴포즈가 오버라이드 파일을 병합하는 순서는 인자로 받은 순서를 따른다.
- 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
주의
- 오버라이드 파일을 사용하면 애플리케이션 정의를 재사용할 수 있지만 그만큼 오버라이드 관리에 드는 오버헤드도 발생한다.
- 애플리케이션 배포 및 폐기 스크립트의 작성과 자동화를 익혀 둘 필요가 있다.