도커 config와 secret에 대해 알아본다.
Configuration 구성 설정 파일은 어플리케이션을 실행할 때 필요한 설정 파일을 의미하며, DB 커넥션 스트링, 각종 제약과 비즈니스 로직에 사용되는 설정값을 파일을 통해 설정하는 것을 의미.
12.1 구성 설정 배포와 관리
도커 서비스는 어플리케이션을 정의하는 이미지에 의존하는 것처럼 configuration 리소스에 의존한다. 구성 설정이나 시크릿 파일이 누락되었다면, 어플리케이션은 실행 되지 않거나 잘 못 된 행동을 유발한다.
12.2 어플리케이션과 구성 설정 분리
greetings 서비스는 "Hello World!"를 서로 다른 언어로 출력하는 서비스이다. 이 서비스의 개발자는 유저의 요청이 오면 한 인사말을 응답으로 주고 싶어한다. 번역가를 통해 검증 받은 인사말들을 다음과 같은 config.common.yml 파일에 설정하였다.
config.common.yml
greetings:
- 'Hello World!'
- 'Hola Mundo!'
- 'Hallo Welt!'
서비스는 실제 배포 환경을 인식하여 기본 인사말에 더해 특정 인사말들을 추가하길 원한다. 개발팀은 dev, stage, 그리고 prod 환경을 관리하고 dev 환경에서는 다음과 같은 구성을 사용하고자 한다.
config.dev.yml
greetings:
- 'Orbis Terrarum slave!'
- 'Bonjour le monde!'
우리가 배포할 때 필요한 것은 배포 환경에 따른 구성 설정 파일을 컨테이너 내부로 주입하는 것이다.
greetings 서비스는 다음 git 소스에 정의된 Docker Compose 파일을 사용하여 도커 스웜에 스택으로 배포할 것이다.
GitHub - dockerinaction/ch12_greetings: This repository contains the greetings service example used in Chapter 12 of Docker in Action, 2ed.
배포에 사용할 docker.compose.yml
# Docker Compose file reference: https://docs.docker.com/compose/compose-file/
version: '3.7'
configs:
env_specific_config:
file: ./api/config/config.${DEPLOY_ENV:-prod}.yml
services:
api:
image: ${IMAGE_REPOSITORY:-dockerinaction/ch12_greetings}:api
ports:
- '8080:8080'
- '8443:8443'
user: '1000'
configs:
#- env_specific_config # short form mounts the config file in as a file named `env_specific_config`
- source: env_specific_config
target: /config/config.${DEPLOY_ENV:-prod}.yml
uid: '1000'
gid: '1000'
mode: 0400 #default is 0444 - readonly for all users
secrets: []
environment:
DEPLOY_ENV: ${DEPLOY_ENV:-prod}
환경변수 DEPLOY_ENV에 따라 적절한 config 파일 i.e. config.dev.yml을 사용하여 어플리케이션이 해당 파일을 주입 받아 실행할 수 있도록 배포 설정을 하였다.
config resource 다루기
Docker config resource는 Swarm 클러스터 객체로 어플리케이션의 런타임 필요로 저장할 때 사용한다.
configs:
env_specific_config:
file: ./api/config/config.${DEPLOY_ENV:-prod}.yml
가장 윗 부분에 정의된 configs 엔트리에 env_specific_config는 환경 변수 DEPLOY_ENV에 결정된 파일 이름을 가리킨다.
도커 스택이 생성될 때 해당 파일은 config resource 로써 도커 클러스터 내부에 저장된다.
services:
api:
image: ${IMAGE_REPOSITORY:-dockerinaction/ch12_greetings}:api
ports:
- '8080:8080'
- '8443:8443'
user: '1000'
configs:
#- env_specific_config # short form mounts the config file in as a file named `env_specific_config`
- source: env_specific_config
target: /config/config.${DEPLOY_ENV:-prod}.yml
uid: '1000'
gid: '1000'
mode: 0400 #default is 0444 - readonly for all users
서비스 정의에 configs 엔트리에서 볼륨을 지정하듯 config resource를 주입한다.
해당 파일의 uid, gid 그리고 접근 권한이 설정된다. (readonly to user)
어플리케이션 배포
환경변수를 설정하고 어플리케이션 greetings_dev를 배포한다.
$env:DEPLOY_ENV="dev" # on windows
DEPLOY_ENV=dev # on linux
docker stack deploy --compose-file docker-compose.yml greetings_dev
localhost:8080 포트의 웹 주소로 들어가면 다음 응답을 받을 수 있다.
localhost:8080/greeting 요청에 인사말이 응답으로 오는 지 확인한다.
Hello World!
Hallo Welt!
Orbis Terrarum salve!
도커 config 관리하기
docker config는 subcommand로 create, inspect, ls, rm을 지원한다.
docker config inspect greetings_dev_env_specific_cofnig로 예제로 만들어진 config resource를 자세히 출력한다.
해당이름은 도커 스택의 이름 greetings_dev를 prefix로 한다.
Data는 실제 config 데이터를 base64 인코딩한 값이며 비밀성 유지를 지키지지는 않는다. 단지 도커 스웜 클러스터사이의 저장과 이동을 위해 인코딩되었다. 스웜은 클러스터 중앙 저장소에서 꺼내어 서비스 태스크의 파일 시스템에 배치한다.
도커 config 는 create와 rm 만 지원하며, 업데이트는 허용하지 않는다.
따라서 config 내용만 업데이트하여 같은 배포를 실행하면 실패하게 된다.
docker stack deploy --compose-file docker-compose.yml greetings_dev
도커 서비스와 의존성
서비스는 이제 이미지와 config resource에 의존한다.
config resource가 존재하지 않거나 변경되었다면 서비스는 시작하지 않는다.
Depdendency | application_image | config_resource |
service greetings_dev | dockerinaction/ch12_greetings:api | greetings_dev_env_specific_config |
서비스 inspection
docker service inspect --format '{{ json .Spec.TaskTemplate.ContainerSpec.Configs }}' greetings_dev_api
실행하고 있는 greetings_dev_api 서비스가 참조하는 ConfigID는 생성된 config resource의 unique ID를 가리킨다.
서비스 정의에 config가 바인딩되어 정의되어 있는 것이다.
[{"File":{"Name":"/config/config.dev.yml","UID":"1000","GID":"1000","Mode":256},"ConfigID":"qss45j65h01kjpwxw1npjvz08","ConfigName":"greetings_dev_env_specific_config"}]
config는 이미 사용중이라면 삭제가 불가능하고 이미 있는 이름으로 생성도 불가능하다.
config를 변경하고자 한다면, config 도 새로운 리소스 이름으로 실행해야한다. 마치 이미지에 새로운 배포 태그를 붙여 새로운 배포를 실행하는 것과 같다.
t0 : first application deployment with greetings_dev_env_specific_config
t1 : changes configuration as greetings_dev_env_specific_config_v1
t2 : update features and change configuration as greetings_dev_env_specific_config_v2
12.3 Secrets, 특별한 구성 설정
Secret은 비밀번호나 API key, private encryption 등 절대 외부로 노출되면 안되는 설정 값들을 의미한다.
어플리케이션이 Secret과 함께 실행하지 않는다면 외부 인증 주체가 어플리케이션을 인증하고 secret을 제공하는 수단을 사용해야한다. 이러한 수단으로써 도커는 부트스트랩 과정에서 신뢰있는 시크릿 제공을 가능하게 한다. 클러스터링 서비스 과정에서 암호화된 통신을 사용하여 자신의 서비스 Service ID로 클러스터링 매니저에 인증을 하기 때문이다.
도커 스웜은 Service ID를 기반으로 어떤 Secret을 Service 태스크가 접근할 수 있는 지 결정한다.
도커는 tmpfs 파일 시스템을 사용하여 읽기만 가능한 인메모리 파일 시스템을 컨테이너에 마운트한다. 기본값으로 secrets은 /run/secrets 경로에 마운트 된다.
어플리케이션은 어떤 파일을 읽을 지 알고 있고 도커로 부터 제공받은 secret 파일을 읽어 비밀번호나 API_KEY와 같은 것을 사용할 수 있게 한다.
greetings 서비스 예제)
HTTPS 서비스를 위하여 CA의 private key를 docker secret으로 public key을 docker config로 주입한다.
$env:DEPLOY_ENV="prod" # on windows
DEPLOY_ENV=prod # on linux
docker stack deploy --compose-file docker-compose.yml --compose-file docker-compose.prod.yml greetings_prod
위를 실행하면 다음과 같은 오류가 발생한다.
configs:
ch12_greetings_svc-prod-TLS_CERT_V1:
external: true
secrets:
ch12_greetings-svc-prod-TLS_PRIVATE_KEY_V1:
external: true
docker-compose.prod.yml 파일에는 config ch12_greetings_svc-prod-TLS_CERT_V1와 ch12_greetings-svc-prod-TLS_PRIVATE_KEY_V1가 자동 생성이 아닌 "external" 전역에 정의된 값을 사용하도록 되어 있기 때문이다.
docker secret create ch12_greetings-svc-prod-TLS_PRIVATE_KEY_V1 "./api/config/insecure.key"
docker config create ch12_greetings_svc-prod-TLS_CERT_V1 "./api/config/insecure.crt"
docker secret create와 docker config create를 사용하여 적절한 secret과 config를 정의한다.
다시 서비스를 시작하면, https 로 시작한 greetings_prod_api를 확인할 수 있다.
서비스 로그를 확인하여 참조한 https CA 인증서의 private key와 public key 위치를 확인한다.
https://localhost:8443 웹 주소에서 정상 출력됨을 확인한다.
요약
- 어플리케이션은 배포되는 환경에 맞게 동작을 변경해야한다.
- 도커 config와 secret 자원은 배포되는 환경에 맞게 동작되도록 어플리케이션을 조작하도록 한다.
- secrets는 비밀성을 요구하는 특별 설정값들이다.
- 도커 스웜은 trust 체인을 사용하여 도커 서비스가 시크릿이 특정 어플리케이션에 제공될 수 있음을 인증한다.
- 도커는 config와 secret 제공을 위해 tmpfs 파일 시스템을 사용한다.
- 배포 프로세스는 자동화를 위해 config와 secret resource에 이름을 붙이는 명명법으로 관리하는 것을 권고한다.
'Cloud > Docker' 카테고리의 다른 글
Docker In Action 11. Services with Docker and Compose (0) | 2024.12.14 |
---|---|
Docker In Action 9. Public and private software distribution (1) | 2024.12.09 |
Docker In Action 8. Building image automaticall with Dockerfiles (1) | 2024.12.08 |
Docker In Action 7. Packaging software in images (1) | 2024.12.06 |
Docker In Action 6. Limiting risk with resource controls (1) | 2024.12.04 |