?
This document uses PHP Chinese website manual Release
Docker 17.06引入了swarm服務(wù)配置,它允許您在服務(wù)映像外部或運行容器中存儲非敏感信息,例如配置文件。這允許您保持圖像盡可能通用,而無需將配置文件綁定到容器或使用環(huán)境變量。
Config以類似于秘密的方式運行,不同之處在于它們沒有在休息時加密,并且不使用RAM磁盤直接安裝到容器的文件系統(tǒng)中。隨時可以從服務(wù)添加或刪除配置,并且服務(wù)可以共享配置。您甚至可以將配置與環(huán)境變量或標簽結(jié)合使用,以獲得最大的靈活性。
注意:Docker配置僅適用于群集服務(wù),而不適用于獨立容器。要使用此功能,請考慮調(diào)整您的容器作為1級服務(wù)運行。
Linux和Windows服務(wù)都支持配置。
當您將配置添加到swarm中時,Docker會通過相互TLS連接將配置發(fā)送到swarm管理器。配置存儲在加密的Raft日志中。整個Raft日志會在其他管理器中復(fù)制,從而確保配置的高可用性保證與其他群集管理數(shù)據(jù)相同。
當您授予新創(chuàng)建或正在運行的服務(wù)對配置的訪問權(quán)時,配置將作為文件裝載到容器中。容器中安裝點的位置默認為/<config-name>
在Linux容器中。在Windows容器中,配置都被裝入C:\ProgramData\Docker\configs
,符號鏈接被創(chuàng)建到所需的位置,默認為C:\<config-name>
。
您可以隨時更新服務(wù)以授予其訪問其他配置或撤銷對給定配置的訪問權(quán)限。
如果節(jié)點是群管理器,或者它正在運行已被授權(quán)訪問配置的服務(wù)任務(wù),則節(jié)點只能訪問配置。當容器任務(wù)停止運行時,共享給它的配置將從該容器的內(nèi)存中文件系統(tǒng)卸載并從節(jié)點的內(nèi)存刷新。
如果節(jié)點在運行可訪問配置的任務(wù)容器時失去與群集的連接,則任務(wù)容器仍可訪問其配置,但在節(jié)點重新連接到群集之前無法接收更新。
您可以隨時添加或檢查單個配置,或列出所有配置。您無法刪除正在運行的服務(wù)正在使用的配置。請參閱旋轉(zhuǎn)配置,以便在不中斷正在運行的服務(wù)的情況下移除配置。
為了更容易地更新或回滾配置,請考慮在配置名稱中添加版本號或日期。通過控制給定容器內(nèi)配置的掛載點,這變得更容易。
docker config
命令使用這些鏈接閱讀有關(guān)特定命令的內(nèi)容,或者繼續(xù)執(zhí)行有關(guān)使用配置與服務(wù)的示例。
docker config create
docker config inspect
docker config ls
docker config rm
本節(jié)包含說明如何使用Docker配置的示例。
注意:為簡單起見,這些示例使用單引擎群和非標度服務(wù)。這些示例使用Linux容器,但Windows容器也支持配置。
這個簡單的例子顯示了配置如何在幾個命令中工作。對于一個真實世界的例子,繼續(xù)到中間例子:使用配置與一個Nginx服務(wù)。
添加一個配置到Docker。該docker config create
命令讀取標準輸入,因為最后一個參數(shù)表示要讀取配置文件的文件被設(shè)置為-
。$ echo“這是一個配置”| 碼頭配置創(chuàng)建我的配置 -
創(chuàng)建一個redis
服務(wù)并授予它對配置的訪問權(quán)限。默認情況下,容器可以訪問配置/my-config
,但可以使用該target
選項自定義容器上的文件名。$ docker service create --name redis --config my-config redis:alpine
驗證任務(wù)是否正在運行,沒有問題docker service ps
。如果一切正常,輸出如下所示:$ docker service ps redis ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS bkna6bpn8r1a redis.1 redis:alpine ip-172-31-46-109 8秒前運行
獲取redis
服務(wù)任務(wù)容器的標識docker ps
,以便您可以使用docker exec
它連接到容器并讀取config數(shù)據(jù)文件的內(nèi)容,該數(shù)據(jù)文件默認為全部可讀,并且與config的名稱相同。下面的第一條命令說明了如何找到容器ID,第二個和第三個命令使用shell完成來自動執(zhí)行此操作。 $ docker ps --filter name=redis -q 5cb1c2348a59 $ docker exec $(docker ps --filter name=redis -q) ls -l /my-config -r--r--r-- 1 root root 12 Jun 5 20:49 my-config $ docker exec $(docker ps --filter name=redis -q) cat /my-config 這是一個配置
嘗試刪除配置。刪除失敗,因為redis
服務(wù)正在運行并可以訪問配置。$ docker config ls ID NAME CREATED UPDATED fzwcfuqjkvo5foqu7ts7ls578 hello 31 minutes ago 31 minutes ago $ docker config rm my-config 從daemon的錯誤反饋: rpc error: code = 3 desc = config 'my-config'正在被以下服務(wù)使用: Redis
redis
通過更新服務(wù),從正在運行的服務(wù)中刪除對配置的訪問。$ docker service update --config-rm my-config redis
重復(fù)步驟3和4,驗證該服務(wù)不再有權(quán)訪問配置。容器ID將不同,因為該service update
命令重新部署服務(wù)。$ docker exec -it $(docker ps --filter name=redis -q) cat /my-config cat: can't open '/my-config': No such file or directory
停止并刪除服務(wù),并從Docker中刪除配置。$ docker service rm redis $ docker config rm my-config
這是一個非常簡單的例子,它展示了如何在微軟Windows Server 2016上使用Docker 17.06 EE上運行的Microsoft IIS服務(wù)配置,或者在Microsoft Windows 10上使用Docker for Mac 17.06上的配置。它將網(wǎng)頁存儲在配置中。
此示例假定您已安裝PowerShell。
將以下內(nèi)容保存到一個新文件中:index.html
<html> <head> <title> Hello Docker </ title> </ head> <body> <p> Hello Docker!您已經(jīng)部署了一個HTML頁面。</ p> </ body> </ html>
如果您還沒有這樣做,請初始化或加入群集。PS> docker swarm init
將該index.html
文件保存為名為的群集配置homepage
。PS> docker config create homepage index.html
創(chuàng)建一個IIS服務(wù)并授予它對homepage
配置的訪問權(quán)限。PS> docker service create --name my-iis -p 8000:8000 --config src=homepage,target="\inetpub\wwwroot\index.html" microsoft/iis:nanoserver
訪問IIS服務(wù)http://localhost:8000/
。它應(yīng)該從第一步開始提供HTML內(nèi)容。
刪除服務(wù)和配置。PS> docker service rm my-iis PS> docker config rm homepage
這個例子分為兩部分。第一部分是關(guān)于生成站點證書,并不直接涉及Docker配置,但是它建立了第二部分,您在其中存儲和使用站點證書作為一系列秘密,并將Nginx配置作為配置使用。
為您的站點生成根CA和TLS證書和密鑰。對于生產(chǎn)站點,您可能希望使用服務(wù)Let’s Encrypt
來生成TLS證書和密鑰,但此示例使用命令行工具。這一步有點復(fù)雜,但僅僅是一個設(shè)置步驟,以便您可以將某些內(nèi)容存儲為Docker秘密。如果你想跳過這些子步驟,您可以使用我們的加密生成網(wǎng)站密鑰和證書,命名文件site.key
和site.crt
,并跳過配置Nginx的容器。
生成一個根密鑰。$ openssl genrsa -out“root-ca.key”4096
使用根密鑰生成CSR。$ openssl req \ -new -key "root-ca.key" \ -out "root-ca.csr" -sha256 \ -subj '/C=US/ST=CA/L=San Francisco/O=Docker/CN=Swarm Secret Example CA'
配置根CA. 編輯一個名為的新文件root-ca.cnf
并將以下內(nèi)容粘貼到其中。這限制了根CA只能簽署葉證書而不能簽署中間CA. root_ca basicConstraints = critical,CA:TRUE,pathlen:1 keyUsage = critical,nonRepudiation,cRLSign,keyCertSign subjectKeyIdentifier = hash
簽署證書。$ openssl x509 -req -days 3650 -in“root-ca.csr”\ -signkey“root-ca.key”-sha256 -out“root-ca.crt”\ -extfile“root-ca.cnf”-extensions \ root_ca
生成站點密鑰。$ openssl genrsa -out“site.key”4096
生成站點證書并使用站點密鑰對其進行簽名。$ openssl req -new -key“site.key”-out“site.csr”-sha256 \ -subj'/ C = US / ST = CA / L = San Francisco / O = Docker / CN = localhost'
配置站點證書。編輯一個名為的新文件site.cnf
并將以下內(nèi)容粘貼到其中。這限制了站點證書,因此它只能用于對服務(wù)器進行身份驗證,并且不能用于簽名證書。server authorityKeyIdentifier = keyid,issuer basicConstraints = critical,CA:FALSE extendedKeyUsage = serverAuth keyUsage = critical,digitalSignature,keyEncipherment subjectAltName = DNS:localhost,IP:127.0.0.1 subjectKeyIdentifier = hash
簽署網(wǎng)站證書。$ openssl x509 -req -days 750 -in“site.csr”-sha256 \ -CA“root-ca.crt”-CAkey“root-ca.key”-CAcreateserial \ -out“site.crt”-extfile“site .cnf“-extensions server
在site.csr
和site.cnf
文件不需要由Nginx的服務(wù),但你需要他們,如果你想生成一個新的站點證書。保護root-ca.key
文件。
生成一個非?;镜腘ginx配置,通過HTTPS提供靜態(tài)文件。TLS證書和密鑰將作為Docker機密存儲,以便它們可以輕松旋轉(zhuǎn)。在當前目錄中,site.conf
使用以下內(nèi)容創(chuàng)建一個新文件:server {listen 443 ssl; server_name localhost; ssl_certificate /run/secrets/site.crt; ssl_certificate_key /run/secrets/site.key; 位置/ {root / usr / share / nginx / html; index index.html index.htm; }}
創(chuàng)建兩個秘密,代表密鑰和證書。只要小于500 KB,您就可以將任何文件存儲為秘密文件。這使您可以將密鑰和證書與將使用它們的服務(wù)分離。在這些示例中,秘密名稱和文件名是相同的。$ docker secret創(chuàng)建site.key site.key $ docker secret創(chuàng)建site.crt site.crt
將site.conf
文件保存在Docker配置中。第一個參數(shù)是配置的名稱,第二個參數(shù)是要從中讀取的文件。$ docker config create site.conf site.conf List the configs: $ docker config ls ID NAME CREATED UPDATED 4ory233120ccg7biwvy11gl5z site.conf 4秒前
創(chuàng)建一個運行Nginx并可以訪問兩個秘密和配置的服務(wù)。$ docker service create \ --name nginx \ --secret site.key \ --secret site.crt \ --config source = site.conf,target = / etc / nginx / conf.d / site.conf \ - 發(fā)布3000:443 \ nginx:latest \ sh -c“exec nginx -g'daemon off;'”在運行的容器中,現(xiàn)在存在以下三個文件:
- `/run/secrets/site.key`- `/run/secrets/site.crt`- `/etc/nginx/conf.d/site.conf`
驗證Nginx服務(wù)正在運行。$ docker service ls ID NAME MODE REPLICAS IMAGE zeskcec62q24 nginx replicated 1/1 nginx:latest $ docker service ps nginx NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS Nginx.1.9ls3yo9ugcls nginx:latest moby Running Running 3分鐘前
驗證服務(wù)是否可操作:您可以訪問Nginx服務(wù)器,并且正在使用正確的TLS證書。$ curl --cacert root-ca.crt https://0.0.0.0:3000 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>如果您看到此頁面,nginx web服務(wù)器已成功安裝并正常運行。需要進一步配置。</ p> <p>有關(guān)在線文檔和支持,請參閱<a href="http://nginx.org/"> nginx.org </a>。商業(yè)支持可以在<a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> $ openssl s_client -connect 0.0.0.0:3000 -CAfile root-ca.crt CONNECTED(00000003) depth=1 /C=US/ST=CA/L=San Francisco/O=Docker/CN=Swarm Secret Example CA verify return:1 depth=0 /C=US/ST=CA/L=San Francisco/O=Docker/CN=localhost verify return:1 --- Certificate chain 0 s:/C=US/ST=CA/L=San Francisco/O=Docker/CN=localhost i:/C=US/ST=CA/L=San Francisco/O=Docker/CN=Swarm Secret Example CA --- Server certificate -----BEGIN CERTIFICATE----- … -----END CERTIFICATE----- subject=/C=US/ST=CA/L=San Francisco/O=Docker/CN=localhost issuer=/C=US/ST=CA/L=San Francisco/O=Docker/CN=Swarm Secret Example CA --- No client certificate CA names sent --- SSL handshake has read 1663 bytes and written 712 bytes --- New, TLSv1/SSLv3, Cipher is AES256-SHA Server public key is 4096 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE SSL-Session: Protocol : TLSv1 Cipher : AES256-SHA Session-ID: A1A8BF35549C5715648A12FD7B7E3D861539316B03440187D9DA6C2E48822853 Session-ID-ctx: Master-Key: F39D1B12274BA16D3A906F390A61438221E381952E9E1E05D3DD784F0135FB81353DA38C6D5C021CB926E844DFC49FC4 Key-Arg : None Start Time: 1481685096 Timeout : 300 (sec) Verify return code: 0 (ok)
除非你打算繼續(xù)下一個例子,否則在運行這個例子之后通過刪除nginx
服務(wù)和存儲的秘密和配置來清理。$ docker service rm nginx $ docker secret rm site.crt site.key $ docker config rm site.conf
您現(xiàn)在配置了一個Nginx服務(wù),其配置與其映像分離。您可以使用完全相同的映像運行多個站點,但可以單獨配置,而不需要根本建立自定義映像。
要旋轉(zhuǎn)一個配置,你首先保存一個與當前正在使用的名稱不同的新配置。然后重新部署該服務(wù),刪除舊配置并在容器中的相同安裝點添加新配置。此示例通過旋轉(zhuǎn)site.conf
配置文件構(gòu)建在前一個示例上。
在site.conf
本地編輯文件。添加index.php
到該index
行,并保存該文件。server { listen 443 ssl; server_name localhost; ssl_certificate /run/secrets/site.crt; ssl_certificate_key /run/secrets/site.key; location / { root /usr/share/nginx/html; index index.html index.htm index.php; } }
使用新的site.conf
叫做的新建一個Docker配置site-v2.conf
。$ docker config create site-v2.conf site.conf
更新nginx
服務(wù)以使用新配置而不是舊配置。$ docker service update \ --config -rm site.conf \ --config-add source = site-v2.conf,target = / etc / nginx / conf.d / site.conf \ nginx
驗證nginx
服務(wù)是否完全重新部署,使用docker service ls nginx
。當它是,你可以刪除舊的site.conf
配置。$ docker config rm site.conf
為了清理,你可以刪除nginx
服務(wù),以及秘密和配置。$ docker service rm nginx $ docker secret rm site.crt site.key $ docker config rm site-v2.conf
您現(xiàn)在已經(jīng)更新了nginx
服務(wù)的配置,而無需重新構(gòu)建其映像。