目前,我们在单个 docker 容器上运行应用程序,该应用程序需要将各种敏感数据作为环境变量传递,
我把它们放在运行命令中,这样它们就不会出现在图像中,也不会出现在存储库中,但我最终得到了一个非常不安全的运行命令,
现在,我明白了 docker 秘密是存在的,但是,如何在不部署集群的情况下使用它们?或者还有其他方法可以保护这些数据吗?
此致,
答案1
你不能……没有 Swarm 就不支持秘密。除非“可能”你只使用一个节点“Swarm”。
我认为另一个解决方案是使用第三方保险库软件,例如这个:
但是,要使用 Vault 容器中的秘密,您需要阅读文档。
希望这会为您指明正确的起点。
答案2
是的,如果你使用撰写文件。(您不需要运行群)。
您可以使用 Compose 文件docker-compose: 有docker-compose.yml 文件中“secrets”的文档。
我改用 docker-compose 是因为我想使用 secrets。我很高兴我这么做了,它看起来更简洁。每个服务都映射到一个容器。如果你想改用 swarm,你基本上已经做到了。
注意:机密信息不会加载到容器的环境中,而是挂载到 /run/secrets/
以下是一个例子:
1)项目结构:
|
|--- docker-compose.yml
|--- super_duper_secret.txt
2)docker-compose.yml内容:
version: "3.6"
services:
my_service:
image: centos:7
entrypoint: "cat /run/secrets/my_secret"
secrets:
- my_secret
secrets:
my_secret:
file: ./super_duper_secret.txt
3)super_duper_secret.txt内容:
Whatever you want to write for a secret really.
4)从项目的根目录运行此命令以查看容器是否确实有权访问您的机密(Docker 必须正在运行并且安装了 docker-compose):
docker-compose up --build my_service
您应该看到您的容器输出您的秘密。
答案3
是的(但实际上不是)
不目前,如果你不在 Swarm 中,Docker 不支持配置和机密
但docker compose 规范包含配置和机密撰写规范
那么它是如何工作的?
事实上创建 docker 卷让你相信这个功能是存在的,更具体地说,它是一个绑定挂载
如果您想远程部署您的应用程序,那么与 Swarm 有很大不同!
例子
services:
test:
image: alpine
secrets:
- source: my_secret
secrets:
my_secret:
file: $PWD/secret
与此相对相同
services:
test:
image: alpine
volumes:
- $PWD/secret:/run/secrets/my_secret:ro
如果你使用 if 查看你的卷docker inspect <container>
并且使用 secret,你会发现你的 secrets 只是本地绑定卷