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
- 015~016: 컨테이너 안에서 사용될 환경 변수 값 정의 (Database:Provider의 값은 Postgres)
- 021~023: 실행 시 컨테이너 내부의 파일에 기록될 비밀값 정의. /app/config/secrets.json 파일에 postgres-connection이라는 이름의 비밀값의 값이 기록된다.
- 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
애플리케이션과 설정값을 분리
- 이미지는 빌드 파이프라인을 통해 만들어지고 다시 테스트 환경을 거치며 운영 환경에 적합한지 검증된다.
- 각 환경마다 컴포즈 파일에서 쉽게 정의할 수 있는 환경 변수나 바인드 마운트 설정, 비밀값 등으로 설정값이 적용된다.
- 모든 환경에서 동일한 이미지를 사용하므로 검증을 마친 이미지를 그대로 운영 환경에 투입할 수 있다.