[클라우드/Docker 기본(17) - Docker Swarm Mode(2) : config/secret]

SooYeon Yeon·2022년 9월 13일
0

클라우드 Docker

목록 보기
18/24

config/secret

  • compose 파일이나 Dockerfile에서 변수 지정(-e MYSQL_DATABASE, -e MYSQL_ROOT_PASSWORD)를 한 적이 있다.
  • 해당 내용은 민감한 정보를 포함하고 있음에도 이미지에서 해당 내용을 직접 볼 수 있다는 단점이 있다.
  • 모든 사용자별로 별도의 환경변수, index.html, DB 패스워드를 다르게 하고싶다면, 그때마다 별도의 이미지를 만들어야하는 불편함이 있다. 이 경우 사용자별로 별도의 config, secret을 사용하면 추가 이미지를 생성하는 작업 없이 패스워드나 변수 전달이 가능해진다.
  • 기존 명령에서 pw를 지정하거나 변수를 선언하는 것이 아니라 별도의 config나 secret 객체를 생성하고 이를 컨테이너에 적용하는 방식으로 운영
  • config : 변수, 파일, 레지스트리 설정파일, index.html같은 보안성이 낮은 파일
  • secret : 민감한 정보 DB password, ssh key, 인증서 등 같이 보안성이 필요한 파일

실습

secret 사용하기

  • secret 파일 만들기
  • test123을 입력값으로 받아서 mysql_password 값으로 집어 넣음
rapa@manager:~/0824$ echo "test123" | docker secret create mysql_password -
twm1ixh7gcrqchh1nn0dx6bm5
  • insepect
rapa@manager:~/0824$ docker secret inspect mysql_password
[
    {
        "ID": "twm1ixh7gcrqchh1nn0dx6bm5",
        "Version": {
            "Index": 403
        },
        "CreatedAt": "2022-08-24T07:25:16.690340785Z",
        "UpdatedAt": "2022-08-24T07:25:16.690340785Z",
        "Spec": {
            "Name": "mysql_password",
            "Labels": {}
        }
    }
]

컨테이너에 붙여 생성하고나서 컨테이너 안에 파일 형태로 존재하기 때문에 이곳에서는 볼 수 없음

MSP업체에서는 내가 입력한 pw가 test123인지 확인할 수 없어야 함

데이터베이스 배포

컨테이너의 /run/secrets밑에 mysql_root_password, mysql_password 형태로 들어간다.

rapa@manager:~/0824$ 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" --constraint node.role==manager mysql:5.7
image mysql:5.7 could not be accessed on a registry to record
its digest. Each node will access mysql:5.7 independently,
possibly leading to different nodes running different
versions of the image.

klujh0uzukz8yexln89x03le8
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged

source=mysql_password는 로컬 호스트, target=mysql_root_password는 컨테이너

  • secret 파일들 확인(값 보이지않음)
rapa@manager:~/0824$ docker secret ls
ID                          NAME             DRIVER    CREATED          UPDATED
twm1ixh7gcrqchh1nn0dx6bm5   mysql_password             33 minutes ago   33 minutes ago
  • 생성한 컨테이너에게 명령을 전달
  • 컨테이너에서는 /run/secrets 파일을 볼 수 있다.(값도)
rapa@manager:~/0824$ docker container ls
CONTAINER ID   IMAGE                 COMMAND                  CREATED             STATUS             PORTS                                                 NAMES
5d2cd03f845d   mysql:5.7             "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes      3306/tcp, 33060/tcp                                   sql.1.3pwd620b73wz4erxu1ved2q87
67d63beb412d   portainer/portainer   "/portainer"             About an hour ago   Up About an hour   8000/tcp, 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp   portainer
rapa@manager:~/0824$ docker container exec 5d2cd03f845d ls /run/secrets/
mysql_password
mysql_root_password

rapa@manager:~/0824$ docker container exec 5d2cd03f845d cat /run/secrets/mysql_password
test123

config 사용하기

index.html 내용을 가져다가 webconfig 파일 만들기

rapa@manager:~/0824$ echo "hello world" > index.html
rapa@manager:~/0824$ docker config create webcfg index.html 
v7a9vi866vv89mi86te2fgula
  • config 파일 확인
rapa@manager:~/0824$ docker config ls
ID                          NAME        CREATED              UPDATED
v7a9vi866vv89mi86te2fgula   webcfg      31 seconds ago       31 seconds ago
  • config파일인 webcfg 파일 확인
rapa@manager:~/0824$ docker config inspect webcfg
[
    {
        "ID": "v7a9vi866vv89mi86te2fgula",
        "Version": {
            "Index": 1613
        },
        "CreatedAt": "2022-08-24T08:06:39.334220228Z",
        "UpdatedAt": "2022-08-24T08:06:39.334220228Z",
        "Spec": {
            "Name": "webcfg",
            "Labels": {},
            "Data": "aGVsbG8gd29ybGQK"
        }
    }
]
  • Data값으로 확인 가능
rapa@manager:~/0824$ echo aGVsbG8gd29ybGQK | base64 -d
hello world
  • 서비스 배포
rapa@manager:~/0824$ docker service create --replicas 1 --constraint node.role==manager --name webcfg -p 8888:80 --config source=webcfg,target=/usr/share/nginx/html/index.html nginx
image nginx:latest could not be accessed on a registry to record
its digest. Each node will access nginx:latest independently,
possibly leading to different nodes running different
versions of the image.

ivkv9wgsskspoouix78wi6zyh
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged

211.183.3.100:8888 접속하면 hello world가 보인다.

0개의 댓글