一、什么是Docker Secret
(一)情景展现
我们知道有的service是需要设置密码的,比如mysql服务是需要设置密码的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 |
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以及能否解决上面的问题呢?
我们知道manager节点保持状态的一致是通过Raft Database这个分布式存储的数据库,它本身就是将信息进行了secret,所以可以利用这个数据库将一些敏感信息,例如账号、密码等信息保存在这里,然后通过给service授权的方式允许它进行访问,这样达到避免密码明文显示的效果。
总之,secret的Swarm中secret的管理通过以下步骤完成:
- secret存在于Swarm Manager节点的的Raft Database里
- secret可以assign给一个service,然后这个service就可以看到这个secret
- 在container内部secret看起来像文件,实际上就是内存
二、Docker Secret的创建与使用
(一)创建
我们先看看创建的一些帮助说明:
1
2
3
4
5
6
7
8
9
10
11
12
13 |
[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 . |
第一个命令就是创建的命令,我们再来看看它有什么帮助信息:
1
2
3
4
5
6
7
8
9
10 |
[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、基于文件创建
首先先创建一个文件用于存放密码
1
2 |
[root@centos-7 ~] # vim mysql-password
root |
然后再进行创建secret
1
2 |
[root@centos-7 ~] # docker secret create mysql-pass mysql-password
texcct9ojqcz6n40woe97dd7k |
其中,mysql-pass是secret的名称,mysql-password是我们建立存储密码的文件,这样执行后就相当于将文件中的密码存储在Swarm中manager节点的Raft Database中了。为了安全起见,现在可以直接将这个文件删掉,因为Swarm中已经有这个密码了。
1 |
[root@centos-7 ~] # rm -f mysql-password |
现在可以查看一下secret列表:
1
2
3 |
[root@centos-7 ~] # docker secret ls
ID NAME DRIVER CREATED UPDATED
texcct9ojqcz6n40woe97dd7k mysql-pass 4 minutes ago 4 minutes ago |
已经存在了。
2、基于命令行创建
1
2
3
4
5
6 |
[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还有什么其它操作吗?
1
2
3
4
5
6
7
8
9
10
11
12
13 |
[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 . |
可以看到除了create命令外,还有inspect、ls、以及rm命令。
1、inspect
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
[root@centos-7 ~] # docker secret inspect mysql-pass2
[
{
"ID" : "hrtmn5yr3r3k66o39ba91r2e4" ,
"Version" : {
"Index" : 4061
},
"CreatedAt" : "2020-02-07T08:39:25.630341396Z" ,
"UpdatedAt" : "2020-02-07T08:39:25.630341396Z" ,
"Spec" : {
"Name" : "mysql-pass2" ,
"Labels" : {}
}
}
] |
展示secret的一些详情信息
2、rm
1
2
3
4
5 |
[root@centos-7 ~] # docker secret rm mysql-pass2
mysql-pass2
[root@centos-7 ~] # docker secret ls
ID NAME DRIVER CREATED UPDATED
texcct9ojqcz6n40woe97dd7k mysql-pass 12 minutes ago 12 minutes ago |
删除一个secret
(三)Secret在单容器中的使用
1、容器中查看secret
我们创建了一个secret,如何在启动一个服务后,将其授权给特定的服务然后它才可以看到呢?先看看创建服务的命令中是否有类似的命令或者参数:
1
2
3
4
5
6
7
8
9
10
11
12 |
[root@centos-7 ~] # docker service create --help
Usage: docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
Create a new service
Options:
--config config Specify configurations to expose to the service
...
--secret secret Specify secrets to expose to the service
...
... |
确实是有这样的命令,在创建服务时可以给服务暴露出secret。
2、创建服务
1
2
3
4
5 |
[root@centos-7 ~] # docker service create --name demo --secret mysql-pass busybox sh -c "while true; do sleep 3600; done"
zwgk5w0rpf17hn77axz6cn8di
overall progress: 1 out of 1 tasks
1 /1 : running
verify: Service converged |
查看这个服务运行在那个节点上:
1
2
3
4
5
6 |
[root@centos-7 ~] # docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
zwgk5w0rpf17 demo replicated 1 /1 busybox:latest
[root@centos-7 ~] # docker service ps demo
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
yvr9lwvg8oca demo.1 busybox:latest localhost.localdomain Running Running 51 seconds ago |
可以看到这个服务运行在localhost.localdomain主机的节点上,我们去这个节点上进入到容器内部,看是否能查看secret:
1
2
3
4
5
6
7
8
9
10
11
12 |
[root@localhost ~] # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
36573adf21f6 busybox:latest "sh -c 'while true; …" 4 minutes ago Up 4 minutes demo.1.yvr9lwvg8ocatym20hdfublhd
[root@localhost ~] # docker exec -it 36573adf21f6 /bin/sh
/ # ls
bin dev etc home proc root run sys tmp usr var
/ # cd /run/secrets
/run/secrets # ls
mysql-pass
/run/secrets # cat mysql-pass
root
/run/secrets # |
可以看到确实是可行的。
2、mysql服务
关于mysql镜像,详情查看https://hub.docker.com/_/mysql其中有关于secret的描述:
作为通过环境变量传递敏感信息的替代方法,_FILE可以将其附加到先前列出的环境变量中,从而使初始化脚本从容器中存在的文件中加载那些变量的值。特别是,这可用于从/run/secrets/<secret_name>文件中存储的Docker Secret加载密码。例如:
1 |
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE= /run/secrets/mysql-root -d mysql:tag |
目前,这仅支持MYSQL_ROOT_PASSWORD,MYSQL_ROOT_HOST,MYSQL_DATABASE,MYSQL_USER,和MYSQL_PASSWORD。
所以我们需要先创建一个文件secret用于存储数据库的敏感信息,因为之前已经创建过,这里无需再创建:
1
2
3 |
[root@centos-7 ~] # docker secret ls
ID NAME DRIVER CREATED UPDATED
texcct9ojqcz6n40woe97dd7k mysql-pass 4 hours ago 4 hours ago |
启动mysql服务:
1
2
3
4
5 |
[root@centos-7 ~] # docker service create --name db --secret mysql-pass -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-pass mysql
sbpagzqvpwt8ifymavf8o5xmi
overall progress: 1 out of 1 tasks
1 /1 : running
verify: Service converged |
查看mysql服务在那个节点上:
1
2
3
4
5
6 |
[root@centos-7 ~] # docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
sbpagzqvpwt8 db replicated 0 /1 mysql:latest
[root@centos-7 ~] # docker service ps db
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
qlmfm6u7lg8u db.1 mysql:latest localhost.localdomain Running Starting 2 seconds ago |
在worker节点中进入该服务的容器中查看secret:
1
2
3
4
5
6
7
8
9
10 |
[root@localhost ~] # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ac2a810e931 mysql:latest "docker-entrypoint.s…" 3 minutes ago Up 2 minutes 3306 /tcp , 33060 /tcp db.1.qlmfm6u7lg8u8i1v2m2c3ls3r
[root@localhost ~] # docker exec -it 2ac2a810e931 /bin/sh
# cd /run/secrets/
# ls
mysql-pass
# cat mysql-pass
root |
这样知道了密码就可以进入到mysql数据库中了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
# mysql -uroot -p
Enter password :
Welcome to the MySQL monitor. Commands end with ; or \\g.
Your MySQL connection id is 9
Server version: 8.0.19 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and / or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and / or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.
mysql> |
(四)Secret在Stack中的使用
Stack利用的就是docker-compose.yml文件来部署stack,那么如何在docker-compose.yml中来定义secret呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 |
version: '3'
services:
web:
image: wordpress
ports:
- 8080:80
secrets:
- my-pw
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/wordpress-pass
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
secrets:
- my-pw
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql-pass
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 |
上面通过在environment中定义WORDPRESS_DB_PASSWORD_FILE以及MYSQL_ROOT_PASSWORD_FILE来制定secret,显然我们在运行这个docker-compose.yml文件之前必须先要进行对应的secret文件的创建。然后就可以通过docker stack deploy命令来部署这个stack了。
到此这篇关于Docker Secret的管理和使用详解的文章就介绍到这了,更多相关Docker Secret内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!
原文链接:https://www.cnblogs.com/shenjianping/p/12272847.html
相关文章
- 服务器是租用还是服务器托管好? 2025-05-27
- 什么是DNS以及它如何影响服务器? 2025-05-27
- 刀片服务器与机架服务器的区别介绍 2025-05-27
- 服务器虚拟化技术深度科普 2025-05-27
- 服务器租用价格怎么计算?服务器租用多少钱一年? 2025-05-27
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-25 44
-
docker安装tomcat dubbo-admin实例技巧
2025-05-27 16 -
2025-05-26 33
-
2025-05-27 53
-
2025-05-27 39