Docker Swarm secrets
目录
- 什么是secrets
- Docker 如何管理secrets
- docker secret 相关命令
- 示例一:简单示例
- 示例二: 在Nginx Service中使用secret
什么是secrets
在docker swarm中,secrets是一组敏感数据,比如:
- 密码
- SSH私钥
- SSL证书
- 数据库密码
- 通用字符串或二进制内容(最大可达500 kb)
在Docker 1.13及更高版本中,可以使用Docker secret集中管理这些数据,安全地传输给需要访问这些数据的容器。secret在docker swarm和传输中是被加密的。只有已被授予访问权限的service可以访问secret
【注意】Docker secret只对集群服务可用,而对独立容器不可用
Docker 如何管理secrets
当向集群添加一个secret时,Docker通过一个相互的TLS链接将secret发送给swarm manager。secret存储在Raft日志中,Raft日志是加密的。Raft日志会被复制到其他swarm manager,确保所有swarm manager数据相同,达到高可用性
当授予新创建的或正在运行的服务对秘密的访问权时,已解密的秘密将被挂载到内存文件系统中的容器中。容器内挂载点的位置默认为Linux容器中的/run/secrets/。在Docker 17.06或更高版本中可以指定自定义位置。
如果节点在运行具有secret访问权限的容器时丢失了与集群的连接,则容器仍然具有访问其secret的权限,但在节点重新连接到集群之前无法接收更新。
不能删除正在运行的服务正在使用的秘密。有关在不中断正在运行的服务的情况下删除秘密的方法,请参考“Rotate a secret”
要更容易地更新或回滚secret,建议在secret名称中添加版本号或日期。这可以通过在给定容器中控制secret的挂载点来实现。
docker secret 相关命令
- docker secret create
- docker secret inspect
- docker secret ls
- docker secret rm
- --secret flag for docker service create
- --secret-add and --secret-rm flags for docker service update
示例一:简单示例
这个示例展示secret在几个命令中是如何工作的
向Docker添加一个secrets。docker secret create命令读取标准输入,因为最后一个参数,表示从中读取秘密的文件被设置为-
[root@node1 ~]# printf "This is a secret" | docker secret create my_secret_data - ua6qvxgbuqtjnhv8bd5lz7fpv
创建一个redis服务并授予它访问这个secret的权限。默认情况下,容器可以在/run/secrets/访问secret,但是可以使用target选项自定义容器上的文件名。
[root@node1 ~]# docker service create --name redis --secret my_secret_data redis:alpine kun7yexgygau9b3eh5mnv58r7 overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged
查看service
[root@node1 ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS kun7yexgygau redis replicated 1/1 redis:alpine
进入容器查看secret文件。默认所有人可读,文件名与secret名称相同。
/run/secrets # pwd /var/run/secrets /run/secrets # ls my_secret_data /run/secrets # cat my_secret_data This is a secret/run/secrets #
commit容器,secret并不会被提交
$ docker secret lsID NAME CREATED UPDATED wwwrxza8sxy025bas86593fqs my_secret_data 4 hours ago 4 hours ago$ docker secret rm my_secret_dataError response from daemon: rpc error: code = 3 desc = secret 'my_secret_data' is in use by the following service: redis
通过运行update service,从运行的redis服务中删除对secret的访问
[root@node2 ~]# docker service update --secret-rm my_secret_data redis redis overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged [root@node2 ~]#
验证secret是否不可再访问
[root@node2 ~]# docker exec -it 1f324 /bin/sh /data # cd /var/run/ /run # ls /run # ls * ls: *: No such file or directory /run # 此时可以看出secret文件不存在,secret不可访问
停止service,删除secret
[root@node1 ~]# docker service rm redis redis[root@node1 ~]# docker secret rm my_secret_data my_secret_data
示例二: 在Nginx Service中使用secret
本例分为两部分。第一部分是关于生成站点证书的, 第二部分是配置Nginx容器
GENERATE THE SITE CERTIFICATE生成站点证书
为你的站点生成根CA和TLS证书和密钥。对于生产站点,你可能希望使用Let’s Encrypt之类的服务来生成TLS证书和密钥,但是本示例使用命令行工具。这一步有点复杂,但只是一个设置步骤,以便你可以将某些内容存储为Docker secret。如果你想跳过这些子步骤,可以使用Let 's Encrypt生成站点密钥和证书,命名文件site.key和site.crt,然后跳到 Configure the Nginx container
生成root key
[root@node1 ~]# openssl genrsa -out "root-ca.key" 4096 Generating RSA private key, 4096 bit long modulus ..........................................................................................................................................................................................++ ..........++ e is 65537 (0x10001)
使用root key生成CSR(证书签名请求文件)
openssl req \-new -key "root-ca.key" \-out "root-ca.csr" -sha256 \-subj '/C=US/ST=CA/L=San Francisco/O=Docker/CN=Swarm Secret Example CA'
配置根CA。编辑一个名为root-ca. cnf的新文件,并将以下内容粘贴到其中。这将限制根CA签署叶子证书,而不是中间CA
[root_ca] basicConstraints = critical,CA:TRUE,pathlen:1 keyUsage = critical, nonRepudiation, cRLSign, keyCertSign subjectKeyIdentifier=hash
签署证书
$ openssl x509 -req -days 3650 -in "root-ca.csr" \-signkey "root-ca.key" -sha256 -out "root-ca.crt" \-extfile "root-ca.cnf" -extensions \root_caSignature ok subject=/C=US/ST=CA/L=San Francisco/O=Docker/CN=Swarm Secret Example CA Getting Private key
生成site key
[root@node1 ~]# openssl genrsa -out "site.key" 4096 Generating RSA private key, 4096 bit long modulus ............................................................................++ ....................................................................................................++ e is 65537 (0x10001)
生成站点证书并使用站点密钥签名
openssl req -new -key "site.key" -out "site.csr" -sha256 \-subj '/C=US/ST=CA/L=San Francisco/O=Docker/CN=localhost'
配置站点证书。编辑一个名为site.cnf的新文件,并将以下内容粘贴到其中。这限制了站点证书,因此它只能用于对服务器进行身份验证,而不能用于对证书进行签名。
[server] authorityKeyIdentifier=keyid,issuer basicConstraints = critical,CA:FALSE extendedKeyUsage=serverAuth keyUsage = critical, digitalSignature, keyEncipherment subjectAltName = DNS:localhost, IP:127.0.0.1 subjectKeyIdentifier=hash
签署site证书
openssl x509 -req -days 750 -in "site.csr" -sha256 \-CA "root-ca.crt" -CAkey "root-ca.key" -CAcreateserial \-out "site.crt" -extfile "site.cnf" -extensions serverSignature ok subject=/C=US/ST=CA/L=San Francisco/O=Docker/CN=localhost Getting CA Private Key
Nginx service 不需要site.csr和site.cnf,但是如果你想生成一个新的站点证书,则需要它们。保护root-ca.key文件。
Configure the Nginx container
生成一个非常基本的Nginx配置,它通过HTTPS提供静态文件。TLS证书和密钥存储为Docker机密,因此可以轻松地rotate它们。
在当前目录中,使用以下内容创建一个名为site.conf的新文件server {listen 443 ssl;server_name localhost;ssl_certificate /run/secrets/site.crt;ssl_certificate_key /run/secrets/site.key;location / {root /usr/share/nginx/html;index index.html index.htm;} }
创建三个secret,表示key、证书和site.conf。您可以将任何文件作为secret存储,只要它小于500kb。这允许您将key、证书和配置与使用它们的服务解耦。在这些命令中,最后一个参数表示要从主机文件系统上读取secret的文件的路径。在这些示例中,秘密名称和文件名是相同的。
[root@node1 ~]# docker secret create site.key site.key d6c6xr6hdsgqpvdk86tqwmhbg [root@node1 ~]# docker secret create site.crt site.crt p6m3m0djiqn1606ocf6fnjpux [root@node1 ~]# [root@node1 ~]# docker secret create site.conf site.conf czezgjtxtcnc4avrbigxeixbu [root@node1 ~]# [root@node1 ~]# docker secret ls ID NAME DRIVER CREATED UPDATED czezgjtxtcnc4avrbigxeixbu site.conf 38 seconds ago 38 seconds ago p6m3m0djiqn1606ocf6fnjpux site.crt 43 seconds ago 43 seconds ago d6c6xr6hdsgqpvdk86tqwmhbg site.key 47 seconds ago 47 seconds ago
- 创建一个运行Nginx并可以访问这三个secret的service。docker service create命令的最后一部分创建一个符号链接,从site.conf secret到/etc/nginx.conf。,其中Nginx查找额外的配置文件。此步骤发生在Nginx实际启动之前,因此如果更改Nginx配置,则不需要重新构建映像。
在Docker 17.05和更早版本中,secret总是位于/run/secrets/目录中。Docker 17.06及更高版本允许为容器内的secret指定自定义位置。
Docker 17.06 and higher:
$ docker service create \--name nginx \--secret site.key \--secret site.crt \--secret source=site.conf,target=/etc/nginx/conf.d/site.conf \--publish published=3000,target=443 \nginx:latest \sh -c "exec nginx -g 'daemon off;'"
source 指定容器使用 secret 后,secret 会被解密并存放到容器的文件系统中,默认位置为 /run/secrets/。--secret source=site.conf,target=/etc/nginx/conf.d/site.conf 的作用就是指定使用secret site.conf,然后把器解密后的内容保存到容器/etc/nginx/conf.d/site.conf文件中
Docker 17.05 and earlier:
$ docker service create \--name nginx \--secret site.key \--secret site.crt \--secret site.conf \--publish published=3000,target=443 \nginx:latest \sh -c "ln -s /run/secrets/site.conf /etc/nginx/conf.d/site.conf && exec nginx -g 'daemon off;'"
第一个示例同时显示了用于secret的短语法和长语法,第二个示例只显示了短语法。这个简短的语法在/run/secrets/中创建与secret名称相同的文件。在运行的容器中,现在存在以下三个文件
- /run/secrets/site.key
- /run/secrets/site.crt
/etc/nginx/conf.d/site.conf (or /run/secrets/site.conf if you used the second example)
4.验证Nginx服务正在运行
[root@node1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
g57n64qa269c nginx replicated 1/1 nginx:latest *:3000->443/tcp
[root@node1 ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
g2no1sh4n2fa nginx.1 nginx:latest node2 Running Running 2 minutes ago
5.访问服务
失败,待查
https://docs.docker.com/engine/swarm/secrets/
https://www.cnblogs.com/wanghui-garcia/p/10245858.html
https://blog.51cto.com/cloudman/2052309
转载于:https://www.cnblogs.com/mldblue/articles/11016828.html
Docker Swarm secrets相关推荐
- docker swarm
底层实现 命令列表 基于centos7 名称 指令 详细 开放HTTP的API /lib/systemd/system/docker.service ExecStart 参数后面加上 -H tcp:/ ...
- docker swarm实践爆心肝总结全在这里,火速收藏!!!
Docker Swarm 快速入门 "这是一个非常棒的docker swarm学习历程.我把一个国外的docker精简实践教学进行了简略的翻译,比起国内博客学习的总结性文章,它更注重让小白在 ...
- Jenkins持续集成结合Docker Swarm集群实现Web应用部署的发布
案列环境: 准备5台虚拟机,其中3台用于部署Docker Swarm集群,1台部署代码版本控制系统,1台部署Jenkins持续集成工具. 192.168.80.10 swarm01 192.168.8 ...
- 部署docker swarm(解决公有云环境网络问题)
文章目录 swarm部署 一.节点docker环境安装 二.swarm环境安装 1. swarm 管理节点初始化 2. slaver1节点加入swarm集群 3. 服务发布 4. 管理命令 5. 网络 ...
- 在 Docker 中运行 MySQL:多主机网络下 Docker Swarm 模式的容器管理
本文将以多主机网络环境为基础,探讨如何利用内置编排工具 Docker Swarm 模式对各主机上的容器加以管理. Docker Engine – Swarm 模式 在多台主机之上运行 MySQL 容器 ...
- Docker Swarm Beta 发布,Docker 集群管理
Docker Swarm 今天发布了 Beta 版本,详细介绍请看这里. Docker Swarm是一个Dockerized化的分布式应用程序的本地集群,它是在Machine所提供的功能的基础上优化主 ...
- 容器管理大战:Kubernetes vs.Docker Swarm与Amazon ECS
Container Orchestration: 快速入门 自20世纪70年代以来,容器技术就已经出现,但直到2013年Docker首次亮相后才开始发挥作用.从那时起,容器已经流行起来:它们正在显著地 ...
- 正式环境docker部署hyperf_应用部署 - Docker Swarm 集群搭建 - 《Hyperf v1.1.1 开发文档》 - 书栈网 · BookStack...
Docker Swarm 集群搭建 现阶段,Docker容器技术已经相当成熟,就算是中小型公司也可以基于 Gitlab.Aliyun镜像服务.Docker Swarm 轻松搭建自己的 Docker集群 ...
- 论Docker swarm与Kubernetes孰强孰弱
前言 有无数的辩论和讨论谈论Kubernetes和Docker.如果你没有深入研究,你会认为这两种开源技术都在争夺集装箱至上.让我们明确指出,Kubernetes和Docker Swarm不是竞争对手 ...
- Docker swarm集群详解(一)
一.简介 Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源.Swarm和Ku ...
最新文章
- 推荐系统发展的六大影响因子 | 深度
- mysql 大事务 binlog_执行大事务时出现binlog解析失败
- 终于看见光的速度了:每秒一万亿帧的相机,拍摄到光的运行状态!
- 如何制定恰当的信息安全策略
- NET问答: C# 中是否有最高效的方式对大文件做 checksum ?
- 在.NET Core中使用MEF
- css3 loading 效果1
- Java中大规模集合快速求和计算
- 服务器即将维护完成,新一轮大服务器即将开启:3月26日维护8小时
- python 判断文件夹是否存在 否则创建_10行Python代码自动清理电脑内重复文件,解放双手!...
- [.NET] 使用 .NET Framework 開發 ActiveX Control
- C# JPG转PDF
- kubeadm部署k8s集群(1.9.2)
- JavaSwing+SQL Server实现网上购物系统
- C语言 Mkl 矩阵乘法,MKL库矩阵乘法
- oracle断电ora-01033,ora-00600,
- 参加了feedsky的博客大赛
- 第七章 文本数据-学习笔记+练习题
- Android设备远程控制工具AVDTools使用
- 双系统平板电脑android升级吗,平板电脑双系统好不好 平板电脑双系统优缺点【详细介绍】...