비밀값 * 비밀값은 컨피그 객체와 비슷한 점이 많다. * 로컬 파일로부터 생성한 후, 클러스터 데이터베이스에 저장했다가 서비스 정의에서 비밀값을 참조하면 실행된 컨테이너의 파일 시스템에 비밀값의 값이 전달된다. * 비밀값이 컨피그 객체와 가장 크게 다른 점은 비밀값을 사용하는 워크플로 중 비밀값이 컨테이너에 전달된 상태에서만 복호화된 비밀값을 볼 수 있다는 것이다. * 평소에는 클러스터 데이터베이스에 암호화돼 보관되다가 해당 비밀값을 사용하는 컨테이너를 실행할 노드로만 전달된다. * 매니저 노드에서 워커 노드로 전달되는 중에도 여전히 암호화된 상태를 유지하며 사용할 컨테이너 안에서만 복호화된다.
실습 로컬 파일의 내용으로 비밀값을 만들고, 새로 만든 비밀값의 정보를 확인해 보자.
001) ➜ cd ch13/exercises
002)
003) # 로컬에 위치한 JSON 파일의 내용으로 비밀값을 생성한다.
004) ➜ docker secret create todo-list-secret ./todo-list/secrets/secrets.json
005) x7icdhr2583s2vbat80ro38ml
006)
007) # 새로 만든 비밀값의 정보를 확인한다.
008) # pretty 플래그를 적용하면 데이터를 볼 수 있다.
009) ➜ docker secret inspect --pretty todo-list-secret
010) ID: x7icdhr2583s2vbat80ro38ml
011) Name: todo-list-secret
012) Driver:
013) Created at: 2023-07-22 08:38:18.938932083 +0000 utc
014) Updated at: 2023-07-22 08:38:18.938932083 +0000 utc
- 004: 비밀값은 스웜 데이터베이스에 암호화돼 저장되며 매니저 노드에서 다른 노드로 전달될 때도 암호화된 채로 전달된다.
-
009~014: 비밀값의 정보를 확인해 봐도 원래 내용을 알 수 없다. 원래 내용은 비밀값을 실제 사용하는 컨테이너 안에서만 볼 수 있다.
-
이제 비밀값이 스웜에 저장됐으니 이 비밀값을 사용하는 새로운 버전의 애플리케이션을 배포할 수 있다.
- 컴포즈 파일에서 비밀값을 참조하는 문법 역시 컴피그 객체와 매우 유사하다.
- 원본이 되는 비밀값과 비밀값의 내용이 들어갈 대상 파일의 경로를 지정하면 된다.
예제 13-4 비밀값과 컨피그 객체를 사용해 애플리케이션 설정하기
services:
todo-web:
image: diamol/ch06-todo-list
ports:
- 8080:80
configs:
- source: todo-list-config
target: /app/config/config.json
secrets:
- source: todo-list-secret
target: /app/config/secrets.json
# ...
secrets:
todo-list-secret:
external: true
실습 이전 버전에서 빠져 있었던 데이터베이스 접속 문자열이 추가된 최신 버전의 애플리케이션을 배포해 애플리케이션을 정상 상태로 되돌린다. 이 과정에서 서비스가 업데이트된다.
001) # 최신 버전의 애플리케이션을 배포한다.
002) ➜ docker stack deploy -c ./todo-list/v4.yml todo
003) Updating service todo_todo-db (id: 1dku4wwx3m8fi1zdh5b0l03lb)
004) Updating service todo_todo-web (id: kvr2ij57ccj7zz424af8kmi6v)
005)
006) # 스택에 포함된 레플리카의 정보를 확인한다.
007) ➜ docker stack ps todo
008) ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
009) vc1nf84echce todo_todo-db.1 diamol/postgres:11.5 docker-desktop Running Running 3 hours ago
010) 42dtj3a8inh4 todo_todo-web.1 diamol/ch06-todo-list:latest docker-desktop Running Running 12 seconds ago
011) m9ouwn6e13k3 \_ todo_todo-web.1 diamol/ch06-todo-list:latest docker-desktop Shutdown Shutdown 13 seconds ago
- 002~004: 도커 명령행 도구로 스택을 업데이트할 때 스택에 포함된 모든 서비스가 업데이트 중이라고 나오지만, 사실 정의가 수정되지 않은 서비스는 변경되지 않는다.
-
009~011: 데이터베이스 서비스는 처음 만들어진 레플리카로 동작 중인 반면에 웹 서비스는 종료된 이전 레플리카, 비밀값과 컨피그 객체로 설정된 새로운 레플리카를 볼 수 있다.
-
여기서 꼭 알아 둘 점은 컨피그 객체와 비밀값은 수정이 불가하다는 것이다.
- 클러스터에서 컨피그 객체와 비밀값을 한번 만들고 나면 이들의 내용은 변하지 않는다.
- 만약 내용을 변경할 필요가 생긴다면 새로운 컨피그 객체나 비밀값을 만들어야 한다.
- 이를 위해서는 다음 세 단계를 거친다.
- 변경된 내용을 담은 새로운 컨피그 객체 혹은 비밀값을 기존의 것과 다른 이름으로 만든다.
- 컴포즈 파일의 정의에 사용된 컨피그 객체 혹은 비밀값의 이름을 새로 만든 이름으로 바꾼다.
- 변경된 컴포즈 파일로 스택을 배포한다.
- 결국 설정값을 수정하려면 서비스를 업데이트해야 한다.