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