是否可以从我的本地 mac 在托管在云中的 docker swarm 集群上执行命令?如果是,如何?
我想在本地的 docker swarm 上执行以下命令:
docker create secret my-secret <address to local file>
docker service create --name x --secrets my-secret image
是否可以从我的本地 mac 在托管在云中的 docker swarm 集群上执行命令?如果是,如何?
我想在本地的 docker swarm 上执行以下命令:
docker create secret my-secret <address to local file>
docker service create --name x --secrets my-secret image
可以在这里找到问题的答案。
对于 ubuntu 机器需要做的是daemon.json
在路径中定义/etc/docker
具有以下内容的文件:
{
"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}
上述配置是不安全的,如果服务器是公共托管的,则不应使用。
对于安全连接,请使用以下配置:
{
"tls": true,
"tlscert": "/var/docker/server.pem",
"tlskey": "/var/docker/serverkey.pem",
"hosts": ["tcp://x.x.x.y:2376", "unix:///var/run/docker.sock"]
}
如@BMitch 所述,可以在此处找到生成证书的详细信息。
一种选择是提供对 docker 守护程序的直接访问,如先前答案中所建议的那样,但这需要设置 TLS 证书和密钥,这本身可能很棘手且耗时。当 docker machine 用于创建节点时,Docker machine 可以自动执行该过程。
我遇到了同样的问题,因为我想在 swarm 上创建秘密而不将包含秘密的文件上传到 swarm 管理器。此外,我希望能够运行部署堆栈文件(例如 docker-compose.yml),而无需先上传堆栈文件。
我希望能够在例如 DigitalOcean 上创建我需要的少数服务器,不一定使用 docker 机器,并且能够可重复地创建秘密并运行堆栈文件。在 DigitalOcean 和 AWS 等环境中,不使用单独的 TLS 证书集,而是使用本地计算机上的 ssh 密钥通过 ssh 访问远程节点。
对我有用的解决方案是使用单个命令 over 运行ssh
docker 命令,这允许我使用 stdin 管道秘密和/或堆栈文件。
为此,您首先需要创建 DigitalOcean 液滴并在其上安装 docker,可能来自自定义图像或快照,或者只需运行命令在每个液滴上安装 docker。然后,将 droplets 加入一个 swarm:ssh
在将成为管理器节点的那个中,键入(如果该节点上有多个 IP,则docker swarm init
可能带有选项,例如当您想将内部 swarm 流量保持在私有--advertise-addr
网络)并取回集群的加入命令。然后ssh
进入其他每个节点并发出 join 命令,然后创建您的 swarm。
然后,导出ssh
您需要在管理器节点上发出命令的命令,例如
export SSH_CMD='ssh root@159.89.98.121'
现在,您有几个选择。您可以发出单独的 docker 命令,例如:
$SSH_CMD docker service ls
您可以在您的 swarm 上创建一个秘密,而无需将秘密文件复制到 swarm 管理器:
$SSH_CMD docker create secret my-secret - < /path/to/local/file
$SSH_CMD docker service create --name x --secrets my-secret image
(-
用于表示docker create secret
应该接受标准输入上的秘密,然后使用 ssh 将文件传送到标准输入)
您还可以创建一个脚本,以便能够以可重复的方式运行命令来创建您的机密,并仅在您的本地计算机上使用机密文件和堆栈文件来启动您的堆栈。这样的脚本可能是:
$SSH_CMD docker secret create rabbitmq.config.01 - < rabbitmq/rabbitmq.config
$SSH_CMD docker secret create enabled_plugins.01 - < rabbitmq/enabled_plugins
$SSH_CMD docker secret create rmq_cacert.pem.01 - < rabbitmq/cacert.pem
$SSH_CMD docker secret create rmq_cert.pem.01 - < rabbitmq/cert.pem
$SSH_CMD docker secret create rmq_key.pem.01 - < rabbitmq/key.pem
$SSH_CMD docker stack up -c - rabbitmq_stack < rabbitmq.yml
其中秘密用于证书和密钥,也用于配置文件 rabbitmq.config 和 enabled_plugins,堆栈文件是 rabbitmq.yml,可能是:
version: '3.1'
services:
rabbitmq:
image: rabbitmq
secrets:
- source: rabbitmq.config.01
target: /etc/rabbitmq/rabbitmq.config
- source: enabled_plugins.01
target: /etc/rabbitmq/enabled_plugins
- source: rmq_cacert.pem.01
target: /run/secrets/rmq_cacert.pem
- source: rmq_cert.pem.01
target: /run/secrets/rmq_cert.pem
- source: rmq_key.pem.01
target: /run/secrets/rmq_key.pem
ports:
# stomp, ssl:
- 61614:61614
# amqp, ssl:
- 5671:5671
# monitoring, ssl:
- 15671:15671
# monitoring, non ssl:
- 15672:15672
# nginx here is only to show another service in the stackfile
nginx:
image: nginx
ports:
- 80:80
secrets:
rabbitmq.config.01:
external: true
rmq_cacert.pem.01:
external: true
rmq_cert.pem.01:
external: true
rmq_key.pem.01:
external: true
enabled_plugins.01:
external: true
(这里,rabbitmq.config 文件为 stomp、amqp 和监控接口设置 ssh 侦听端口,并告诉 rabbitmq 在 /run/secrets 中查找证书和密钥。此特定图像的另一种选择是使用图像提供的环境变量指向秘密文件,但我想要一个更通用的解决方案,不需要在图像中进行配置)
现在,如果您想启动另一个 swarm,一旦您设置了SSH_CMD
环境变量,您的脚本将与该 swarm 一起工作,您既不需要设置 TLS,也不需要将您的秘密或堆栈文件复制到 swarm 文件系统。
所以,这并不能解决创建 swarm 的问题(它的存在是由你的问题所预设的),但是一旦它被创建,使用环境变量(如果你想在脚本中使用它就导出)将允许你使用几乎正是您列出的命令,前缀为该环境变量。
这是在远程 docker 引擎上运行命令的最简单方法:
docker context create --docker host=ssh://myuser@myremote myremote
docker --context myremote ps -a
docker --context myremote create secret my-secret <address to local file>
docker --context myremote service create --name x --secrets my-secret image
或者
docker --host ssh://myuser@myremote ps -a
您甚至可以将远程上下文设置为默认值并像本地一样发出命令:
docker context use myremote
docker ps # lists remote running containers
在这种情况下,您甚至不需要安装 docker 引擎,只需docker-ce-cli
.
您需要为此使用基于密钥的身份验证(您应该已经在使用它)。其他选项包括设置基于 tls 证书的套接字或 ssh 隧道。
此外,请考虑设置ssh 控制套接字以避免对每个命令重新进行身份验证,这样您的命令将运行得更快,因为它是本地的。
要连接到远程 docker 节点,您应该在从同一 CA 签名的 docker 主机和客户端上设置 TLS。请注意限制您使用此 CA 签署的密钥,因为它用于控制对 docker 主机的访问。
Docker 在此处记录了设置 CA 和创建/安装密钥的步骤:https ://docs.docker.com/engine/security/https/
配置完成后,您可以使用在 docker 主机上本地运行的相同 docker 命令连接到较新的 swarm 模式环境,只需在 shell 中更改 $DOCKER_HOST 的值即可。
如果您从头开始,您可以使用通用 docker-machine 驱动程序创建管理器节点。之后,您将能够在docker-machine env
命令的帮助下从本地计算机连接到该 docker 引擎。