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

时间:2017-12-29 16:42:54

标签: docker docker-swarm docker-stack

我创建了一个docker堆栈来部署到一个swarm。现在我有点困惑如何将它部署到真实服务器的正确方式?

当然我可以

  1. scp我的docker-stack.yml文件到我的群体的节点
  2. ssh进入节点
  3. 运行docker stack deploy -c docker-stack.yml stackname
  4. 所以我认为有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.
    

    我已经尝试过生成证书&amp;将其复制到主持人:

     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-machine的远程docker主机? 或者是否有更好的方法将堆栈部署到服务器/生产?

    我经常读到你不应该公开docker端口,但不能暴露一下如何做到这一点。我不相信他们没有提供一种简单的方法来做到这一点。

    更新&amp;溶液

    我认为这两个答案都有资格。 我发现Deploy to Azure Offical Doc(对于AWS来说也是如此)。 来自@Tarun 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的答案是一种连接你的群体的绝佳方式。特别是如果你有一个以上。它仍然是测试版,但适用于互联网可用的群体,并且没有ARM架构。

3 个答案:

答案 0 :(得分:2)

如果您正在使用Docker for Windows或Docker for Mac,Docker Cloud可以更自动地设置TLS证书,并让您安全地连接到远程主机。在&#34; Swarms&#34;那里&#34;带上你自己的Swarm&#34;它在您的Swarm管理器上运行代理容器,让您轻松使用本地docker cli而无需手动设置证书。它仍然需要将Swarm端口打开到Internet,但此设置可确保它启用了TLS相互身份验证。

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

答案 1 :(得分:1)

即使我在考虑使用TLS,我也不希望打开/暴露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

答案 2 :(得分:1)

你不需要泊坞机。 Docker具有配置TLS in their documentation的详细步骤。步骤包括:

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

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