Docker Secret的管理和使用詳解
一、什么是Docker Secret
(一)情景展現(xiàn)
我們知道有的service是需要設(shè)置密碼的,比如mysql服務(wù)是需要設(shè)置密碼的:
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
可以看到在這個(gè)docker-compose.yml中的兩個(gè)service密碼都是明文,這樣就導(dǎo)致了不是很安全,那么究竟什么是Docker secret以及能否解決上面的問(wèn)題呢?
(二)Docker Secret

我們知道m(xù)anager節(jié)點(diǎn)保持狀態(tài)的一致是通過(guò)Raft Database這個(gè)分布式存儲(chǔ)的數(shù)據(jù)庫(kù),它本身就是將信息進(jìn)行了secret,所以可以利用這個(gè)數(shù)據(jù)庫(kù)將一些敏感信息,例如賬號(hào)、密碼等信息保存在這里,然后通過(guò)給service授權(quán)的方式允許它進(jìn)行訪問(wèn),這樣達(dá)到避免密碼明文顯示的效果。
總之,secret的Swarm中secret的管理通過(guò)以下步驟完成:
- secret存在于Swarm Manager節(jié)點(diǎn)的的Raft Database里
- secret可以assign給一個(gè)service,然后這個(gè)service就可以看到這個(gè)secret
- 在container內(nèi)部secret看起來(lái)像文件,實(shí)際上就是內(nèi)存
二、Docker Secret的創(chuàng)建與使用
(一)創(chuàng)建
我們先看看創(chuàng)建的一些幫助說(shuō)明:
[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.
第一個(gè)命令就是創(chuàng)建的命令,我們?cè)賮?lái)看看它有什么幫助信息:
[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
可以看到說(shuō)明secret可以來(lái)自于一個(gè)文件或者一個(gè)標(biāo)準(zhǔn)輸出。那么也就是Secret的創(chuàng)建有兩種方式,分別是:
- 基于文件的創(chuàng)建
- 基于命令行創(chuàng)建
1、基于文件創(chuàng)建
首先先創(chuàng)建一個(gè)文件用于存放密碼
[root@centos-7 ~]# vim mysql-password root
然后再進(jìn)行創(chuàng)建secret
[root@centos-7 ~]# docker secret create mysql-pass mysql-password texcct9ojqcz6n40woe97dd7k
其中,mysql-pass是secret的名稱(chēng),mysql-password是我們建立存儲(chǔ)密碼的文件,這樣執(zhí)行后就相當(dāng)于將文件中的密碼存儲(chǔ)在Swarm中manager節(jié)點(diǎn)的Raft Database中了。為了安全起見(jiàn),現(xiàn)在可以直接將這個(gè)文件刪掉,因?yàn)镾warm中已經(jīng)有這個(gè)密碼了。
[root@centos-7 ~]# rm -f mysql-password
現(xiàn)在可以查看一下secret列表:
[root@centos-7 ~]# docker secret ls ID NAME DRIVER CREATED UPDATED texcct9ojqcz6n40woe97dd7k mysql-pass 4 minutes ago 4 minutes ago
已經(jīng)存在了。
2、基于命令行創(chuàng)建
[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
這種方式還是很簡(jiǎn)單的就創(chuàng)建成功了
(二)其它操作
那么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.
可以看到除了create命令外,還有inspect、ls、以及rm命令。
1、inspect
[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
[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
刪除一個(gè)secret
(三)Secret在單容器中的使用
1、容器中查看secret
我們創(chuàng)建了一個(gè)secret,如何在啟動(dòng)一個(gè)服務(wù)后,將其授權(quán)給特定的服務(wù)然后它才可以看到呢?先看看創(chuàng)建服務(wù)的命令中是否有類(lèi)似的命令或者參數(shù):
[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 ... ...
確實(shí)是有這樣的命令,在創(chuàng)建服務(wù)時(shí)可以給服務(wù)暴露出secret。
2、創(chuàng)建服務(wù)
[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
查看這個(gè)服務(wù)運(yùn)行在那個(gè)節(jié)點(diǎn)上:
[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
可以看到這個(gè)服務(wù)運(yùn)行在localhost.localdomain主機(jī)的節(jié)點(diǎn)上,我們?nèi)ミ@個(gè)節(jié)點(diǎn)上進(jìn)入到容器內(nèi)部,看是否能查看secret:
[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 #
可以看到確實(shí)是可行的。
2、mysql服務(wù)
關(guān)于mysql鏡像,詳情查看https://hub.docker.com/_/mysql其中有關(guān)于secret的描述:
作為通過(guò)環(huán)境變量傳遞敏感信息的替代方法,_FILE可以將其附加到先前列出的環(huán)境變量中,從而使初始化腳本從容器中存在的文件中加載那些變量的值。特別是,這可用于從/run/secrets/<secret_name>文件中存儲(chǔ)的Docker Secret加載密碼。例如:
$ 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。
所以我們需要先創(chuàng)建一個(gè)文件secret用于存儲(chǔ)數(shù)據(jù)庫(kù)的敏感信息,因?yàn)橹耙呀?jīng)創(chuàng)建過(guò),這里無(wú)需再創(chuàng)建:
[root@centos-7 ~]# docker secret ls ID NAME DRIVER CREATED UPDATED texcct9ojqcz6n40woe97dd7k mysql-pass 4 hours ago 4 hours ago
啟動(dòng)mysql服務(wù):
[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服務(wù)在那個(gè)節(jié)點(diǎn)上:
[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節(jié)點(diǎn)中進(jìn)入該服務(wù)的容器中查看secret:
[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
這樣知道了密碼就可以進(jìn)入到mysql數(shù)據(jù)庫(kù)中了。
# 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文件來(lái)部署stack,那么如何在docker-compose.yml中來(lái)定義secret呢?
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
上面通過(guò)在environment中定義WORDPRESS_DB_PASSWORD_FILE以及MYSQL_ROOT_PASSWORD_FILE來(lái)制定secret,顯然我們?cè)谶\(yùn)行這個(gè)docker-compose.yml文件之前必須先要進(jìn)行對(duì)應(yīng)的secret文件的創(chuàng)建。然后就可以通過(guò)docker stack deploy命令來(lái)部署這個(gè)stack了。
到此這篇關(guān)于Docker Secret的管理和使用詳解的文章就介紹到這了,更多相關(guān)Docker Secret內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信