我在公共子网中有一台堡垒主机,我通常通过它访问私有子网中的主机。当我使用下面的命令在私有子网中创建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就可以做到这一点,那也很好。
我遗漏了什么?
发布于 2016-09-28 20:54:34
通过打开debug,我能够获得有关该问题的更多信息。本质上
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上创建了一个问题来跟进。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以允许从堡垒访问。但我想我需要调整一下。
发布于 2018-04-04 21:22:50
我在堡垒上安装了一个OpenVPN服务器(实际上是一个NAT网关)。然后,我的客户端连接到OpenVPN服务器。OpenVPN服务器推送一条路由,允许客户端访问私有网络上的内网工作。
这是透明的。我可以使用docker-machine在私有网络上创建节点。我甚至可以在我的客户端上启动docker并加入现有的群。
https://stackoverflow.com/questions/39735460
复制