你如何使用docker-compose v3.1管理秘密值?

时间:2017-02-09 14:42:47

标签: docker docker-compose docker-secrets

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'

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

6 个答案:

答案 0 :(得分:62)

您可以阅读corresponding section from the official documentation

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

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

1。创建一个'外部'秘密使用docker secret create

第一件事:要使用Docker的秘密,你所在的节点必须是群体的一部分。

$ 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。验证服务创建的容器是否同时具有密钥

使用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容器内。

答案 1 :(得分:9)

鉴于您有服务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 compose"来管理秘密值?暗示docker-compose文件包含秘密值。它没有。

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

我会推荐vault。存储秘密:

# 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 cluster本身作为您秘密的单一事实来源,但如果您的docker群集中断,您就会丢失您的秘密。所以一定要在其他地方备份。

无人问的问题

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

同样,docker与它无关(尚未)。它没有访问控制列表,指定哪些开发人员可以访问哪些秘密。它也没有任何认证机制。

理想的解决方案似乎是:

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

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

答案 2 :(得分:4)

您还可以使用secrets对象中的file:键指定存储在本地文件中的secrets。那么你自己不必docker secret create,Compose / docker stack deploy会为你做。

version: '3.1'

secrets:
  password:
    file: ./password

services:
  password_consumer:
    image: alpine
    secrets:
      - password

参考:Compose file version 3 reference: Secrets

答案 3 :(得分:1)

我猜关键字是secrets而不是secret。这至少是我在阅读schema时所理解的。

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

这是您docker-compose.yml文件的确切缩进吗?我认为 secret secrets应该嵌套在a下(即其中一项服务),而不是直接在{{1}下}。section。