一、什么是Docker Secret
(一)情景展现
我们知道有的service是需要设置密码的,比如mysql服务是需要设置密码的:
version: '3'
services:
web:
image: wordpress
ports:
- 8080:80
volumes:
- ./www:/var/www/html
environment:
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- my-network
depends_on:
- mysql
deploy:
mode: replicated
replicas: 3
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
update_config:
parallelism: 1
delay: 10s
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-network
deploy:
mode: global
placement:
constraints:
- node.role == manager
volumes:
mysql-data:
networks:
my-network:
driver: overlay
可以看到在这个docker-compose.yml中的两个service密码都是明文,这样就导致了不是很安全,那么究竟什么是Docker secret以及能否解决上面的问题呢?
(二)Docker Secret

我们知道manager节点保持状态的一致是通过Raft Database这个分布式存储的数据库,它本身就是将信息进行了secret,所以可以利用这个数据库将一些敏感信息,例如账号、密码等信息保存在这里,然后通过给service授权的方式允许它进行访问,这样达到避免密码明文显示的效果。
总之,secret的Swarm中secret的管理通过以下步骤完成:
- secret存在于Swarm Manager节点的的Raft Database里
- secret可以assign给一个service,然后这个service就可以看到这个secret
- 在container内部secret看起来像文件,实际上就是内存
二、Docker Secret的创建与使用
(一)创建
我们先看看创建的一些帮助说明:
[root@centos-7 ~]# docker secret --help
Usage: docker secret COMMAND
Manage Docker secrets
Commands:
create Create a secret from a file or STDIN as content
inspect Display detailed information on one or more secrets
ls List secrets
rm Remove one or more secrets
Run 'docker secret COMMAND --help' for more information on a command.
第一个命令就是创建的命令,我们再来看看它有什么帮助信息:
[root@centos-7 ~]# docker secret create --help
Usage: docker secret create [OPTIONS] SECRET [file|-]
Create a secret from a file or STDIN as content
Options:
-d, --driver string Secret driver
-l, --label list Secret labels
--template-driver string Template driver
可以看到说明secret可以来自于一个文件或者一个标准输出。那么也就是Secret的创建有两种方式,分别是:
1、基于文件创建
首先先创建一个文件用于存放密码
[root@centos-7 ~]# vim mysql-password
root
然后再进行创建secret
[root@centos-7 ~]# docker secret create mysql-pass mysql-password
texcct9ojqcz6n40woe97dd7k
其中,mysql-pass是secret的名称,mysql-password是我们建立存储密码的文件,这样执行后就相当于将文件中的密码存储在Swarm中manager节点的Raft Database中了。为了安全起见,现在可以直接将这个文件删掉,因为Swarm中已经有这个密码了。
[root@centos-7 ~]# rm -f mysql-password
现在可以查看一下secret列表:
[root@centos-7 ~]# docker secret ls
ID NAME DRIVER CREATED UPDATED
texcct9ojqcz6n40woe97dd7k mysql-pass 4 minutes ago 4 minutes ago
已经存在了。
2、基于命令行创建
[root@centos-7 ~]# echo "root" | docker secret create mysql-pass2 -
hrtmn5yr3r3k66o39ba91r2e4
[root@centos-7 ~]# docker secret ls
ID NAME DRIVER CREATED UPDATED
texcct9ojqcz6n40woe97dd7k mysql-pass 6 minutes ago 6 minutes ago
hrtmn5yr3r3k66o39ba91r2e4 mysql-pass2 5 seconds ago 5 seconds ago
这种方式还是很简单的就创建成功了
(二)其它操作
那么secret还有什么其它操作吗?
[root@centos-7 ~]# docker secret --help
Usage: docker secret COMMAND
Manage Docker secrets
Commands:
create Create a secret from a file or STDI4)
=9Q%9H%%5
=559
IQMQQULA=IQL95L4(鱅йUээ(4)m4(4()4(Ё4)4(~O>"V64(4())]50
q4)e50M50
MA04(4)
=4(4)==
4)=4)4(4)QqQqЁЁи4(4)4(orMхj4("Rjb嵳Zv嵳vkF4(4)耜4(4)4(4(ɑ4(4(((4(]=IAIMM} }!=MP聵4(]=IAIMM} }AMM]=I}%1耽ɑ4(4(4(4((4((}(聽4(4((}4((4(聵4((4(5eME1}I==Q}AMM]=I}%1耽4(5eME1}Q Mɑ4(4(ф4(4(4((聝4(4((4)4(ф4)4(4(vkk=IAIMM} }AMM]=I}%1>)5eME1}I==Q}AMM]=I}%1v"i"Gr嵳Z&7#SjZj"oB;>kvgх4("MjBJ3jZ"nknM碾Bs&7jZ"[#vjnZroB;kkR2 |