7.4.도커 컴포즈로 애플리케이션 설정값 지정하기

001) version: "3.7"
002) 
003) services:
004)   todo-db:
005)     image: diamol/postgres:11.5
006)     ports:
007)       - "5433:5432"
008)     networks:
009)       - app-net
010) 
011)   todo-web:
012)     image: diamol/ch06-todo-list
013)     ports:
014)       - "8030:80"
015)     environment:
016)       - Database:Provider=Postgres
017)     depends_on:
018)       - todo-db
019)     networks:
020)       - app-net
021)     secrets:
022)       - source: postgres-connection
023)         target: /app/config/secrets.json
024) 
025) networks:
026)   app-net:
027) 
028) secrets:
029)   postgres-connection:
030)     file: ./config/secrets.json
  1. 015~016: 컨테이너 안에서 사용될 환경 변수 값 정의 (Database:Provider의 값은 Postgres)
  2. 021~023: 실행 시 컨테이너 내부의 파일에 기록될 비밀값 정의. /app/config/secrets.json 파일에 postgres-connection이라는 이름의 비밀값의 값이 기록된다.
  3. 028~030: 비밀값 postgres-conection의 값을 secrets.json 파일에서 읽어 오라는 의미 바인드 마운트와 비슷하지만 추후 클러스터 환경에서 암호화된 진짜 비밀값으로 이전할 수 있는 여지가 있다.

비밀값 * 주로 클러스터 환경에서 쿠버네티스나 도커 스웜 같은 컨테이너 플랫폼을 통해 제공된다. * 평소에는 클러스터 데이터베이스에 암호화돼 있기 때문에 민감한 정보로 구성된 설정값을 전달하는 데 적합 * DB 패스워드 * 인증서 * API 키 등 * 도커를 단일 컴퓨터에서 실행하는 상황이라면 비밀값을 보관하는 클러스터 데이터베이스가 없을 것이므로 파일을 통해 비밀값을 전달해도 된다.

설정값 정의 * 애플리케이션 설정값을 컴포즈 파일에 정의하면 같은 도커 이미지라도 다양하게 활용할 수 있고 서로 다른 각 환경에 대한 설정을 명시적으로 정의할 수 있다. * 개발 환경과 테스트 환경의 컴포즈 파일을 별도로 작성해 두면 아래처럼 활용 가능 1. 공개하는 포트를 환경에 따라 달리함 1. 애플리케이션의 기능을 선택적으로 활성화 * 지금 살펴본 컴포즈 파일은 환경 변수와 비밀값을 정의하여 아래 적용 1. to-do 애플리케이션을 PostgreSQL을 사용하는 모드로 실행 1. 데이터베이스 접속 정보를 주입

컨테이너 실행

  • docker-compose ps: 컴포즈 애플리케이션을 구성하는 컨테이너 목록 표시
001)  docker-compose up -d
002) [+] Running 18/2
003)   todo-web 7 layers [⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                         8.5s 
004)   todo-db 9 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                        7.7s 
005) [+] Running 3/3
006)   Network todo-list-postgres_app-net       Created                                                           0.0s 
007)   Container todo-list-postgres-todo-db-1   Started                                                           0.4s 
008)   Container todo-list-postgres-todo-web-1  Started                                                           0.7s 
009)  
010)  docker-compose ps
011) NAME                            IMAGE                   COMMAND                  SERVICE             CREATED             STATUS              PORTS
012) todo-list-postgres-todo-db-1    diamol/postgres:11.5    "docker-entrypoint.s…"   todo-db             19 minutes ago      Up 19 minutes       0.0.0.0:5433->5432/tcp
013) todo-list-postgres-todo-web-1   diamol/ch06-todo-list   "dotnet ToDoList.dll"    todo-web            19 minutes ago      Up 19 minutes       0.0.0.0:8030->80/tcp

애플리케이션과 설정값을 분리

  • 이미지는 빌드 파이프라인을 통해 만들어지고 다시 테스트 환경을 거치며 운영 환경에 적합한지 검증된다.
  • 각 환경마다 컴포즈 파일에서 쉽게 정의할 수 있는 환경 변수나 바인드 마운트 설정, 비밀값 등으로 설정값이 적용된다.
  • 모든 환경에서 동일한 이미지를 사용하므로 검증을 마친 이미지를 그대로 운영 환경에 투입할 수 있다.

links

social