如何远程连接docker swarm?

时间:2017-05-18 19:40:05

标签: docker docker-swarm docker-swarm-mode docker-secrets

是否可以在我本地mac托管在云端的docker swarm群集上执行命令?如果是,怎么样?

我想从本地执行命令,例如跟随docker swarm:

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

5 个答案:

答案 0 :(得分:7)

可以找到问题的答案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

答案 1 :(得分:2)

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

Docker已在此处记录了设置CA并创建/安装密钥的步骤:https://docs.docker.com/engine/security/https/

配置完成后,只需更改shell中$ DOCKER_HOST的值,就可以使用在docker主机上本地运行的相同docker命令连接到较新的swarm模式环境。

答案 2 :(得分:1)

一个选项是按照先前答案的建议提供对docker守护程序的直接访问,但这需要设置TLS证书和密钥,这本身可能很棘手且耗时。当使用Docker机器创建节点时,Docker机器可以自动执行该过程。

我遇到了同样的问题,因为我想在群集上创建机密,而不将包含机密的文件上载到群集管理器。另外,我希望能够运行deploy堆栈文件(例如docker-compose.yml),而不必先上传堆栈文件。

我希望能够创建一些我需要的服务器,例如DigitalOcean,不一定使用docker机器,并且能够可复制地创建密钥并运行堆栈文件。在DigitalOcean和AWS等环境中,未使用单独的TLS证书集,而是使用本地计算机上的ssh密钥通过ssh访问远程节点。

对我有用的解决方案是在ssh上使用单个命令运行docker命令,这使我可以使用stdin传递密钥和/或堆栈文件。

为此,您首先需要创建DigitalOcean Droplet并可能从自定义映像或快照中安装docker,或者仅运行命令以在每个Droplet上安装docker。然后,将小滴连接到一个群集中:ssh进入将成为管理器节点的群集,键入docker swarm init(如果该节点上有多个IP,则可以使用--advertise-addr选项,例如,当您想在专用网络上保留群内流量时),然后取回swarm的join命令。然后ssh进入其他每个节点并发出join命令,然后创建您的集群。

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

export SSH_CMD='ssh root@159.89.98.121'

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

$SSH_CMD docker service ls

您可以在群集上创建密钥,而无需将密钥文件复制到群集管理器:

$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应该接受stdin上的机密,然后使用ssh将文件通过管道传输到stdin)

您还可以创建一个脚本,以便能够可重复地运行命令来创建您的机密,并仅在本地计算机上使用机密文件和堆栈文件启动堆栈。这样的脚本可能是:

$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文件为stop,amqp和监视接口设置了ssh侦听端口,并告诉rabbitmq在/ run / secrets中查找证书和密钥。该特定映像的另一种选择是是使用映像提供的环境变量来指向机密文件,但是我想要一个更通用的解决方案,不需要在映像中进行配置)

现在,如果要启动另一个群集,则在设置SSH_CMD环境变量后,脚本将与该群集一起使用,并且无需设置TLS或将密钥或堆栈文件复制到群集中文件系统。

因此,这并不能解决创建群体的问题(问题的存在是其先决条件),但是一旦创建,就可以使用环境变量(如果要在脚本中使用它导出,则可以导出)几乎完全使用您列出的命令,并以该环境变量为前缀。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

这是在远程 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

您需要使用基于密钥的身份验证来完成这项工作(您应该已经在使用它)。其他选项包括设置基于 tls 证书的套接字或 ssh 隧道。