我們經常要向容器傳遞敏感資訊,最常見的莫過于密碼了。比如:
在啟動 MySQL 容器時我們通過環境變量 <code>MYSQL_ROOT_PASSWORD</code> 設定了 MySQL 的管理者密碼。不過密碼是以明文的形式寫在 <code>docker run</code> 指令中,有潛在的安全隐患。
為了解決這個問題,docker swarm 提供了 secret 機制,允許将敏感資訊加密後儲存到 secret 中,使用者可以指定哪些容器可以使用此 secret。
如果使用 secret 啟動 MySQL 容器,方法是:
在 swarm manager 中建立 secret <code>my_secret_data</code>,将密碼儲存其中。
啟動 MySQL service,并指定使用 secret <code>my_secret_data</code>。
① source 指定容器使用 secret 後,secret 會被解密并存放到容器的檔案系統中,預設位置為 /run/secrets/<secret_name>。<code>--secret source=my_secret_data,target=mysql_root_password</code> 的作用就是指定使用 secret <code>my_secret_data</code>,然後把器解密後的内容儲存到容器 <code>/run/secrets/mysql_root_password</code> 檔案中,檔案名稱 <code>mysql_root_password</code> 由 <code>target</code> 指定。
② 環境變量 <code>MYSQL_ROOT_PASSWORD_FILE</code> 指定從 <code>/run/secrets/mysql_root_password</code> 中讀取并設定 MySQL 的管理者密碼。
這裡大家可能有這麼兩個疑問:
問:在第一步建立 secret 時,不也是使用了明文嗎?這跟在環境變量中直接指定密碼有什麼不同呢?
答:在我們的例子中建立 secret 和使用 secret 是分開完成的,其好處是将密碼和容器解耦合。secret 可以由專人(比如管理者)建立,而運作容器的使用者隻需使用 secret 而不需要知道 secret 的内容。也就是說,例子中的這兩個步驟可以由不同的人在不同的時間完成。
問:secret 是以檔案的形式 mount 到容器中,容器怎麼知道去哪裡讀取 secret 呢?
答:這需要 image 的支援。如果 image 希望它部署出來的容器能夠從 secret 中讀取資料,那麼此 image 就應該提供一種方式,讓使用者能夠指定 secret 的位置。最常用的方法就是通過環境變量,Docker 的很多官方 image 都是采用這種方式。比如 MySQL 鏡像同時提供了 <code>MYSQL_ROOT_PASSWORD</code> 和 <code>MYSQL_ROOT_PASSWORD_FILE</code> 兩個環境變量。使用者可以用 <code>MYSQL_ROOT_PASSWORD</code> 顯示地設定管理者密碼,也可以通過 <code>MYSQL_ROOT_PASSWORD_FILE</code> 指定 secret 路徑。
下一節我們繼續讨論 Secret。
書籍:
1.《每天5分鐘玩轉Docker容器技術》
<a href="https://item.jd.com/16936307278.html" target="_blank">https://item.jd.com/16936307278.html</a>
2.《每天5分鐘玩轉OpenStack》
<a href="https://item.jd.com/12086376.html" target="_blank">https://item.jd.com/12086376.html</a>
本文轉自CloudMan6 51CTO部落格,原文連結:http://blog.51cto.com/cloudman/2052309