我们经常要想容器传递敏感信息,最常见的就是密码。比如:
 
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. PHP压缩图片并模糊处理(抄的哟)

    class image_blur{ /** * 图片高斯模糊(适用于png/jpg/gif格式) * @param $srcImg 原图片 * @param $savepath 保存路径 * @par ...

  2. 为什么有些应用非VxWorks不可

          实时操作系统(RTOS)是专用于对时间精确度敏感的操作系统.典型的情况是,这种应用需要从传感器收集数据.做出分析并对关键性设备进行控制,例如飞机.列车.手术刀.这类控制必须精准,不容许出现 ...

  3. 前世今生:Hive、Shark、spark SQL

    Hive (http://en.wikipedia.org/wiki/Apache_Hive )(非严格的原文顺序翻译)  Apache Hive是一个构建在Hadoop上的数据仓库框架,它提供数据的 ...

  4. 给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,如aBf转换成bCg, 字符串内的其他字符不改变,给定函数,编写函数 void Stringchang(const char*input,char*output)其中input是输入字符串,output是输出字符串

    import java.util.Scanner; /*** * 1. 给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,如aBf转换成bCg, 字符串内的其他字 ...

  5. web搜索框的制作(必应)

    搜索框中我们输入一些字或者字母,为何下面就会有一些自动补齐的相关搜索,比如我在搜索输入框中输入一个字母e,下面就会出现饿了么,e租宝,ems等相关的搜索链接.然后经过百度,发现原来很多厂商的服务器早已 ...

  6. python3.6安装jpype1后引入jpype报“ImportError: numpy.core.multiarray failed to import”问题

    jpype是调用java接口的第三方库,通过该库,python可以运行java程序,从而解决一些调用java的问题,比如:java开发的接口,测试时, 有java的加密算法就不用python写一遍重复 ...

  7. asp.net core mvc View Component 应用

    ViewComponent 1.View 组件介绍 在ASP.NET CORE MVC中,View组件有点类似于partial views,但是他们更强大,View组件不能使用model bindin ...

  8. pyqt5在QMainWindow中布局的问题

    在pyqt5中使用了父类为QMainWindow的话,在里面使用布局类,QGridLayout, QHBoxLayout ,QVBoxLayout 时,发现不好用. 解决: 如果是在以QWidget为 ...

  9. c# Selenium ExpectedConditions 不存在

    Selenium中的显示等待指的是,等待某一元素出现或者等待页面加载完成后,才执行下一步.需要用到WebDriverWait类. 例如: , , )); var element = wait.Unti ...

  10. django中的urlpatterns的正则语法

    ^ 指定起始字符或字符串,放进[]代表否定 $ 指定终止字符 / 对应原来的字符 [...] 括号中表示一个字符的格式设置 \d 任何一个数字字符 \D 非数字的字符 \w 任何一个字符[a-zA-Z ...