我怎样才能远程连接到 docker swarm?

How can I remotely connect to docker swarm?

是否可以从本地 mac 在云中托管的 docker swarm 集群上执行命令?如果是,如何?

我想在我本地的 docker swarm 上执行如下命令:

docker create secret my-secret <address to local file>
docker service create --name x --secrets my-secret image

要连接到远程 docker 节点,您应该在从同一 CA 签名的 docker 主机和客户端上设置 TLS。请注意限制您使用此 CA 签署的密钥,因为它用于控制对 docker 主机的访问。

Docker 已在此处记录了设置 CA 和 create/install 密钥的步骤:https://docs.docker.com/engine/security/https/

配置后,您可以使用与 运行 相同的 docker 命令在 docker 主机上连接到较新的群模式环境,只需更改 $[= 的值即可18=] 在你的 shell.

可以找到问题的答案here

需要为 ubuntu 机器做的是在路径 /etc/docker 定义 daemon.json 文件,内容如下:

{
  "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 所述,可以找到生成证书的详细信息here

一种选择是提供对 docker 守护程序的直接访问,如先前答案中所建议的那样,但这需要设置 TLS 证书和密钥,这本身就很棘手且耗时。 Docker 机器可以自动执行该过程,当 docker 机器已用于创建节点时。

我遇到了同样的问题,因为我想在 swarm 上创建 secrets,而不是将包含 secret 的文件上传到 swarm manager。此外,我希望能够 运行 部署堆栈文件(例如 docker-compose.yml),而无需首先上传堆栈文件。

我希望能够创建我需要的少数服务器,例如DigitalOcean,不一定使用 docker 机器,并且能够重现地创建秘密和 运行 堆栈文件。在像 DigitalOcean 和 AWS 这样的环境中,不使用一组单独的 TLS 证书,而是使用本地计算机上的 ssh 密钥通过 ssh 访问远程节点。

对我有用的解决方案是 运行 docker 命令在 ssh 上使用单独的命令,这允许我使用标准输入管道传输秘密 and/or 堆栈文件.

为此,您首先需要创建 DigitalOcean droplet 并在其上安装 docker,可能来自自定义图像或快照,或者简单地 运行 安装命令以安装 docker 在每个液滴上。然后,将液滴加入一个群:ssh 进入将成为管理器节点的那个,键入 docker swarm init(如果该节点上有多个 IP,则可能使用 --advertise-addr 选项,例如当你想在专用网络上保留群内流量时)并取回群的加入命令。然后 ssh 进入其他每个节点并发出加入命令,您的群就创建好了。

然后,导出ssh命令,您需要在管理器节点上发出命令,例如

export SSH_CMD='ssh root@159.89.98.121'

现在,您有几个选择。您可以发出单独的 docker 命令,例如:

$SSH_CMD docker service ls

您可以在您的 swarm 上创建一个 secret,而无需将 secret 文件复制到 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内寻找证书和密钥。另一种选择对于这个特定的图像将使用图像提供的环境变量来指向秘密文件,但我想要一个不需要在图像中配置的更通用的解决方案)

现在,如果你想启动另一个群,一旦你设置了 SSH_CMD 环境变量,你的脚本就会与那个群一起工作,你既不需要设置 TLS,也不需要将你的秘密或堆栈文件复制到群文件系统。

所以,这并没有解决创建群的问题(你的问题预设了它的存在),但是一旦创建了它,使用环境变量(如果你想在脚本中使用它就导出)将会允许您几乎完全使用您列出的命令,并以该环境变量为前缀。

如果您从头开始,您可以使用 generic docker-machine driver 创建管理器节点。之后,您将能够在 docker-machine env 命令的帮助下从本地计算机连接到 docker 引擎。

这是在远程 docker 引擎上执行 运行ning 命令的最简单方法:

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 control socket 以避免对每个命令重新验证,这样您的命令将 运行 更快,因为它是本地命令。