十一docker config和docker secret

幽沉谢世事,俯默窥唐虞。这篇文章主要讲述十一docker config和docker secret相关的知识,希望能为你提供帮助。
一、docker config1、简介
在动态的、大规模的分布式集群上,管理和分发配置文件也是很重要的工作。传统的配置文件分发方式(如配置文件放入镜像中,设置环境变量,volume 动态挂载等)都降低了镜像的通用性。
【十一docker config和docker secret】在 Docker 17.06 以上版本中,Docker 新增了 docker config 子命令来管理集群中的配置信息,以后你无需将配置文件放入镜像或挂载到容器中就可实现对服务的配置。
注意:config 仅能在 Swarm 集群中使用
可以用target指定路径,如果不指定,默认挂载到容器的根目录下

version: "3.9"
services:
redis:
image: redis:latest
deploy:
replicas: 1
configs:
- my_config
- my_other_config
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true ##true表示已经创建,如果没有创建就会报错

2、案例
[root@docker dockerfile]# cat redis.conf
port 6380

docker config create redis80.conf redis.conf

[root@docker dockerfile]# docker config ls
IDNAMECREATEDUPDATED
zrqisvum165ns07ytn9ib64l7redis80.conf9 seconds ago9 seconds ago

docker service create \\
--name redis \\
--config redis80.conf \\
-p 6379:6380 \\
redis:5.0.9 \\
redis-server /redis80.conf

[root@docker dockerfile]# docker service ps redis
IDNAMEIMAGENODEDESIRED STATECURRENT STATEERRORPORTS
oiwwiikbvtuzredis.1redis:5.0.9docker130RunningRunning less than a second ago

[root@docker dockerfile]# docker service logs redis
redis.1.oiwwiikbvtuz@docker130| 1:C 30 Nov 2021 22:55:09.575 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis.1.oiwwiikbvtuz@docker130| 1:C 30 Nov 2021 22:55:09.575 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=1, just started
redis.1.oiwwiikbvtuz@docker130| 1:C 30 Nov 2021 22:55:09.575 # Configuration loaded
redis.1.oiwwiikbvtuz@docker130| 1:M 30 Nov 2021 22:55:09.576 * Running mode=standalone, port=6380.

[root@docker130 tmp]# docker ps
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
3dbff864a599redis:5.0.9"docker-entrypoint.s…"2 minutes agoUp 2 minutes6379/tcpredis.1.oiwwiikbvtuz66f0te3lp2exx
[root@docker130 tmp]# docker exec -it 3dbff864a599 /bin/bash
root@3dbff864a599:/data# cat /redis80.conf
port 6380

##3默认自动挂载到了根目录下/redis80.conf
也可以指定挂载目录
--config redis80.conf改为
--config source=redis.conf,target=/etc/redis.conf

docker service rm redis ##清理redis

如果你没有在 target 中显式的指定路径时,默认的 redis.conf 以 tmpfs 文件系统挂载到容器的 /config.conf。
经过测试,redis 可以正常使用。
以前我们通过监听主机目录来配置 Redis,就需要在集群的每个节点放置该文件,如果采用 docker config 来管理服务的配置信息,我们只需在集群中的管理节点创建 config,当部署服务时,集群会自动的将配置文件分发到运行服务的各个节点中,大大降低了配置信息的管理和分发难度。
二、docker secret1、简介
敏感数据包括密码、私钥、证书及其它所有不能以明文的形式在网络上传输,或者是不能保存在各种文件中的数据,例如Dokerfile、image等。从docker 1.13开始,可以通过secret功能集中的保存与分发这些敏感数据,一个secret只允许被授权的服务在运行的时候访问,另外只有在集群模式下才能使用secret功能。docker以加密的形式保存与传输敏感数据,并且敏感数据会以分布式的形式存储在集群中的所以manager节点上,以提高可用性。
当对一个新建立的或者是运行中的service进行某个secret的授权时,docker会在内存中模拟一个文件,然后将解密后的数据放入文件中,并mount这个文件到容器的文件系统中,默认目录是/run/secrets/< secret_name> 。可以在任何时候对一个服务进行授权、撤销操作。
docker secret同时也可以用来管理普通的配置项,但是从Docker 17.06开始,提供了专门用于管理非敏感数据的config。两者的区别是secret用的是RAM来模拟文件系统保存敏感数据,使用敏感数据的容器是只读的。而config则直接使用普通的文件系统存储非敏感数据。
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

可以用target指定路径,和config差不多,如果不指定,默认挂载到容器的/run/secrets目录下
version: "3.9"
services:
redis:
image: redis:latest
deploy:
replicas: 1
secrets:
- my_secret
- my_other_secret
secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: true ##true表示已经创建,如果没有创建就会报错

2、案例
a、redis授权访问secret
添加secret
echo "This is a secret" | docker secret create my_secret_data -

[root@docker dockerfile]# docker secret ls
IDNAMEDRIVERCREATEDUPDATED
3ikilbfplk4ybayf39hhlwqeymy_secret_data27 seconds ago27 seconds ago

创建redis服务并授权访问my_secret_data
[root@docker dockerfile]# docker servicecreate --name redis --secret my_secret_data redis:5.0.9
4ep31f33e9t05t07svxk6ucdf
overall progress: 1 out of 1 tasks
1/1: running[==================================================> ]
verify: Service converged
###如果不加target指定路径,默认挂载到/run/secrets目录下

[root@docker dockerfile]# docker service ps redis
IDNAMEIMAGENODEDESIRED STATECURRENT STATEERRORPORTS
qnlf4cmiwy4bredis.1redis:5.0.9docker129RunningRunning less than a second ago

去docker129上面进入容器瞅瞅文件
[root@docker129 tmp]# docker ps
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
1e8181b12281redis:5.0.9"docker-entrypoint.s…"4 minutes agoUp 4 minutes6379/tcpredis.1.qnlf4cmiwy4b0lxpjj7jq0rbj
[root@docker129 tmp]# docker exec -it 1e8181b12281 /bin/bash
root@1e8181b12281:/data# cat /run/secrets/my_secret_data
This is a secret

收回授权
[root@docker dockerfile]# docker service update --secret-rm my_secret_data redis
redis
overall progress: 1 out of 1 tasks
1/1: running[==================================================> ]
verify: Service converged
[root@docker dockerfile]# docker service ps redis
IDNAMEIMAGENODEDESIRED STATECURRENT STATEERRORPORTS
m5kokjs88lwdredis.1redis:5.0.9docker130RunningRunning less than a second ago
w3q91p6e3xzi\\_ redis.1redis:5.0.9docker129ShutdownShutdown less than a second ago
###容器重启了
[root@docker130 tmp]# docker exec -it $(docker ps --filter name=redis -q) sh -c cat /run/secrets/my_secret_data
cat: /run/secrets/my_secret_data: No such file or directory
###授权已经被取消
docker service rm redis ##清理redis
docker secret rm my_secret_data ##清理掉secret

b、secret管理nginx证书(仅抄录,未做试验)
1、Generate a root key.
openssl genrsa -out "root-ca.key" 4096
2、Generate a CSR using the root key.
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、Configure the root CA. Edit a new file called root-ca.cnf and paste the following contents into it. This constrains the root CA to signing leaf certificates and
not intermediate CAs.
[root_ca]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash
4、Sign the certificate.
openssl x509 -req-days 3650-in "root-ca.csr" \\
-signkey "root-ca.key" -sha256 -out "root-ca.crt" \\
-extfile "root-ca.cnf" -extensions \\
root_ca
5、Generate the site key.
openssl genrsa -out "site.key" 4096
6、Generate the site certificate and sign it with the site key.
openssl req -new -key "site.key" -out "site.csr" -sha256 \\
-subj /C=US/ST=CA/L=San Francisco/O=Docker/CN=localhost
7、Configure the site certificate. Edit a new file called site.cnf and paste the following contents into it. This constrains the site certificate so that it can
only be used to authenticate a server and can’t be used to sign certificates.
[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、Sign the site certificate.
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 server
9、nginx配置文件
In the current directory, create a new file called site.conf with the following contents:
server {
listen443 ssl;
server_namelocalhost;
ssl_certificate/run/secrets/site.crt;
ssl_certificate_key/run/secrets/site.key;

location / {
root/usr/share/nginx/html;
indexindex.html index.htm;
}
}
10、创建secret
docker secret create site.key site.key
docker secret create site.crt site.crt
docker secret create site.conf site.conf
11、启动nginx
docker service create \\
--name nginx \\
--secret site.key \\
--secret site.crt \\
--secret source=site.conf

    推荐阅读