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