【问题标题】:Why do I need to be in Swarm mode to use Docker secrets?为什么我需要处于 Swarm 模式才能使用 Docker 机密?
【发布时间】:2020-03-06 19:34:48
【问题描述】:

我正在使用单个容器 docker 映像。我想在不使用 compose 的情况下将我的 db 密码存储为秘密(现在有问题和 Gradle)。我以为即使没有 compose,我仍然可以使用秘密,但当我尝试时,我得到......

$ echo "helloSecret" | docker secret create helloS -

来自守护进程的错误响应:此节点不是集群管理器。使用“docker swarm init”或“docker swarm join”将此节点连接到swarm,然后重试。

为什么我需要使用 swarm 模式才能使用秘密?为什么我不能在没有集群的情况下使用它们?

【问题讨论】:

  • 它们存储在 raft 日志中(特定于 Swarm)。不过,您不需要使用 compose(可以通过 cli 创建所有内容)。仅使用单个节点 Swarm 并没有真正的缺点。
  • @johnharris85 这似乎违反直觉,但我对 docker 还是很陌生。我意识到拥有一个节点群可能不会“伤害”我只是认为它会增加至少一点开销,我不确定为什么这是一个秘密。不过,我会看一下木筏日志,也许这会有所启发。谢谢!
  • 但是为什么你需要使用秘密呢?是因为你在生产和开发中工作的代码是一样的吗?
  • 最终是的,我想成功,所以我不必将 EnvVars 存储在 docker 文件中。

标签: docker docker-swarm docker-secrets


【解决方案1】:

您需要为机密运行 swarm 模式,因为这就是 docker 实现机密的方式。秘密的价值在于工作人员永远不会将秘密写入磁盘,秘密是在需要知道的基础上(其他工作人员在安排任务之前不会收到秘密),并且管理人员在磁盘上加密该秘密。管理器上的秘密存储使用 raft 数据库。

您可以使用命令docker swarm init 轻松部署单节点集群。从那里,docker-compose up 更改为 docker stack deploy -c docker-compose.yml $stack_name


swarm 模式下的秘密和配置提供了将单个文件卷挂载到容器中进行配置的替代方法。所以在单个节点上没有 swarm 模式,你总是可以做出如下定义:

version: '2'
services:
  app:
    image: myapp:latest
    volumes:
    - ./secrets:/run/secrets:ro

或者您可以通过将这些秘密加载到一个命名卷中来将这些秘密与您的应用程序稍微分开。为此,您可以执行以下操作:

tar -cC ./secrets . | docker run -i -v secrets:/secrets busybox tar -xC /secrets

然后挂载该命名卷:

version: '2'
volumes:
  secrets:
    external: true
services:
  app:
    image: myapp:latest
    volumes:
    - secrets:/run/secrets:ro

【讨论】:

    【解决方案2】:

    查看这个答案:https://serverfault.com/a/936262 由用户 sel-en-ium 提供:-

    如果您使用撰写文件,则可以使用机密。(您无需运行 一群)。

    您使用带有docker-compose 的撰写文件:there is documentation for "secrets" in a docker-compose.yml file

    我切换到 docker-compose 是因为我想使用秘密。我是 很高兴我做到了,它似乎更干净。每个服务映射到一个 容器。如果你想改用运行 swarm, 你基本上已经在那里了。

    不幸的是,秘密没有加载到容器的 环境,它们被挂载到 /run/secrets/

    【讨论】:

    • 你能展示一个使用秘密的docker-compose 的工作示例吗?文档甚至OP的错误信息都表明不会在容器中配置secret。
    • 作为一个工作示例,以下答案中的步骤基于上述答案:stackoverflow.com/a/42151570/227926
    • 该示例不使用docker-compose,它使用swarm 模式部署密钥(参见docker swarm initdocker stack deploy 命令)。
    • 也许混淆是撰写文件与docker-compose 命令不同。 Swarm 模式使用相同的 yaml compose 文件(使用版本 3 语法),但它部署容器的方式非常不同。
    • Swarm 为您提供编排、容错、多节点、覆盖网络、路由网格和秘密(我想不到)。 Swarm 可以很好地扩展,与 k8s 的最大区别在于可配置性和可扩展性。 Swarm 模式是一种适合多种解决方案的解决方案,如果适合您的大小,那就太好了。
    猜你喜欢
    • 2017-04-26
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多