• 108、如何使用 Secret? (Swarm15)


     
    我们经常要想容器传递敏感信息,最常见的就是密码。比如:
     
    docker run -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
     
    在启动 Mysql 容器时,我们通过环境变量 MYSQL_ROOT_PASSWORD 设置 mysql 的管理员密码。不过密码是以明文的形式写在了 docker run 命令中,有潜在的安全隐患。
     
    为了解决这个问题, docker swarm 提供了secret 机制,允许将敏感信息加密后保存到secret 中,用户可以指定哪些容器可以使用此 secret。
     
    如果使用 secret 启动 Mysql 容器,方法是:
     
    root@host03:~# echo 'my-secret-pw' | docker secret create my_secret_data1 -    #    创建一个secret
    z04oyb43x6brtvpdel6bqc7rv
     
    root@host03:~# docker secret ls    #    查看 secret 列表
    ID                          NAME                DRIVER              CREATED             UPDATED
    z04oyb43x6brtvpdel6bqc7rv   my_secret_data1                         7 seconds ago       7 seconds ago
     
    root@host03:~# docker secret inspect my_secret_data1    #    查看 secret详细信息
    [
        {
            "ID": "z04oyb43x6brtvpdel6bqc7rv",
            "Version": {
                "Index": 13493
            },
            "CreatedAt": "2019-05-16T02:05:11.083477558Z",
            "UpdatedAt": "2019-05-16T02:05:11.083477558Z",
            "Spec": {
                "Name": "my_secret_data1",
                "Labels": {}
            }
        }
    ]
     
    root@host03:~# docker service create --name mysql --secret source=my_secret_data1,target=mysql_root_password -e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" mysql
    4epm4b3arpzetqra3vuveqgq5
    overall progress: 1 out of 1 tasks
    1/1: running   [==================================================>]
    verify: Service converged
     
    root@host03:~# docker service ps mysql
    ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
    8icyti1vg03n        mysql.1             mysql:latest        host02              Running             Running 5 minutes ago                       
     
    root@host02:~# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
    74ae17815637        mysql:latest        "docker-entrypoint.s…"   57 seconds ago      Up 56 seconds       3306/tcp, 33060/tcp   mysql.1.8icyti1vg03nlmp87zna0vw4g
     
    root@host02:~# docker exec mysql.1.8icyti1vg03nlmp87zna0vw4g cat /run/secrets/mysql_root_password    #    在容器中可以看到未加密的密码
    my-secret-pw
     
     
     
    docker service create --name mysql
    --secret source=my_secret_data1,target=mysql_root_password                     #    source指定容器使用secret后,secret会被解密并存放到容器中 /run/secret/<filename>,其中filename由tatget指定
    -e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password"     #    环境变量 MYSQL_ROOT_PASSWORD_FILE 从容器中指定的文件 /run/secret/<filename> 中获得(明文)
    mysql
     
    这里可能会有两个问题:
     
    1、在第一步创建secret时,不是也使用明文了吗?这跟在环境变量中直接指定密码有什么不同?
     
        在我们的例子中创建secret和使用secret是分开完成的,其好处是将密码和容器解耦。secret可以有专人(比如管理员)负责,而运行容器的用户只需要使用secret但并不需要知道secret的内容。也就是说例子中的两个步骤可以由不同的人在不同的时间完成。
     
    2、secret是以文件形式mount到容器中,容器怎么知道去哪里读取呢?
     
        这需要image的支持,如果image希望他部署出来的容器能够从secret中读取数据,那么此image就应该提供一种方式,让用户能够制定secret的位置。最常用的方法就是通过环境变量,Docker的很多官方image都采用这种方式,比如Mysql镜像同事提供了MYSQL_ROOT_PASSWORD 和 MYSQL_ROOT_PASSWORD_FILE 两个环境变量。
     
  • 相关阅读:
    SDN作业(4)
    SDN作业(3)
    第一次个人编程作业
    SDN作业(2)
    SDN作业(1)
    第一次博客作业
    浅谈闭包
    预编译And作用域链
    定时器
    window事件
  • 原文地址:https://www.cnblogs.com/www1707/p/10880830.html
Copyright © 2020-2023  润新知