본문 바로가기

Work/개발 노트

[Docker] Secret 사용 해보기

728x90

Docker Secret을 사용하면 아래와 같은 민감한 데이터를 안전하게 관리할 수 있다.

  • 사용자 패스워드
  • TLS 인증서 및 키
  • SSH 키
  • 데이터베이스 접속 정보
  • 일반 문자열 및 바이너리 (최대 500kb 크기)

 

Docker Secret 사용 시 컨테이너 내에서는 평문으로 유지되고, 컨테이너가 중지되면 Secret도 함께 제거된다. Docker Secret은 create 명령을 사용하여 문자열 또는 파일로 생성할 수 있다. 먼저 문자열로 생성하는 경우 아래와 같이 Docker Secret을 생성한다.

 

printf <secret> | docker secret create <Secret 이름> -

 

printf 명령으로 문자열을 출력하고 파이프를 사용하여 오른편의 docker secret create 명령으로 해당 문자열을 전달하게 되면 문자열이 암호화되어 안전하게 docker secret으로 생성된다.

 

파일로 Docker Secret을 생성할 때는 아래와 같이 첫번째 인자로 Secret 이름, 두번째 인자로 대상 파일 경로를 지정하여 생성할 수 있다.

 

docker secret create my_secret ./secret.json

 

생성된 Docker Secret을 확인하고자 할 때는 아래와 같이 ls 명령을 사용한다.

 

docker secret ls

 

Docker Secret은 docker 명령이나 Docker Compose에서 사용할 수 있다. Docker Secret은 메모리에 저장되어 있는 정보이기 때문에 컨테이너 내에서 특정 경로에 마운트가 불가능하고 /run/secrets 디렉토리에서 참조할 수 있다. Docker Compose를 예로 들면 아래와 같다.

 

version: '3.1'

services:
   db:
     image: mysql:latest
     environment:
       MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD_FILE: /run/secrets/db_password
     secrets:
       - db_root_password
       - db_password

secrets:
   db_password:
     file: db_password.txt
   db_root_password:
     file: db_root_password.txt
     

 

먼저 위 yaml에서 각 서비스에 해당하는 컨테이너의 명세를 services 섹션 하위에 설정하고, secrets 섹션에 사용할 secret을 설정한다. 위 예에서는 secrets의 db_password가 Docker Secret의 이름이 되고 file 필드에 대상 파일 경로를 지정하게 된다. 이 후 services 내 컨테이너 명세 부분에 secrets를 지정하여 컨테이너에서 사용할 것을 명시한다. 컨테이너 내 특정 경로에 Secret 파일을 생성할 수는 없고, /run/secrets 디렉토리에서 secret 이름으로 참조할 수 있다.

728x90