docker config配置文件相關


關於配置

Docker 17.06引入了群體服務配置,使您可以在服務映像之外或運行中的容器之外存儲非敏感信息,例如配置文件。這使您可以使映像盡可能通用,而無需將安裝文件綁定安裝到容器中或使用環境變量。
配置的操作方式與機密類似,不同之處在於配置文件在靜止狀態下不會進行加密,並且無需使用RAM磁盤即可直接安裝到容器的文件系統中。可以隨時在服務中添加或刪除配置,並且服務可以共享配置。您甚至可以將配置與環境變量或標簽結合使用,以實現最大的靈活性。配置值可以是通用字符串或二進制內容(最大500 kb)。
注意:Docker配置僅適用於群集服務,不適用於獨立容器。要使用此功能,請考慮使您的容器作為規模為1的服務運行。
Linux和Windows服務均支持配置。

Windows支持

Docker 17.06及更高版本包括對Windows容器上的配置的支持。在實現上有差異的地方,在下面的示例中將其聲明出來。請記住以下明顯差異:
具有自定義目標的配置文件不會直接綁定安裝到Windows容器中,因為Windows不支持非目錄文件綁定安裝。取而代之的是,將容器的配置全部安裝在容器內 C:\ProgramData\Docker\internal\configs(應用程序不應依賴的實現細節)。符號鏈接用於從那里指向容器內配置的所需目標。默認目標是C:\ProgramData\Docker\configs。
創建使用Windows容器的服務時,配置不支持用於指定UID,GID和模式的選項。當前,只有管理員和用戶system可以在容器內訪問配置文件。
在Windows上,創建或更新使用服務--credential-spec與 config:// 格式。在容器啟動之前,這會將gMSA憑證文件直接傳遞到節點。沒有gMSA憑據寫入工作節點上的磁盤。有關更多信息,請參閱將服務部署到群。

  1. docker配置文件儲存分為兩種:

    • 加密儲存
    • 不加密儲存
  2. docker對配置文件得相關命令

    • 創建配置文件:
      docker config create 創建配置文件名 配置所在位置
      示例:docker config create test.conf ./test.conf
    • 查看配置文件信息:
      docker config inspect 配置文件名
      示例:docker config inspect test.conf
    • 顯示docker里已經保存得配置文件
      docker config ls 配置文件名
    • 刪除配置文件
      docker config rm 配置文件名
  3. docker 配置操作演示

    • 將配置添加到Docker。該docker config create命令讀取標准輸入,因為最后一個參數(表示要從中讀取配置的文件)設置為-。
      $ echo "This is a config" | docker config create my-config -

    • 創建一個redis服務並授予其對配置的訪問權限。默認情況下,容器可以訪問處的配置/my-config,但是您可以使用target選項在容器上自定義文件名。
      $ docker service create --name redis --config my-config redis:alpine

    • 使用驗證任務運行是否正常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 Running Running 8 seconds ago

    • 使用獲取redis服務任務容器的ID docker ps,以便您可以用於docker container exec連接到容器並讀取config數據文件的內容,該文件默認為所有人可讀,並且與config的名稱相同。下面的第一個命令說明了如何查找容器ID,第二個和第三個命令使用Shell補全功能自動執行此操作。
      $ docker ps --filter name=redis -q
      5cb1c2348a59
      $ docker container 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 container exec $(docker ps --filter name=redis -q) cat /my-config
      This is a config

    • 嘗試刪除配置。由於redis服務正在運行並且可以訪問配置,因此刪除失敗。
      $ docker config ls
      ID NAME CREATED UPDATED
      fzwcfuqjkvo5foqu7ts7ls578 hello 31 minutes ago 31 minutes ago
      $ docker config rm my-config
      Error response from daemon: rpc error: code = 3 desc = config 'my-config' is
      in use by the following service: redis

    • redis通過更新服務,從正在運行的服務中刪除對配置的訪問。
      $ docker service update --config-rm my-config redis

    • 再次重復第3步和第4步,確認服務不再有權訪問配置。容器ID不同,因為該 service update命令重新部署了服務。
      $ docker container exec -it $(docker ps --filter name=redis -q) cat /my-config
      cat: can't open '/my-config': No such file or directory

    • 停止並刪除服務,然后從Docker中刪除配置。
      $ docker service rm redis
      $ docker config rm my-config

  4. 在Windows服務中使用配置

    • 將以下內容保存到新文件中index.html。
      <head><title>Hello Docker</title></head>
      <body>
          <p>Hello Docker! You have deployed a HTML page.</p>
      </body>
  </html>
- 如果尚未這樣做,請初始化或加入群集。

docker swarm init

- 將index.html文件另存為名為的群集配置homepage。

docker config create homepage index.html

- 創建一個IIS服務,並授予其對homepage配置的訪問權限。

docker service create
--name my-iis
--publish published=8000,target=8000
--config src=homepage,target="\inetpub\wwwroot\index.html"
microsoft/iis:nanoserver

- 在訪問IIS服務http://localhost:8000/。它應該從第一步開始提供HTML內容。

- 刪除服務和配置。

docker service rm my-iis
docker config rm homepage
5. 將配置與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,並將以下內容粘貼到其中。這限制了根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,並將以下內容粘貼到其中。這限制了站點證書,因此它只能用於對服務器進行身份驗證,而不能用於對證書進行簽名。

[server]
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = DNS:localhost, IP:127.0.0.1
subjectKeyIdentifier=hash

- 簽署站點證書。

$ 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的服務,但你需要他們,如果你想生成一個新的站點證書。保護root-ca.key文件。
- 配置NGINX容器

產生一個非常基本的Nginx配置,該配置通過HTTPS提供靜態文件。TLS證書和密鑰作為Docker機密存儲,因此可以輕松旋轉它們。
在當前目錄中,創建一個site.conf包含以下內容的新文件:

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;
    }
}
- 創建兩個密鑰,分別代表密鑰和證書。只要文件小於500 KB,就可以將其存儲為機密文件。這使您可以將密鑰和證書與使用它們的服務分離。在這些示例中,秘密名稱和文件名相同(證書默認路徑:/run/secrets/)。

$ docker secret create site.key site.key
$ docker secret create site.crt site.crt

- 將site.conf文件保存在Docker配置中。第一個參數是配置的名稱,第二個參數是從中讀取配置文件。

$ docker config create site.conf site.conf
- 列出配置:
$ docker config ls
ID NAME CREATED UPDATED
4ory233120ccg7biwvy11gl5z site.conf 4 seconds ago 4 seconds ago
- 創建一個運行Nginx並有權訪問兩個密碼和配置的服務。將模式設置為,0440以便該文件只能由其所有者和該所有者的組讀取,而不能由世界讀取。
$ docker service create
--name nginx
--secret site.key
--secret site.crt
--config source=site.conf,target=/etc/nginx/conf.d/site.conf,mode=0440
--publish published=3000,target=443
nginx:latest
sh -c "exec nginx -g 'daemon off;'"

- 在運行的容器中,現在存在以下三個文件:

/run/secrets/site.key
/run/secrets/site.crt
/etc/nginx/conf.d/site.conf

- 驗證Nginx服務正在運行。

$ 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 minutes ago

- 驗證服務是否正常運行:您可以訪問Nginx服務器,並且使用了正確的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>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support, refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<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)
 - 除非您要繼續執行下一個示例,否則請在運行此示例后通過刪除nginx服務以及存儲的機密和配置進行清理。

$ docker service rm nginx
$ docker secret rm site.crt site.key
$ docker config rm site.conf
- 現在,您已經配置了一個Nginx服務,其配置與映像分離。您可以使用完全相同的映像但使用單獨的配置來運行多個站點,而根本不需要構建自定義映像。

  1. 更新配置文件
    首先要保存一個新名稱,其名稱與當前使用的名稱不同。然后,您可以重新部署服務,刪除舊配置,然后在容器內的同一安裝點添加新配置。本示例通過旋轉site.conf 配置文件在前一個示例的基礎上進行。

    • 在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服務以使用新配置而不是舊配置。

$ docker service update
--config-rm site.conf
--config-add source=site-v2.conf,target=/etc/nginx/conf.d/site.conf,mode=0440
nginx

- 使用驗證是否nginx已完全重新部署該服務 docker service ps nginx。在這種情況下,您可以刪除舊的site.conf 配置。

$ docker config rm site.conf

- 要清理,您可以刪除nginx服務以及機密和配置。

$ docker service rm nginx
$ docker secret rm site.crt site.key
$ docker config rm site-v2.conf


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM