92

docker-compose.yml 规范 3.1 版引入了对secrets的支持。

我试过这个:

version: '3.1'

services:
  a: 
    image: tutum/hello-world
  secret: 
    password: the_password
  b:
    image: tutum/hello-world

$ docker-compose up返回:

Unsupported config option for services.secret: 'password'

我们如何在实践中使用秘密功能?

4

7 回答 7

162

您可以从官方文档中阅读相应的部分

要使用机密,您需要在docker-compose.yml文件中添加两件事。secrets:首先,定义所有秘密的顶级块。然后,每个服务下的另一个secrets:块指定服务应该接收哪些秘密。

例如,创建 Docker 可以理解的两种机密:外部机密和文件机密。

1.使用创建一个“外部”秘密 docker secret create

第一件事:要在 Docker 中使用机密,您所在的节点必须是 swarm 的一部分。

$ docker swarm init

接下来,创建一个“外部”机密:

$ echo "This is an external secret" | docker secret create my_external_secret -

(确保包括最后的破折号,-。很容易错过。)

2. 将另一个秘密写入文件

$ echo "This is a file secret." > my_file_secret.txt

3. 创建一个docker-compose.yml使用这两个秘密的文件

现在已经创建了两种类型的秘密,下面是一个docker-compose.yml文件,它将读取这两种类型并将它们写入web服务:

version: '3.1'

services:
  web:
    image: nginxdemos/hello
    secrets:                    # secrets block only for 'web' service
     - my_external_secret
     - my_file_secret

secrets:                        # top level secrets block
  my_external_secret:
    external: true
  my_file_secret:
    file: my_file_secret.txt

Docker 可以从它自己的数据库(例如用 制作的秘密docker secret create)或文件中读取秘密。上面显示了这两个示例。

4. 部署您的测试堆栈

使用以下命令部署堆栈:

$ docker stack deploy --compose-file=docker-compose.yml secret_test

web这将创建一个名为的服务实例secret_test_web

5.验证服务创建的容器是否有两个secret

用于docker exec -ti [container] /bin/sh验证机密是否存在。

(注意:在下面的docker exec命令中,该m2jgac...部分在您的机器上会有所不同。运行docker ps以查找您的容器名称。)

$ docker exec -ti secret_test_web.1.m2jgacogzsiaqhgq1z0yrwekd /bin/sh

# Now inside secret_test_web; secrets are contained in /run/secrets/
root@secret_test_web:~$ cd /run/secrets/

root@secret_test_web:/run/secrets$ ls
my_external_secret  my_file_secret

root@secret_test_web:/run/secrets$ cat my_external_secret
This is an external secret

root@secret_test_web:/run/secrets$ cat my_file_secret
This is a file secret.

如果一切顺利,我们在步骤 1 和 2 中创建的两个秘密应该web在我们部署堆栈时创建的容器内。

于 2017-02-10T04:32:44.273 回答
17

假设您有一个服务myapp和一个秘密文件secrets.yml

创建一个撰写文件:

version: '3.1'

services:
  myapp:
    build: .
    secrets:
      secrets_yaml

使用以下命令配置密钥:

docker secret create secrets_yaml secrets.yml

使用以下命令部署您的服务:

docker deploy --compose-file docker-compose.yml myappstack

现在您的应用程序可以访问位于/run/secrets/secrets_yaml. 您可以在应用程序中硬编码此路径或创建符号链接。


不一样的问题

这个答案可能是针对“你如何为你的 docker swarm 集群提供你的秘密”这个问题的。

最初的问题“你如何使用 docker compose 管理秘密值”意味着 docker-compose 文件包含秘密值。它没有。

还有一个不同的问题:“您将文件的规范源存储在哪里secrets.yml”。这取决于你。您可以将其存储在您的脑海中,在一张纸上打印,使用密码管理器,使用专用的秘密应用程序/数据库。哎呀,如果它本身安全,你甚至可以使用 git 存储库。当然,永远不要将它存储在你用它保护的系统中:)

我会推荐保险库。要存储秘密:

# create a temporary secret file
cat secrets.yml | vault write secret/myappsecrets -

要检索一个秘密并将其放入您的 docker swarm:

vault read -field=value secret/myappsecrets | docker secret create secrets_yaml -

当然,您可以使用 docker 集群本身作为您秘密的单一事实来源,但如果您的 docker 集群中断,您将丢失您的秘密。因此,请确保在其他地方进行备份。


没人问的问题

第三个问题(没有人问)是如何为开发人员的机器提供秘密。当存在无法在本地模拟的外部服务或无法复制的大型数据库时,可能需要它。

同样,docker 与它无关(还)。它没有访问控制列表来指定哪些开发人员可以访问哪些机密。它也没有任何身份验证机制。

理想的解决方案似乎是这样的:

  • 开发人员打开一些 Web 应用程序。
  • 使用一些单点登录机制进行身份验证。
  • 复制一些长长的docker secret create命令列表并在终端中执行它们。

我们还没有看到是否会弹出这样的应用程序。

于 2017-02-10T03:53:11.610 回答
11

您还可以使用对象中的键指定secrets本地存储在文件中。然后您不必自己处理它们,Compose /会为您完成。file:secretsdocker secret createdocker stack deploy

version: '3.1'

secrets:
  password:
    file: ./password

services:
  password_consumer:
    image: alpine
    secrets:
      - password

参考:撰写文件版本 3 参考:Secrets

于 2017-04-04T20:52:01.063 回答
1

那是您docker-compose.yml文件的确切缩进吗?我认为 应该嵌套在(即服务之一)下,而不是直接在section下。secret secretsaservices

于 2017-02-09T15:17:15.737 回答
1

评论中提出了一个问题,如果我只需要秘密,为什么要初始化一个群体?我的回答是,秘密是为群创建的,你有多个节点,并且你想以一种安全的方式管理和共享秘密。但是,如果您有一个节点,如果有人可以访问您拥有一个节点群的主机,这将不会(几乎)增加任何额外的安全性,因为可以从正在运行的容器中检索秘密,或者如果秘密可以直接在主机上检索是从文件创建的,例如私钥。

查看此博客:https ://www.docker.com/blog/docker-secrets-management/

并阅读评论:“非常感谢您的介绍性文章。当redis容器在工作节点上创建时,提到的查看容器中秘密内容的步骤将不起作用。”

于 2021-07-06T18:56:06.790 回答
-3

我猜关键字secrets不是secret。这至少是我从阅读架构中所理解的。

于 2017-02-09T15:03:10.137 回答
-3

关键字是秘密而不是秘密。它还应该在 service a 下适当缩进。

于 2021-08-26T14:08:37.547 回答