在下面的例子中,我們會部署一個 WordPress 應用,WordPress 是流行的開源博客系統。
我們將創建一個 MySQL service,將密碼保存到 secret 中。我們還會創建一個 WordPress service,它將使用 secret 連接 MySQL。這個例子將展示如何用 secret 避免在 image 中存放敏感信息,或者在命令行中直接傳遞敏感數據。
實驗步驟如下:
創建 secret
創建 secret 存放 MySQL 的管理員密碼。
openssl rand -base64 20 | docker secret create mysql_root_password -
密碼是由 openssl 生成的隨機字符串。
注意 ag7injh6juonwl09lq8st36o8
是新創建的 service 的 ID,而非 service 的內容。
上面這種方式是從標准輸入讀取 secret 的內容,也可以指定從文件中讀取,例如:
openssl rand -base64 20 > password.txtdocker secret create my_password ./password.txt
一般情況下,應用不會直接用 root 密碼訪問 MySQL。我們會創建一個單獨的用戶 workpress
,密碼存放到 secret mysql_password
中。
openssl rand -base64 20 | docker secret create mysql_password -

創建自定義的 overlay 網絡
MySQL 通過 overlay 網絡 mysql_private
與 WordPress 通信,不需要將 MySQL service 暴露給外部網絡和其他容器。
docker network create -d overlay mysql_private
創建 MySQL service
命令如下:
docker service create \
--name mysql \
--network mysql_private \
--secret source=mysql_root_password,target=mysql_root_password \
--secret source=mysql_password,target=mysql_password \
-e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" \
-e MYSQL_PASSWORD_FILE="/run/secrets/mysql_password" \
-e MYSQL_USER="wordpress" \
-e MYSQL_DATABASE="wordpress" \
mysql:latest
MYSQL_DATABASE
指明創建數據庫 wordpress
。
MYSQL_USER
和 MYSQL_PASSWORD_FILE
指明創建數據庫用戶 workpress
,密碼從 secret mysql_password
中讀取。
有關 mysql 鏡像環境變量更詳細的使用方法可參考 https://hub.docker.com/_/mysql/

創建 WordPress service
MySQL service 已就緒,現在創建 WordPress service。命令如下:
docker service create \
--name wordpress \
--network mysql_private \
--publish 30000:80 \
--secret source=mysql_password,target=wp_db_password \
-e WORDPRESS_DB_HOST="mysql:3306" \
-e WORDPRESS_DB_NAME="wordpress" \
-e WORDPRESS_DB_USER="wordpress" \
-e WORDPRESS_DB_PASSWORD_FILE="/run/secrets/wp_db_password" \
wordpress:latest
WORDPRESS_DB_HOST
指明 MySQL service 地址 mysql:3306
,這里用到了 DNS。
WORDPRESS_DB_NAME
指明 WordPress 的數據庫為 wordpress
,與前面 MYSQL_DATABASE
一致。
WORDPRESS_DB_USER
指明連接 WordPress 數據庫的用戶為 wordpress
,與前面 MYSQL_USER
一致。
WORDPRESS_DB_PASSWORD_FILE
指明數據庫的用戶 wordpress
的密碼,從 secret mysql_password
中獲取。
有關 wordpress 鏡像環境變量更詳細的使用方法可參考 https://hub.docker.com/_/wordpress/

驗證 WordPress
訪問 http://[swarm_master_ip]:30000/
能正常顯示初始化界面,表明 WordPress 已經連接到 MySQL,部署成功。
Secret 就討論到這里,下一節我們學習 Stack。
書籍:
1.《每天5分鍾玩轉Docker容器技術》
https://item.jd.com/16936307278.html
2.《每天5分鍾玩轉OpenStack》
https://item.jd.com/12086376.html