我们经常要想容器传递敏感信息,最常见的就是密码。比如:
 
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 两个环境变量。
 

108、如何使用 Secret? (Swarm15)的更多相关文章

  1. 如何使用 Secret?- 每天5分钟玩转 Docker 容器技术(108)

    我们经常要向容器传递敏感信息,最常见的莫过于密码了.比如: docker run -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql 在启动 MySQL 容器时我 ...

  2. Kubernetes 学习13 kubernetes pv pvc configmap 和secret

    一.概述 1.我们在pvc申请的时候未必就有现成的pv能正好符合这个pvc在申请中指定的条件,毕竟上一次的成功是我们有意设定了有一些满足有一些不满足的前提下我们成功创建了一个pvc并且被pod绑定所使 ...

  3. 【恐怖的数组模拟】Secret Poems - HihoCoder - 1632

    Secret Poems - HihoCoder - 1632 图一 图二 Following the order indicated by arrows, you can get “THISISAV ...

  4. Android Secret Code

    我们很多人应该都做过这样的操作,打开拨号键盘输入*#*#4636#*#*等字符就会弹出一个界面显示手机相关的一些信息,这个功能在Android中被称为android secret code,除了这些系 ...

  5. Entity Framework 6 Recipes 2nd Edition(10-8)译 - >映射插入、修改、删除操作到存储过程

    10-8. 映射插入.修改.删除操作到存储过程 问题 想要映射插入.修改.删除操作到存储过程 解决方案 假设已有运动员实体模型,如Figure 10-8所示. 对应的数据库表如Figure 10-9所 ...

  6. ASP.NET OAuth:access token的加密解密,client secret与refresh token的生成

    在 ASP.NET OWIN OAuth(Microsoft.Owin.Security.OAuth)中,access token 的默认加密方法是: 1) System.Security.Crypt ...

  7. 【资源】108个大数据文档PDF开放下载-整理后打包下载

                  本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html        本博客其他.NET开源项目文章目录:h ...

  8. 108 vpn iptables

    [root@fge108 webapps]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 47.88.1 ...

  9. 10-8位7段数码管驱动实验——小梅哥FPGA设计思想与验证方法视频教程配套文档

    芯航线--普利斯队长精心奉献   实验目的: 1.实现FPGA驱动数码管动态显示: 2.使用In system sources and probes editor工具,输入需要显示在数码管上的的数据, ...

随机推荐

  1. leetcode 1278 分割回文串

    time O(n^2*k)  space O(n^2) class Solution { public: int palindromePartition(string s, int K) { //分成 ...

  2. 使用SlidingDrawer(滑动式抽屉)实现抽屉效果

    SlidingDrawer隐藏屏外的内容,并允许用户通过handle以显示隐藏内容.它可以垂直或水平滑动,它有俩个View组成,其一是可以拖动的handle,其二是隐藏内容的View.它里面的控件必须 ...

  3. 在smarty模板中截取指定长度的字符串

    在smarty模板中截取指定长度的字符串,可使用truncate这个插件. 用法: {{$data.value|truncate:28:'...'}} 28个字节14个字数输出,多余部分输出...,一 ...

  4. 小D课堂 - 新版本微服务springcloud+Docker教程_3-03CAP原理、常见面试题

    笔记 3.分布式系统CAP原理常见面试题和注册中心选择         简介:讲解CAP原则在面试中回答和注册中心选择 C A 满足的情况下,P不能满足的原因:             数据同步(C) ...

  5. 性能测试之JMeter远程模式

    性能测试之JMeter远程模式 事实上,你的JMeter客户端机器是不能表现出完美的压力请求,来模拟足够多的用户或由于网络限制去向服务施加压力,一种解决方法是通过一个JMeter去控制多个/远程JMe ...

  6. 配置文件c3p0-config.xml

    <c3p0-config> <!-- 使用默认的配置读取连接池对象 --> <default-config> <!-- 连接参数 --> <pro ...

  7. AESTest

    using Gaea.MySql; using System; using System.Data; using System.IO; using System.Security.Cryptograp ...

  8. Docker 容器中搭建 nexus npm私库

    1,版本 dockers :1.13.1   :nexus 3 2,安装 docker pull liumiaocn/nexus 3,启动 项目 详细 Nexus UI 8081 private re ...

  9. Docker管理面板-URLOS(易用、高效、强大)

    一.介绍 URLOS是一个Docker管理面板,它把服务器端软件应用的安装行为简化到极致,堪称服务器端的应用宝,具有集群管理.自动故障转移.自动负载均衡等高级功能,可轻易搭建7*24小时在线的网站运行 ...

  10. MSF魔鬼训练营-3.3.2 口令猜测与嗅探

    密码暴力破解以SSH为例,其他协议方法类似 SSH      msf > use auxiliary/scanner/ssh/ssh_login msf auxiliary(ssh_login) ...