连接到远程 docker 主机/部署堆栈

Connect to remote docker host / deploy a stack

我创建了一个 docker 堆栈来部署到群中。现在我有点困惑将其部署到真实服务器的正确方法是什么?

当然可以

  1. scp 我的 docker-stack.yml 文件到我的 swarm
  2. 的一个节点
  3. ssh进入节点
  4. 运行 docker stack deploy -c docker-stack.yml stackname

所以就有了我想到的docker-machine工具。 我试过了

docker-machine -d none --url=tcp://<RemoteHostIp>:2375 node1

只有在没有 TLS 的情况下打开端口,什么才有效? 我收到了以下内容:

$ docker-machine env node1
Error checking TLS connection: Error checking and/or regenerating the certs: There was an error validating certificates for host "192.168.178.49:2375": dial tcp 192.168.178.49:2375: connectex: No connection could be made because the target machine actively refused it.
You can attempt to regenerate them using 'docker-machine regenerate-certs [name]'.
Be advised that this will trigger a Docker daemon restart which might stop running containers.

我已经尝试生成证书并将其复制到主机:

 ssh-keygen -t rsa
 ssh-copy-id myuser@node1

那我运行

docker-machine --tls-ca-cert PathToMyCert --tls-client-cert PathToMyCert create -d none --url=tcp://192.168.178.49:2375 node1 

结果如下:

 $ docker-machine env node1
 Error checking TLS connection: Error checking and/or regenerating the certs: There was an error validating certificates for host "node1:2375": There was an error reading certificate
 You can attempt to regenerate them using 'docker-machine regenerate-certs [name]'.
 Be advised that this will trigger a Docker daemon restart which might stop running containers.

我也用通用驱动试过了

$ docker-machine create -d generic --generic-ssh-port "22" --generic-ssh-user "MyRemoteUser" --generic-ip-address 192.168.178.49 node1
Running pre-create checks...
Creating machine...
(node1) No SSH key specified. Assuming an existing key at the default    location.
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Error creating machine: Error detecting OS: OS type not recognized

如何使用 TLS 正确添加带有 docker 机器的远程 docker 主机? 或者是否有更好的方法将堆栈部署到 server/into 生产?

我经常读到您不应该公开 docker 端口,但一次都不知道如何去做。我不敢相信他们没有提供一种简单的方法来做到这一点。

更新与解决方案

我认为这两个答案都有资格。 我发现 Deploy to Azure Offical Doc(AWS 也一样)。 @Ta运行 Lalwani 的回答为我指明了正确的方向,这几乎是官方的解决方案。这就是我接受他的回答的原因。

对我来说,以下命令有效:

ssh -fNL localhost:2374:/var/run/docker.sock myuser@node1

然后你可以运行:

docker -H localhost:2374 stack deploy -c stack-compose.yml stackname

DOCKER_HOST=localhost:2374
docker stack deploy -c stack-compose.yml stackname

@BMitch 的回答也是有效的,他提到的安全问题不容忽视。

更新 2

@bretf 的回答是连接到您的 swarm 的绝佳方式。特别是如果你有多个。它仍处于测试阶段,但适用于互联网可用且没有 ARM 架构的集群。

即使我正在考虑 TLS,我也不希望 opening/exposing docker 端口。我宁愿使用 SSH 隧道然后进行部署

ssh -L 2375:127.0.0.1:2375 myuser@node1

然后使用

DOCKER_HOST=tcp://127.0.0.1:2375
docker stack deploy -c docker-stack.yml stackname

您不需要 docker-机器。 Docker 有配置 TLS in their documentation 的详细步骤。步骤包括:

  • 创建 CA
  • 创建并签署服务器证书
  • 配置 dockerd 守护程序以使用此证书并验证客户端证书
  • 创建并签署客户端证书
  • 将 ca 和客户端证书文件复制到客户端计算机的 .docker 文件夹
  • 设置一些环境变量以使用客户端证书和远程 docker 主机

我不会在多用户环境中使用 ssh 隧道方法,因为任何可以访问 127.0.0.1 的用户都可以在没有密码或任何审核的情况下对远程 docker 主机进行 root 访问。

如果您为 Windows 使用 Docker 或为 Mac 使用 Docker,Docker Cloud 有一种更自动化的方式来设置您的 TLS 证书和让您免费安全地连接到远程主机。 "Swarms" 下有 "Bring your own Swarm",它在您的 Swarm 管理器上运行代理容器,让您轻松使用本地 docker cli,无需手动设置证书。它仍然需要 Swarm 端口对互联网开放,但此设置确保它启用了 TLS 相互身份验证。

Here's a youtube video showing how to set it up。它还可以支持 adding/removing 其他管理员远程访问 Swarm 的组权限。