什么是secrets?
前面的部分,你已经看到了config的使用方式,config中,存放的是明文的内容,以文件的方式挂载到容器中,今天的说的secret存放的是敏感的数据,比如,证书,key等
主要的目的,就是保护敏感数据的安全性。
下面,通过一个示例来看下,如何创建、使用secret对象
示例
本次演示,将服务器的证书保存为secret的方法
1、创建key和证书
使用自签名的方式生成证书
openssl req -x509 \ -newkey \ rsa:4096 \ -nodes \ -keyout server.key \ -out server.crt \ -sha256 \ -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=DC/OU=Ops/CN=www.nginx.local"
命令执行后,生成对应的key和证书文件
[root@nccztsjb-node-01 nginx]# openssl req -x509 \ > -newkey \ > rsa:4096 \ > -nodes \ > -keyout server.key \ > -out server.crt \ > -sha256 \ > -days 3650 \ > -subj "/C=CN/ST=Beijing/L=Beijing/O=DC/OU=Ops/CN=www.nginx.local" Generating a 4096 bit RSA private key ......++ ............................................................................................................++ writing new private key to 'server.key' ----- [root@nccztsjb-node-01 nginx]# [root@nccztsjb-node-01 nginx]# ls -ltr total 8 -rw-r--r-- 1 root root 3268 Sep 30 13:53 server.key -rw-r--r-- 1 root root 2009 Sep 30 13:53 server.crt [root@nccztsjb-node-01 nginx]#
2、基于key和证书创建secret
docker secret create server.key server.key
docker secret create server.crt server.crt
[root@nccztsjb-node-01 nginx]# docker secret ls ID NAME DRIVER CREATED UPDATED 24u7ecumb6l9r24uafdrx1bvz server.crt 8 seconds ago 8 seconds ago gdz4m7ogit8fy0nc81o5ue7am server.key 17 seconds ago 17 seconds ago [root@nccztsjb-node-01 nginx]#
3、创建nginx配置文件和config
创建一个nginx配置文件,文件名字:site.conf
server { listen 443 ssl; server_name localhost; ssl_certificate /run/secrets/server.crt; ssl_certificate_key /run/secrets/server.key; location / { root /usr/share/nginx/html; index index.html index.htm; } }
其中
ssl_certificate /run/secrets/server.crt;
ssl_certificate_key /run/secrets/server.key;
指定的是证书和key在容器中名字和位置
创建config
docker config create site.conf site.conf
[root@nccztsjb-node-01 nginx]# docker config ls ID NAME CREATED UPDATED dktbpyig9t9bk8lala4jzqclu homepage 2 days ago 2 days ago g5c1fvlz3apllis2xk7p473p7 site.conf 15 seconds ago 15 seconds ago [root@nccztsjb-node-01 nginx]#
4、创建nginx的service
使用这个secre和config
docker service create \ --with-registry-auth \ --name=nginx \ --secret server.key \ --secret server.crt \ --replicas=4 \ --config source=site.conf,target=/etc/nginx/conf.d/site.conf,mode=0440 \ --publish published=3000,target=443 \ 172.20.58.152/middleware/nginx:1.21.4
- 使用config是为了挂配置文件
- 配置文件中引用证书文件
- secret是为了将证书文件挂载到容器中
[root@nccztsjb-node-01 nginx]# docker service create \ > --with-registry-auth \ > --name=nginx \ > --secret server.key \ > --secret server.crt \ > --replicas=4 \ > --config source=site.conf,target=/etc/nginx/conf.d/site.conf,mode=0440 \ > --publish published=3000,target=443 \ > 172.20.58.152/middleware/nginx:1.21.4 88sdl7zk79b2i50nkteui2fq4 overall progress: 4 out of 4 tasks 1/4: running [==================================================>] 2/4: running [==================================================>] 3/4: running [==================================================>] 4/4: running [==================================================>] verify: Service converged [root@nccztsjb-node-01 nginx]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS 88sdl7zk79b2 nginx replicated 4/4 172.20.58.152/middleware/nginx:1.21.4 *:3000->443/tcp [root@nccztsjb-node-01 nginx]# netstat -ntlp | grep 3000 tcp6 0 0 :::3000 :::* LISTEN 16278/dockerd [root@nccztsjb-node-01 nginx]#
5、浏览器中进行访问
本地配置域名解析,访问域名
注意:是https
https://www.nginx.local:3000/
因为是自签名证书,所以是没有经过验证,选择 “是”
OK,访问是没有问题的。
6、查看secret在容器中的挂载
进入到容器中,看看secret是如何挂载到容器中的
[root@nccztsjb-node-01 nginx]# docker exec -it 7b46aca74d61 bash root@7b46aca74d61:/# ls bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@7b46aca74d61:/# df -h Filesystem Size Used Avail Use% Mounted on overlay 49G 20G 27G 43% / tmpfs 64M 0 64M 0% /dev tmpfs 7.6G 0 7.6G 0% /sys/fs/cgroup shm 64M 0 64M 0% /dev/shm /dev/vda2 49G 20G 27G 43% /etc/hosts tmpfs 7.6G 12K 7.6G 1% /run/secrets/server.key tmpfs 7.6G 0 7.6G 0% /proc/acpi tmpfs 7.6G 0 7.6G 0% /proc/scsi tmpfs 7.6G 0 7.6G 0% /sys/firmware root@7b46aca74d61:/# root@7b46aca74d61:/# cd /run/secrets/ root@7b46aca74d61:/run/secrets# ls server.crt server.key root@7b46aca74d61:/run/secrets# ls -ltr total 8 -r--r--r-- 1 root root 3268 Sep 30 06:18 server.key -r--r--r-- 1 root root 2009 Sep 30 06:18 server.crt
可以到,secret在目录/run/secrets中
文件的名字,就是secret的名字
在创建service的时候,多个secret就使用多个--secret参数
--secret server.key \ --secret server.crt \
以上,就是关于如何创建secret和secret的方法!