? 前言介紹
在 Docker Swarm 服務(wù)中, Secret 是一種 BLOB(二進(jìn)制大對象) 數(shù)據(jù), 就像密碼、SSH 私鑰、 SSL 證書或那些不應(yīng)該未加密就直接存儲在 Dockerfile 或應(yīng)用程序代碼中的數(shù)據(jù)。在 Docker 1.13 及更高版本中,可以使用 Docker Secrets 集中管理這些數(shù)據(jù),并將其安全地傳輸給需要訪問的容器。 一個給定的 Secret 只能被那些已被授予明確訪問權(quán)限的服務(wù)使用,并且只能在這些服務(wù)任務(wù)正在運(yùn)行的情況下。
不想在鏡像或代碼中管理的任何敏感數(shù)據(jù),都可以使用 Secret 來管理,比如:
- 用戶名和密碼
- TLS certificates and keys
- SSH keys
- 其他重要數(shù)據(jù):比如數(shù)據(jù)庫名、內(nèi)部服務(wù)器信息
- 通用的字符串或二進(jìn)制內(nèi)容 (最大可達(dá) 500 Kb)
提醒: Docker Secret 僅對 Swarm 服務(wù)有效,對獨(dú)立的容器是無用的。如需使用,可以啟動 1 個副本的服務(wù)來使用 Docker Secret。
另一個使用 Secert 的用例是在容器和一組證書之間提供一個抽象層。考慮一種場景:有開發(fā)、測試和生產(chǎn)三套環(huán)境,同一個應(yīng)用程序在不同的環(huán)境中都可以擁有不同的憑證,并且以相同的 Secret Name 存儲在開發(fā)、測試和生產(chǎn)集群中。這樣容器只需要知道 Secret Name,就可以在不同的環(huán)境中正常工作。
當(dāng)然,你也可以使用 Docker Secret 管理非敏感數(shù)據(jù),比如配置文件。但是,非敏感數(shù)據(jù)還是建議使用 Docker Config 來管理。
? Docker Secret 基本操作
友情提示:“ 需 Swarm Manager 權(quán)限才能操作 !”
1、創(chuàng)建 Secret
用法
docker secret create [參數(shù)] SECRET [file|-]
參數(shù)
簡寫 | 參數(shù) | 默認(rèn)值 | 描述 |
---|---|---|---|
-d | --driver | Secret 驅(qū)動 | |
-l | --label | 配置標(biāo)簽 |
2、Secret 列表
用法
docker secret ls [參數(shù)]
參數(shù)
簡寫 | 參數(shù) | 默認(rèn)值 | 描述 |
---|---|---|---|
-f | --filter | 按條件過濾輸出 | |
--format | GO 模板轉(zhuǎn)化 | ||
-q | --quiet | 僅展示 ID |
3、Secret 詳情
用法
docker secret inspect [參數(shù)] SECRET [SECRET...]
參數(shù)
簡寫 | 參數(shù) | 默認(rèn)值 | 描述 |
---|---|---|---|
-f | --format | GO 模板轉(zhuǎn)化 | |
--pretty | 以人性化的格式打印信息 |
4、Secret 刪除
用法
docker secret rm SECRET [SECRET...]
? Swarm 對 Secret 的管理
? 構(gòu)建支持 Docker Secret 的鏡像
如果你開發(fā)的容器可以作為服務(wù)進(jìn)行部署,并需要敏感數(shù)據(jù)(如憑證)作為環(huán)境變量,則考慮調(diào)整鏡像以便充分利用 Docker Secret。
一種方法是確保在創(chuàng)建容器時傳遞給鏡像的每個參數(shù)也可以從文件中讀取。
提醒:Docker Secret 不直接設(shè)置環(huán)境變量。這是一個有意識的決定,因為環(huán)境變量可能會無意中在容器之間泄漏(例如使用
--link
)
? 示例:安全構(gòu)建 Wordpress 服務(wù)
1、創(chuàng)建文件 password.txt
,里面存入 Mysql 的 root 密碼
touch password.txt
echo "myPassword" > password.txt
2、創(chuàng)建文件 wordpress.yml,用于啟動 mysql 和 wordpress 服務(wù),內(nèi)容:
version: '3.3'
services:
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_password
MYSQL_DATABASE: wordpress
secrets:
- db_password
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
secrets:
db_password:
file: password.txt
3、啟動 wordpress 服務(wù)
docker stack deploy -c wordpress.yml wordpress
4、訪問 wordpress