12일차_도커 컴포즈 오버라이드, 컨테이너에 환경변수 주입

최지웅·2024년 11월 26일
0

인프라

목록 보기
16/19

10-2. 도커 컴포즈의 오버라이드 파일

  • 기본적으로 공통으로 사용되는 속성이 docker-compose.yml에, 환경 별 오버라이드 파일이 달라진 속성을 정의한다. (인터페이스, 구현으로 이해해도 될듯)
# 1. docker-compose.yml(공통 기본 파일)
services:
	todo-web:
    	image: diamol/ch06-todo-list
        ports:
        	- 80
        environment:
        	- Database:Provider=Sqlite
        networks:
        	- app-net
# 2. docker-compose-v2.yml(오버라이드 파일)
services:
	todo-web:
    	image: diamol/ch06-todo-list:v2
  • 이를 실행할 때 config 부명령을 끝에 추가하면 자체적으로 검증한 후 유효한 경우에만 최종 출력을 한다. 또한 인자 전달 순서에 따라 오버라이드를 수행한다. (config는 실행x. 오버라이드로 병합된 컴포즈 파일을 볼 수 있음)
# 3. 도커 컴포즈 오버라이드 실행
docker-compose -f ./todo-list/docker-compose.yml -f ./todo-list/docker-compose-v2.yml config
  • 오버라이딩을 통해 아래와 같이 구성할 수 있다.
  1. docker-compose.yml: 기본 컴포즈 파일
  2. docker-copmpose-dev.yml: 개발자 빠른 실행을 목적
  3. docker-compose-test.yml: API서비스 포트 비공개
  4. docker-compose-uat.yml: 사용자 인수 테스트
  • 아래응 여러 환경용 설정으로 실행하는 예시이다. uat는 80, 통합테스트는 8088 포트 등으로 접근 가능하다. up으로 실행시킨 컨테이너를 종료하려면 프로젝트 이름을 -p로 지정했으니 명확히 기억해둬야 한다.
# 4.도커 컴포즈 오버라이드를 이용하여 여러 환경용 컨테이너 실행

# 기존 컨테이너 제거
docker container rm -f $(docker container ls -aq)

# 개발 환경용
docker-compose -f ./numbers/docker-compose.yml -f ./numbers/docker-compose-dev.yml -p numbers-dev up -d

# 테스트 환경용
docker-compose -f ./numbers/docker-compose.yeml -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

10-3. 환경 변수와 비밀값을 이용해 설정 주입하기

  • 단순한 어플리케이션의 차이가 아닌 각 환경에서의 차이가 필요한 경우 환경 변수와 비밀값을 이용한다.
# 1. 웹 서비스와 비밀값이 정의된 기존의 컴포즈 파일(비밀값이 정의되어있지 않아 단독으로 사용 시 유효하지 않다)
service:
	todo-web:
    	image: diamol/ch06-todo-list
        secrets:
        	- source: todo-db-connection # 컨테이너 런타임이 비밀값을 읽어오는 곳
             target: /app/config/secrets.json # 컨테이너 안에서 비밀값이 위치할 경로. 즉 위에서 읽어서 아래에 저장하라.

# 2. 개발 환경을 위한 추가 설정과 비밀값 정의됀 오버라이드 파일
service:
	todo-web:
    	ports:
        	- 8089:80
        environment: # 컨테이너 안에서만 사용되는 환경변수 추가
        	- Database:Provider=Sqlite
        env_file: # 한줄에 하나씩 key=value로된 텍스트파일
        	- ./config/logging.debug.env
            
secrets:
	todo-db-connections: # 의 실제 값이나 경로
    	file: ./config/empty.json 
  • 위 내용을 이용해 호스트 컴퓨터의 환경 변수 값을 컨테이너에 전달하는 방법은 아래와 같다.
# 3. 호스트 컴퓨터의 환경 변수 값을 사용한 컴포즈 파일
todo-web:
	ports:
    	- "${TODO_WEB_PORT}:80" # 호스트 컴 환경변수가 사용됨
    environment:
    	- Database:Provider=Postgres
    env_file:
    	- ./config/logging.information.env
    networks:
    	- app-net
  • 컴포즈로 어플리케이션 실행 시 대상 디렉터리에서 .env를 발견하면 환경파일로서 환경 변수를 읽어들이기 때문에 별도의 파라미터를 컴포즈에 지정하지 않아도 된다.
  • env에는 웹 어플리케이션 공개 코트 같은 컨테이너 설정과, 프로젝트 이름이나 컴포즈 파일 이름 등 컴포즈 명령에 대한 옵션이 포함된다.
# 4. env 파일
# 컨테이너 설정값 - 공개 포트
TODO_WRB_PORT=8877
TODO_DB_PORT=5432

# 도커 컴포즈 실행 옵션
COMPOSE_PATH_SEPARATOR=;
COMPOSE_FILE=docker-compose.yml;docker-compose-test.yml
COMPOSE_PROJECT_NAME=todo_ch10
  • environment 프로퍼티는 평문 텍스트로 전달, secrets는 민감한 정보에 적합, env_file 프로퍼티는 서비스 간 공유하는 설정이 많은 경우, env파일은 기본 설정 지정 시 유용.

10-4. 확장 필드로 중복 제거하기

  • 서비스가 확장되며 컴포즈 파일이 너무 커질 때, 확장 필드를 사용하여 YAML의 여러 블록을 한 곳에서 정의하여 스크립트 중복을 제거한다.(#include <stdio.h> 느낌인 듯)
# 1. 도커 컴포즈 파일에 정의된 확장 필드
x-labels: &logging # labels의 확장 필드
	logging: options:
    	max-size: '100m'
        max-file: '10'
x-labels: &labels
	app-name: image-gallery
  • 블록의 확장필드는 관습적으로 x로 시작하는 이름을 붙인다. 아래는 확장필드는 사용하여 YAML을 병합한 코드이다. 제대로 치환되는지는 이전과 마찬가지로 config 부명령을 사용하면 된다.
# 2. 확장필드 적용
services:

	iotd:
    	ports:
        	- 8080:80
        <<: *logging
        labels:
        	<<: *labels
        public: api
  • 다만 코어 컴포즈 파일에 정의된 확장 필드를 오버라이드 파일에서 사용할 수 없다는 YAML 포맷의 한계를 가지고 있다.

10-5. 도커를 이용한 설정 워크플로 이해하기

  • 오버라이드 파일을 사용하여 공통서비스는 그대로, 필요한 서비스는 달리 제공하여 깔끔하고 간편해진다.
  • 도커 네트워크와 오버라이드 파일을 이용해 단일 서버에 여러 목적의 어플리케이션을 실행할 수 있다.
  • 캐시크기, 로그 수준 등 환경 별 컨테이너 동작이 달라지는 경우 호버라이드 파일과 환경파일, 비밀값을 이용해 원하는 설정값을 컨테이너에 주입할 수 있다.
  • 중요한 것은, 설정 값만 다를 뿐 모든 환경에서 같은 이미지를 사용한다는 것이다.
profile
이제 3학년..

0개의 댓글