0부터 시작하는 Docker Swarm 공부 - Config & Secret

Jaehong Lee·2022년 8월 24일
0
post-thumbnail

1. Config & Secret

  • compose 파일이나 Dockerfile 에서 환경 변수를 지정한 적이 있다. 해당 내용은 민감한 정보를 포함하고 있음에도 이미지에서 해당 내용을 직접 볼 수 있다는 단점이 있다

  • 이를 해결하기 위해 별도의 config & secret 을 사용해야 한다

    • config 는 사용자 요청 별로 별도의 파일로 생성되며, config 파일 내부의 값을 컨테이너 내부에 적용시킨다. 이를 통해 각 컨테이너 별로 변수나 index.html 과 같은 요소를 컨테이너에 지정해 줄 수 있다
    • secret 을 통해 password 를 안전하게 전달해준다
  • 모든 사용자 별로 별도의 환경 변수, index.html , DB Password 를 다르게 하고 싶다면, 그때마다 별도의 이미지를 만들어야 하는 불편함이 있다. 이 경우, 사용자 별로 별도의 config, secret 을 사용하면, 추가 이미지를 생성하는 작업 없이 Password 나 변수 전달이 가능해진다

    • config : 변수, 파일
    • secret : Password, Key

config 와 secret 은 하나의 파일이자 객체이다

2. Secret 생성

echo "test123" | docker secret create mysql_password -
  • secret 객체 mysql_password 에 test123 을 값으로 저장하여 생성했다. - 는 stdin 으로 앞에 echo 실행 값을 의미한다. 이는 mysql_password 라는 secret 객체를 생성한 것이다
  • 현재는 secret 객체 내부에 값을 확인할 수 없다. 이는 컨테이너 배포시 객체 안에 설정한 값은 파일로 들어간다
    • 이를 통해 컨테이너의 소유권을 가진 요청한 사용자만 컨테이너 안에 생성된 파일을 통해 해당 password 와 같은 비밀 정보를 확인할 수 있다
    • 파일은 컨테이너의 /run/secrets/ 밑에 지정한 이름으로 저장된다. 한 파일에 하나의 값이 저장된다. 만약, 2 개의 password 를 넣고 싶다면, 2 개의 파일을 생성해서 넣어야 한다

3. Secret 을 이용하여 Service 배포

docker service create --name sql --secret source=mysql_password,target=mysql_root_password --secret source=mysql_password,target=mysql_password -e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" -e MYSQL_PASSWORD_FILE="/run/secrets/mysql_password" -e MYSQL_DATABASE='testdb' mysql:5.7
  • secret 옵션의 source 는 secret 객체 이름이고, target 은 컨테이너에 해당 secret 객체를 붙여넣을 파일의 이름 및 경로를 입력한다

Secret 의 경우, 배포되는 컨테이너의 /run/secrets/ 에 자동으로 파일이 들어가게 되므로, target 에 파일 이름만 작성해주면 된다

  • 이후, 환경 변수 지정시 File 을 통해 값을 지정한다
  • Service 를 배포해주자

4. Secret 정보 확인

  • secret list 를 확인하자. 우리가 생성한 mysql_password 가 보인다
  • inspect 도 가능하다. 확인해보면 우리가 내부 Data는 확인할 수 없다
  • 컨테이너 배포 후 컨테이너 안에 있는 파일의 내용을 살펴보면, 값을 확인할 수 있다

5. Config 생성

  • index.html 을 하나 생성하자. curl -L 은 해당 link 에 가서 내용을 가져오는 것이다
docker config create webconfig index.html

  • index.html 의 내용을 가지고 webconfig 라는 config 객체를 생성하였다
  • inspect 를 통해 webconfig 객체의 상세 정보를 확인하자. Secret 과 다르게 Config 는 내부 Data 를 암호화한 값을 확인할 수 있다
  • 위와 같이 base64 를 통해 출력하면, 원본 Data 값을 확인할 수 있다

6. Config 를 이용하여 Service 배포

docker service create --replicas 1 --constraint node.role==manager --name webcfg -p 8888:80 --config source=webconfig,target=/usr/share/nginx/html/index.html nginx
  • config 옵션을 통해 config 객체를 컨테이너의 파일로 붙여넣자

Config 의 경우, 배포되는 컨테이너에 붙여넣을 파일 경로를 Secret 과 달리 직접 지정해줘야 한다

  • Service 를 배포하자
  • page 가 잘 출력된다
profile
멋진 엔지니어가 될 때까지

0개의 댓글