Infra/Docker
Docker Swarm - 시크릿
wave35
2024. 9. 29. 20:34
Docker Secrets 이란
- Docker Swarm에서 Secrets는 민감한 데이터를 안전하게 관리하는 방법입니다.
- docker secret create 명령을 통해 Secret을 생성하고, 서비스에서 사용합니다.
- Secret은 컨테이너 내에서 파일 형태로 마운트되며, 환경 변수나 설정 파일을 통해 서비스가 Secret을 읽을 수 있습니다.
- Secret은 클러스터 매니저 노드에서 안전하게 관리되며, 컨테이너가 필요할 때만 접근할 수 있습니다.
- docker secret ls, docker secret inspect로 Secret을 확인합니다.
- docker secret rm으로 삭제할 수 있습니다.
Docker Secrets 생성
먼저, 민감한 정보를 Secret으로 생성합니다.
여기서는 MySQL 데이터베이스 비밀번호를 예시로 하겠습니다.
예시에서는 mysql_password라는 이름의 Secret을 생성합니다.
echo "my_secret_password" | docker secret create mysql_password -
ckh0v12lwj1ljt8wcc5qdxry4
# Secret 목록 확인
docker secret ls
ID NAME DRIVER CREATED UPDATED
ckh0v12lwj1ljt8wcc5qdxry4 mysql_password 5 seconds ago 5 seconds ago
Docker Secrets을 사용하는 서비스 배포
이제 MySQL 서비스를 배포하고, 방금 생성한 mysql_password Secret을 서비스에 사용하도록 설정하겠습니다.
Secret은 컨테이너 내에서 파일로 마운트되며, 이 파일을 읽어 MySQL에 비밀번호를 전달할 수 있습니다.
docker-compose.yml 파일을 작성하여 Secret을 사용하는 MySQL 서비스를 정의합니다.
version: "3.8"
services:
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_password
secrets:
- mysql_password
deploy:
replicas: 1
secrets:
mysql_password:
external: true
MYSQL_ROOT_PASSWORD_FILE:
- MySQL 컨테이너는 이 환경 변수를 통해 루트 비밀번호를 읽습니다.
- mysql_password Secret이 /run/secrets/mysql_password 경로에 파일로 마운트됩니다.
secrets:
- 이 서비스가 사용할 Secret을 정의합니다.
external:
- true는 이미 Swarm에 생성된 Secret을 사용한다는 의미입니다.
스택 배포
Docker Swarm에 이 스택을 배포합니다. 스택 이름은 mysql_stack으로 지정하겠습니다.
docker stack deploy -c docker-compose.yml mysql_stack
Creating network mysql_stack_default
Creating service mysql_stack_db
# 서비스 상태 확인
docker stack services mysql_stack
ID NAME MODE REPLICAS IMAGE PORTS
i8fjkl3p7c9a mysql_stack_db replicated 1/1 mysql:latest
Secret이 컨테이너에 어떻게 마운트되는지 확인
서비스가 실행되는 컨테이너 내에서
Secret이 /run/secrets/mysql_password 경로에 파일로 마운트되었는지 확인할 수 있습니다.
# 실행 중인 컨테이너 ID를 확인합니다
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4f57d38e1a35 mysql:latest "docker-entrypoint.s…" 1 minute ago Up 1 minute 3306/tcp mysql_stack_db.1.i8fjkl3p7c9a
# 해당 컨테이너에 접속하여 Secret 파일의 내용을 확인합니다
docker exec -it 4f57d38e1a35 cat /run/secrets/mysql_password
my_secret_password
Secret 삭제
필요하지 않은 Secret은 다음 명령어로 삭제할 수 있습니다.
docker secret rm mysql_password