【问题标题】:How can docker-machine create an EC2 instance in a private subnet?docker-machine 如何在私有子网中创建 EC2 实例?
【发布时间】:2016-09-27 22:43:29
【问题描述】:

我在公共子网中有一个堡垒主机,我通常通过它访问私有子网中的主机。当我使用以下命令在私有子网中创建 docker 机器时,它没有完成。

export server_name=tomcat-5

docker-machine create \
  --driver amazonec2 \
  --amazonec2-region us-west-2 \
  --amazonec2-vpc-id vpc-8e5488ea \
  --amazonec2-ami ami-6f69a25f \
  --amazonec2-instance-type m3.medium \
  --amazonec2-zone b \
  --amazonec2-subnet-id subnet-52f5dd54 \
  --amazonec2-security-group tomcat-sg-SecurityGroup-JHHNDKKL4LO1 \
  --amazonec2-tags Name,${server_name} \
  --amazonec2-root-size 10 \
  --amazonec2-ssh-user ec2-user \
  --amazonec2-ssh-keypath ~/.ssh/id_rsa \
  --amazonec2-private-address-only \
  ${server_name}

它说

Running pre-create checks...
Creating machine...
(tomcat-5) Launching instance...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...

然后它就永远挂起。显然它不知道如何通过堡垒到达服务器。而且我无法命名服务器,以便 docker 可以利用 .ssh/config (如果它会这样做的话)。

很难想象其他人没有遇到过。我最终计划使用 docker compose 来启动这些服务器。因此,如果我可以在没有 docker-machine 的情况下做到这一点,那也很好。

我错过了什么?

【问题讨论】:

    标签: amazon-ec2 docker-compose docker-machine


    【解决方案1】:

    我可以通过打开调试获得有关该问题的更多信息。本质上

    docker-machine --debug....
    

    这让我看到 docker-machine 正在尝试使用 ec2-user@10.x.y.z 使用这些参数 ssh 进入 IP

    {[-F /dev/null -o PasswordAuthentication=no -o StrictHostKeyChecking=no 
    -o UserKnownHostsFile=/dev/null -o LogLevel=quiet -o ConnectionAttempts=3 
    -o ConnectTimeout=10 -o ControlMaster=no -o ControlPath=none ec2-user@10.x.y.z 
    -o IdentitiesOnly=yes -i /Users/jvarg/.docker/machine/machines/tomcat-2/id_rsa 
    -p 22] /usr/bin/ssh <nil>}
    

    越来越近了。通过为我的子网创建代理来更新我的 ~/.ssh/config,我能够直接 ssh 进入机器。但是 docker 机器没有使用该配置文件。如您所见,它使用 /dev/null。 “-F /dev/null”。

    我查看了 docker 机器代码,这似乎是硬编码的。 https://github.com/docker/machine/blob/df2d3811ca8bc9ddf6896b4a4154b9277826b441/libmachine/ssh/client.go#L69

    我在 github 上创建了一个 issue 来跟进。 https://github.com/docker/machine/issues/3794

    更新:当我们等待 PR 被接受(现在陷入合并冲突)时,这是一个蹩脚的解决方法。登录堡垒并将其用作编排器而不是笔记本电脑。在堡垒上安装 docker 和 docker-machine。还要确保在那里创建一个新的密钥对,以免损害您自己的密钥对。我没有安装 ssh 代理。因此,如果您采用相同的方式,请确保密钥对没有密码。您将能够最终 ssh 进入它。但它会失败

    notifying bugsnag: [Error creating machine: Error running provisioning: exit status 1]
    

    虽然该错误并不明显,但对调试输出的详细分析表明它失败了,因为新机器无法连接到互联网。对于大多数人来说,这通常不是问题。在我公司的情况下,我们使用 http_proxy。但我通过设置 NAT 网关解决了这个问题。

    下一个错误是因为堡垒无法在端口 2376 上与新机器通信。通常 docker-machine 会创建一个 2376 向世界开放的安全组。我的公司不赞成向世界开放港口。所以我更新了我的 SG 以允许从堡垒访问。但我想我需要调整一下。

    【讨论】:

      【解决方案2】:

      我在堡垒上安装了一个 OpenVPN 服务器(实际上是一个 NAT 网关)。然后我的客户端连接到 OpenVPN 服务器。 OpenVPN 服务器推送一条路由,允许客户端访问 VPC 上的私有子网工作。

      这是透明的。我可以使用 docker-machine 在专用网络上创建节点。我什至可以在我的客户端上启动 docker 并加入现有的 swarm。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-23
        • 2020-04-21
        • 2015-01-06
        • 1970-01-01
        • 1970-01-01
        • 2019-01-08
        • 2021-11-18
        • 2014-04-27
        相关资源
        最近更新 更多