Store configuration data using Docker Configs 使用Docker Configs存储配置数据

Docker 17.06引入了集群服务配置,允许你在服务镜像或运行的容器之外存储非敏感信息,如配置文件。这允许你尽可能保持镜像的通用性,而不需要将配置文件绑定到容器中或使用环境变量。
Configs的操作方式与secret类似,不同的是它们没有在静止时加密,而是直接挂载到容器的文件系统中,而不使用RAM磁盘。配置可以在任何时候从服务中添加或删除,服务可以共享配置。你甚至可以将configs与环境变量或标签结合使用,以获得最大的灵活性。配置值可以是通用字符串或二进制内容(大小不超过500 kb)。
注意:Docker configs只对集群服务可用,而不是对独立容器可用。要使用此特性,请考虑将容器调整为以1的比例作为服务运行。
Linux和Windows服务都支持Configs。

Windows support

Docker 17.06及更高版本包括对Windows容器上的configs的支持。在实现中存在差异的地方,将在下面的示例中调用它们。请注意以下显著的差异:

  • 带有自定义目标的配置文件不直接绑定挂载到Windows容器中,因为Windows不支持非目录文件绑定挂载。相反,容器的configs都挂载在容器内的C:\ProgramData\Docker\internal\configs(一个应用程序不应该依赖的实现细节)中。符号链接用于从那里指向容器中配置所需的目标。默认目标是C:\ProgramData\Docker\configs。
  • 在创建使用Windows容器的服务时,configs不支持指定UID、GID和模式的选项。Configs目前只能由容器内具有系统访问权限的管理员和用户访问。

How Docker manages configs   Docker如何管理配置

当你向swarm添加配置时,Docker通过一个相互的TLS连接将配置发送给swarm manager。配置存储在Raft日志中,该日志是加密的。整个Raft日志在其他管理器之间复制,确保configs具有与群管理数据的其他部分相同的高可用性保证。

当你授予新创建或正在运行的服务访问权限到配置中时,配置将作为文件挂载在容器中。在Linux容器中,容器中挂载点的位置默认为/<config-name>。在Windows容器中,configs全部挂载到C:\ProgramData\Docker\configs和创建到所需位置的符号链接,默认为C:\<config-name>。

可以使用数字ID或用户或组的名称设置所有权(uid和gid)或配置。还可以指定文件权限(模式)。对于Windows容器,这些设置将被忽略。

  • 如果没有设置,则配置由运行容器命令的用户(通常是根用户)和该用户的默认组(通常也是根用户)拥有。
  • 如果没有设置,配置具有世界可读权限(模式0444),除非在容器中设置了umask,在这种情况下,模式会受到umask值的影响。

你可以更新服务来授予它对其他配置的访问权限,或者随时撤销它对给定配置的访问权限。

只有当节点是群集管理器或正在运行已被授予配置访问权的服务任务时,节点才能访问配置。当容器任务停止运行时,共享给它的配置将从容器的内存文件系统中卸载,并从节点的内存中刷新。

如果节点在运行具有配置访问权的任务容器时失去了与集群的连接,那么任务容器仍然可以访问其配置,但是在节点重新连接到集群之前不能接收更新。

你可以在任何时候添加或检查单个配置,或者列出所有配置。无法删除正在运行的服务正在使用的配置。有关在不中断正在运行的服务的情况下删除配置的方法,请参见 Rotate a config

为了更容易地更新或回滚配置,可以考虑在配置名中添加版本号或日期。通过在给定容器中控制配置的挂载点,可以更容易地做到这一点。

要更新堆栈,请更改你的 Compose文件,然后重新运行docker stack deploy -c <new-compose-file> <stack-name>。如果在该文件中使用新配置,则服务将开始使用它们。请记住,配置是不可变的,因此你不能更改现有服务的文件。相反,你可以创建一个新的配置来使用不同的文件

你可以运行docker stack rm来停止应用程序并取下堆栈。这将删除docker stack deploy创建的具有相同堆栈名称的任何配置。这将删除所有配置,包括那些没有被服务引用的配置,以及docker service update --config-rm之后剩下的配置。

Read more about docker config commands

使用这些链接可以阅读有关特定命令的信息,或者继续阅读example about using configs with a service

Examples

这一节包含了演示如何使用Docker configs的分级示例。

注意:为了简单起见,这些示例使用单引擎集群和未扩展的服务。示例使用Linux容器,但Windows容器也支持configs。

Defining and using configs in compose files  定义和使用compose文件中的配置

docker compose和docker stack命令都支持在compose文件中定义配置。有关详细信息,请参见the Compose file reference

Simple example: Get started with configs  开始配置

这个简单的例子展示了configs如何在几个命令中工作。对于真实的示例,请继续Intermediate example: Use configs with a Nginx service

1.向Docker添加配置。docker config create命令读取标准输入,因为最后一个参数,表示要从中读取配置的文件被设置为-。

$ echo "This is a config" | docker config create my-config -

2.创建一个redis服务并授予它对配置的访问权。默认情况下,容器可以在/my-config访问配置,但是你可以使用target选项定制容器上的文件名。

$ docker service create --name redis --config my-config redis:alpine

3.使用docker service ps检查任务是否正常运行。如果一切正常,输出如下:

$ docker service ps redis

ID            NAME     IMAGE         NODE              DESIRED STATE  CURRENT STATE          ERROR  PORTS
bkna6bpn8r1a redis. redis:alpine ip---- Running Running seconds ago

4.使用docker ps得到redis服务任务容器的ID,这样你可以使用docker container exec去连接到容器和读取配置数据文件的内容,对所有人默认为可读的,并有着像配置名一样相同的名字。下面的第一个命令演示了如何查找容器ID,第二个和第三个命令使用shell补全来自动查找容器ID。

$ docker ps --filter name=redis -q

5cb1c2348a59

$ docker container exec $(docker ps --filter name=redis -q) ls -l /my-config

-r--r--r--     root     root             Jun   : my-config                                                     

$ docker container exec $(docker ps --filter name=redis -q) cat /my-config

This is a config

5.尝试移除配置。移除失败是因为redis服务正在运行且正在访问配置

$ docker config ls

ID                          NAME                CREATED             UPDATED
fzwcfuqjkvo5foqu7ts7ls578 hello minutes ago minutes ago $ docker config rm my-config Error response from daemon: rpc error: code = desc = config 'my-config' is
in use by the following service: redis

6.通过更新服务来从运行中的redis中移除对配置的访问:

$ docker service update --config-rm my-config redis

7.再次重复步骤3和4,查看服务不再访问配置。容器ID是不同的,因为service update命令重新部署了服务

$ docker container exec -it $(docker ps --filter name=redis -q) cat /my-config

cat: can't open '/my-config': No such file or directory

8.停止并移除服务,并从Docker中移除配置

$ docker service rm redis

$ docker config rm my-config

Advanced example: Use configs with a Nginx service

本例分为两部分。第一部分是关于生成站点证书的,根本不直接涉及Docker configs,但是它设置了第二部分,在其中存储和使用站点证书作为一系列密钥,Nginx配置作为配置。这个示例展示了如何在配置上设置选项,例如容器中的目标位置和文件权限(模式)。

GENERATE THE SITE CERTIFICATE生成站点证书

为你的站点生成根CA和TLS证书和密钥。对于生产站点,你可能希望使用Let’s Encrypt之类的服务来生成TLS证书和密钥,但是本示例使用命令行工具。这一步有点复杂,但只是一个设置步骤,以便你可以将某些内容存储为Docker秘密。如果你想跳过这些子步骤,可以使用 use Let’s Encrypt生成站点密钥和证书,命名文件为site.key和site.crt,然后跳转到 Configure the Nginx container

1.生成一个根密钥:

$ openssl genrsa -out "root-ca.key" 

2.使用根密钥生成一个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'

3.配置根CA.编辑一个名为root-ca.cnf的新文件,并将以下内容粘贴到其中。这限制根CA只签名叶证书,而不签名中间CA。

[root_ca]
basicConstraints = critical,CA:TRUE,pathlen:
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash

4.签名证书

$ openssl x509 -req -days  -in "root-ca.csr" \
-signkey "root-ca.key" -sha256 -out "root-ca.crt" \
-extfile "root-ca.cnf" -extensions \
root_ca

5.生成站点密钥

$ openssl genrsa -out "site.key" 

6.生成站点证书并使用站点密钥签名

$ openssl req -new -key "site.key" -out "site.csr" -sha256 \
-subj '/C=US/ST=CA/L=San Francisco/O=Docker/CN=localhost'

7.配置站点证书。编辑一个名为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

8.对站点证书签名

$ openssl x509 -req -days  -in "site.csr" -sha256 \
-CA "root-ca.crt" -CAkey "root-ca.key" -CAcreateserial \
-out "site.crt" -extfile "site.cnf" -extensions server

9.site.csrsite.cnf文件不被Nginx服务需要,但是如果你想生成一个新的站点证书,则需要它们。保护root-ca.key文件。

CONFIGURE THE NGINX CONTAINER 配置Ngnix容器

1.生成一个非常基本的Nginx配置,它通过HTTPS提供静态文件。TLS证书和密钥存储为Docker密钥,这样可以方便地轮转它们。

在当前目录中,创建一个带着下面内容的名为site.conf的新文件

server {
listen 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;
}
}

2.创建两个秘密,分别表示密钥和证书。你可以将任何文件作为秘密存储,只要它小于500kb。这允许你将密钥和证书与使用它们的服务解耦。在这些示例中,密钥名称和文件名是相同的。

$ docker secret create site.key site.key

$ docker secret create site.crt site.crt

3.在Docker配置中保存site.conf文件。第一个参数是配置的名称,第二个参数是要从中读取配置的文件。

$ docker config create site.conf site.conf

列举配置信息:

$ docker config ls

ID                          NAME                CREATED             UPDATED
4ory233120ccg7biwvy11gl5z site.conf seconds ago seconds ago

4.创建一个运行Nginx的服务,并且可以访问这两个秘密和配置。将模式设置为0440,这样文件只能由其所有者和该所有者的组(而不是整个世界)读取。

$ docker service create \
--name nginx \
--secret site.key \
--secret site.crt \
--config source=site.conf,target=/etc/nginx/conf.d/site.conf,mode= \
--publish published=,target= \
nginx:latest \
sh -c "exec nginx -g 'daemon off;'"

在运行的容器中,下面的三个文件将存在:

  • /run/secrets/site.key
  • /run/secrets/site.crt
  • /etc/nginx/conf.d/site.conf

5.核查Ngnix服务正在运行

$ docker service ls

ID            NAME   MODE        REPLICAS  IMAGE
zeskcec62q24 nginx replicated / nginx:latest $ docker service ps nginx NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
nginx..9ls3yo9ugcls nginx:latest moby Running Running minutes ago

6.核查服务是可操作的:你可以到达Ngnix服务端,并且正确的TLS证书正在被使用

$ curl --cacert root-ca.crt https://0.0.0.0:3000

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p> <p>For online documentation and support, refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p>
</body>
</html>
$ openssl s_client -connect 0.0.0.0: -CAfile root-ca.crt

CONNECTED()
depth= /C=US/ST=CA/L=San Francisco/O=Docker/CN=Swarm Secret Example CA
verify return:
depth= /C=US/ST=CA/L=San Francisco/O=Docker/CN=localhost
verify return:
---
Certificate chain
s:/C=US/ST=CA/L=San Francisco/O=Docker/CN=localhost
i:/C=US/ST=CA/L=San Francisco/O=Docker/CN=Swarm Secret Example CA
---
Server certificate
-----BEGIN CERTIFICATE-----

-----END CERTIFICATE-----
subject=/C=US/ST=CA/L=San Francisco/O=Docker/CN=localhost
issuer=/C=US/ST=CA/L=San Francisco/O=Docker/CN=Swarm Secret Example CA
---
No client certificate CA names sent
---
SSL handshake has read bytes and written bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : AES256-SHA
Session-ID: A1A8BF35549C5715648A12FD7B7E3D861539316B03440187D9DA6C2E48822853
Session-ID-ctx:
Master-Key: F39D1B12274BA16D3A906F390A61438221E381952E9E1E05D3DD784F0135FB81353DA38C6D5C021CB926E844DFC49FC4
Key-Arg : None
Start Time:
Timeout : (sec)
Verify return code: (ok)

7.除非你打算继续下一个示例,否则在运行此示例之后,请通过删除nginx服务以及存储的secrets和配置来清理。

$ docker service rm nginx

$ docker secret rm site.crt site.key

$ docker config rm site.conf

现在你已经配置了一个Nginx服务,它的配置与其镜像解耦。你可以运行具有完全相同的镜像但配置不同的多个站点,根本不需要构建自定义镜像。

Example: Rotate a config 轮转配置

要轮转配置,首先要用与当前使用的配置名称不同的名称保存新配置。然后重新部署服务,删除旧配置并在容器中的相同挂载点添加新配置。这个示例是在上一个示例的基础上轮转site.conf配置文件。

1.本地编辑site.conf文件。添加index.php到index行并保存该文件

server {
listen 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 index.php;
}
}

2.使用site.conf创建一个新Docker配置,命名为site-v2.conf

$ docker config create site-v2.conf site.conf

3.更新Ngnix服务去使用一个新的配置,而不是旧的那个

$ docker service update \
--config-rm site.conf \
--config-add source=site-v2.conf,target=/etc/nginx/conf.d/site.conf,mode= \
nginx

4.使用docker service ps nginx核查Ngnix服务完全重新部署。当确定时,你就可以移除旧的site.conf配置了

$ docker config rm site.conf

5.为了清理,你可以移除Ngnix服务和密钥和配置

$ docker service rm nginx

$ docker secret rm site.crt site.key

$ docker config rm site-v2.conf

现在你可以更新ngnix服务配置而不用重新构建镜像

docker swarm英文文档学习-9-使用Docker Configs存储配置数据的更多相关文章

  1. docker swarm英文文档学习-10-使用Docker密钥管理敏感数据

    Manage sensitive data with Docker secrets使用Docker secrets管理敏感数据 About secrets 对于Docker Swarm服务来说,sec ...

  2. docker swarm英文文档学习-3-开始

    https://docs.docker.com/engine/swarm/swarm-tutorial/ 1)Getting started with swarm mode 本教程向你介绍Docker ...

  3. docker swarm英文文档学习-11-上锁你的集群来保护你的加密密钥

    Lock your swarm to protect its encryption key上锁你的集群来保护你的加密密钥 在Docker 1.13及更高版本中,默认情况下,群管理器使用的Raft日志在 ...

  4. docker swarm英文文档学习-12-在集群模式中的Raft共识

    Raft consensus in swarm mode 在集群模式中的Raft共识 当Docker引擎在集群模式下运行时,manager节点实现Raft 共识算法来管理全局集群状态.Docker s ...

  5. docker swarm英文文档学习-8-在集群中部署服务

    Deploy services to a swarm在集群中部署服务 集群服务使用声明式模型,这意味着你需要定义服务的所需状态,并依赖Docker来维护该状态.该状态包括以下信息(但不限于): 应该运 ...

  6. docker swarm英文文档学习-6-添加节点到集群

    Join nodes to a swarm添加节点到集群 当你第一次创建集群时,你将单个Docker引擎置于集群模式中.为了充分利用群体模式,可以在集群中添加节点: 添加工作节点可以增加容量.当你将服 ...

  7. docker swarm英文文档学习-7-在集群中管理节点

    Manage nodes in a swarm在集群中管理节点 List nodes列举节点 为了查看集群中的节点列表,可以在管理节点中运行docker node ls: $ docker node ...

  8. docker swarm英文文档学习-4-swarm模式如何运行

    1)How nodes work Docker引擎1.12引入了集群模式,使你能够创建一个由一个或多个Docker引擎组成的集群,称为集群.集群由一个或多个节点组成:在群模式下运行Docker引擎1. ...

  9. docker swarm英文文档学习-5-在swarm模式中运行Docker引擎

    Run Docker Engine in swarm mode在swarm模式中运行Docker引擎 当你第一次安装并开始使用Docker引擎时,默认情况下禁用swarm模式.在启用集群模式时,需要处 ...

随机推荐

  1. WINAPI实现简易扫雷游戏

    //扫雷 #include <windows.h> #include <windowsx.h> #include <strsafe.h> #include < ...

  2. MySQL学习(三) SQL基础查询

    其实在数据库最经常用的当属查询操作 基本语法 SELECT [ALL | DISTINCT | DISTINCTROW ] 字段列表 AS 字段别名 [FROM 表名 WHERE 条件表示式 GROU ...

  3. 【操作系统】二、JVM线程与Linux内核线程的映射

    Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是 ...

  4. 【RabbitMQ】4、RabbitMQ几种Exchange 模式

    AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列.生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机.先由Exchange来接收,然后Exchang ...

  5. LVS+keepalived 实战

    安装依赖: yum -y install wget libnl* popt* gcc.x86_64 gcc-c++.x86_64 gcc-objc++.x86_64 kernel-devel.x86_ ...

  6. FreeSSHD login with permission denied

    登录遇到问题: Permission denied, please try again. 解决方法: 在window中使用freesshd开启ssh后,客户端登陆时报 access denied错误 ...

  7. Mobile First! Wijmo 5 之 架构

    CSDN移动开发频道率先报道的<Mobile First!jQuery UI组件集Wijmo五年最大更新>引起开发者极大关注. 本文就开发者关心的话题之一架构,展开叙述. Wijmo 5是 ...

  8. 排错-Loadrunner添加Windows Resource计数器提示“找不到网络路径”解决方法

    Loadrunner添加Windows Resource计数器提示“找不到网络路径”解决方法 by:授客 QQ:1033553122 1.启动windows相关服务 win->services. ...

  9. LDA背景资料

    [https://zhuanlan.zhihu.com/p/30226687] LDA模型的前世今生 在文本挖掘中,有一项重要的工作就是分析和挖掘出文本中隐含的结构信息,而不依赖任何提前标注的信息.L ...

  10. screen mac linux下一种让程序后台运行的方法

    1: screen 场景的意思.字面意思就是软件运行在不同场景 (1)创建会话 使用命令“screen -S RunWork”来创建一个screen会话,命令执行之后,就会得到一个新的shell窗口, ...