Docker无法连接boot2docker,因为TCP超时。

64

我正在运行Mac OS 10.9.5(Mavericks),我按照https://docs.docker.com/installation/mac/的说明安装了Docker。

尽管boot2docker VM在后台运行,但当我运行Docker时,我收到一个超时错误消息。

nikhil@macbook ~> boot2docker status
running
nikhil@macbook ~> boot2docker ip

The VM's Host only interface IP address is: 192.168.59.103

nikhil@macbook ~> docker run hello-world
2014/11/01 01:01:31 Post https://192.168.59.103:2376/v1.15/containers/create: dial tcp 192.168.59.103:2376: i/o timeout
nikhil@macbook ~> docker search ubuntu
2014/11/01 01:02:40 Get https://192.168.59.103:2376/v1.15/images/search?term=ubuntu: dial tcp 192.168.59.103:2376: i/o timeout

我已经验证了Docker正在boot2docker VM中运行,并且我的端口是正确的。

nikhil@macbook ~> boot2docker ssh
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.3.1, build master : 9a31a68 - Fri Oct 31 03:14:34 UTC 2014
Docker version 1.3.1, build 4e9bbfa
docker@boot2docker:~$ sudo netstat -ntpl | grep docker
tcp        0      0 :::2376                 :::*                    LISTEN      629/docker

1
我今天也遇到了这个问题。我最近更新了vbox,不知道它们是否有关系。 - darethas
我甚至尝试重新安装它,但没有成功。 - nikhil
有关在Windows上使用boot2docker,请参见https://dev59.com/vWIj5IYBdhLWcg3wflMy#29303930。 - VonC
你好,我很好奇,在你遇到这个问题的时候,你是否正在运行思科 AnyConnect? - darethas
@treehau5 你好,我在遇到这个问题时安装了思科 AnyConnect,但我没有连接 VPN。 - nikhil
12个回答

64
我正在使用OS X v10.10(Yosemite)和Cisco Anyconnect(这两者似乎不适合使用boot2docker),以下步骤最终对我有用(感谢链接到GitHub的评论):
这些步骤将添加一个端口转发规则,并修改您的环境,使Docker指向127.0.0.1(而不是192.168.59.103或其他NATed IP地址)。
首先,需要安装boot2docker,但不要运行它。
如果它目前正在运行,请立即停止它:
boot2docker down

添加一条规则,将来自 127.0.0.1:2376 的流量转发到 boot2docker vm 上的端口 2376:

vboxmanage modifyvm "boot2docker-vm" --natpf1 "docker,tcp,127.0.0.1,2376,,2376"

启动boot2docker:

boot2docker up

设置默认的DOCKER环境变量:

$(boot2docker shellinit)

DOCKER_HOST变量覆盖为指向127.0.0.1

export DOCKER_HOST=tcp://127.0.0.1:2376

现在你应该能够运行docker命令了:
docker version

1
我在Mavericks上遇到了这个问题 - 罪魁祸首是思科Anyconnect。Docker在工作时运行良好,然后回家后一切都崩溃了。 - Rachel Sanders
是的!这对我有用!一切都运行得很好,直到我需要使用AnyConnect连接我的工作VPN,然后它就停止响应了。我使用的是OSX Yosemite操作系统。 - neurosnap
我不知道为什么这行得通,但确实行得通。 第一次进行干净安装boot2docker后,当运行docker run hello-world时,我收到了dial tcp:lookup index.docker.io:connection refused的错误。我没有安装Cisco AnyConnect或其他奇怪的VPN设置 - 只是OSX 10.10.3。 - Andrew
谢谢,这个解决方案对我在Yosemite 10.10.3上的问题非常有帮助。 - Giles Butler

57

我也遇到了这个问题,这里有一个临时解决方案。

首先打开VirtualBox并检查boot2docker VM上的网络设置,看看“host only”适配器的名称是什么。在我的情况下,它是vboxnet1; 对于您来说,可能是vboxnet0。

然后,运行以下命令:

sudo route -nv add -net 192.168.59 -interface vboxnet1

现在您应该能够运行Docker命令。

有关更多信息,请参见此问题

我注意到随着时间的推移,这个问题的一个共同点是Cisco anyconnect(包括我自己),不知道是否有用。


1
谢谢,这一次就解决了。 非常感谢。 - nikhil
@kxxoling,我在item2中成功运行了它。出了什么错误? - darethas
@treehau5,终于发现我一开始就是正确的,问题出在我的同事导出的Docker镜像上。 - Kane Blueriver
2
提醒一下,Docker 在我的电脑休眠前一直运行正常。但是当我重新启动后,遇到了这个问题,这个答案解决了我的困扰。 - Alan Cabrera
我按照提供的链接找到了一个解决方案,对我很有效:https://github.com/boot2docker/boot2docker/issues/392#issuecomment-62318587 - vhs
显示剩余2条评论

45

这是我为解决问题所做的步骤(我使用 OS X v10.10(Yosemite),并且被接受的答案对我无效):

  • boot2docker delete - 警告:这会删除您所有的Docker镜像。
  • 在VirtualBox中,转到VirtualBox(菜单)→ Preferences → Network → Host Only Networks
    • 删除主机唯一网络,然后重新添加它们
  • boot2docker init
  • boot2docker up

现在,通过iTerm2的OS X命令行,Docker对我有效。


5
只有在关闭AnyConnect的情况下才能使用此方法,同时我们可能需要添加一个警告,告知该方法会删除你所有的镜像。关于第二个问题,可以在这里找到解决方法:https://github.com/boot2docker/boot2docker/issues/392#issuecomment-46797422 - cbron
1
这对我有用,但我不需要删除我的主机网络。 - Grant Eagon
1
正如@cbron所说 - 只有在关闭Cisco AnyConnect时才能使用此方法。 - kellyfj
这是唯一对我有效的解决方案,虽然我没有使用任何 Cisco 相关设备,但我同时在 VirtualBox 中有 4 个 Vagrant 虚拟机。 - Gonzalo Serrano

6
这也发生在我的电脑上,之前的回答都没有解决问题。今天,由于同事的建议,我没有先启动VPN连接。我重新启动了电脑,并从头开始使用Docker。
boot2docker init
boot2docker up
$(boot2docker shellinit)
docker run hello-world

它按预期工作!

我发现Florian Rosenberg的this post非常有用。我详细阅读了它,但我认为他在第一部分中建议的大部分内容已经纳入了最新版本的boot2docker中。但其中深刻的一点是“连接到VPN会导致问题”。

它建议查找拒绝任何东西的防火墙规则。因此,在没有启动VPN的情况下,我查找了这个规则,但并没有找到它。果然,一旦我启动了VPN,我就遇到了以下(不同的)错误...

docker run hello-world
2014/11/13 11:11:18 Post https://192.168.59.103:2376/v1.15/containers/create: dial tcp 192.168.59.103:2376: permission denied

我检查了防火墙规则,果然添加了一条新规则...

sudo ipfw -a list | grep "deny ip"
00411    1      64 deny ip from any to any 

我使用以下命令删除了防火墙规则:

sudo ipfw delete 00411

我能够从OS X命令行与Docker进行交互。

这也可以帮助那些遇到此问题的人。+1 - nikhil

5

好的,这种情况也发生在我身上。

首先,设置环境变量是必要的。但是,即使设置了环境变量,我仍然不断收到I/O超时错误。

因此,我没有通过运行应用程序包(单击boot2docker图标)来启动它,而是从命令行启动它。

我首先执行了以下操作:

$boot2docker init

这就说吧,虚拟机已经在运行了。然后我继续尝试启动它。
$boot2docker start

这是开始。

您可以通过运行以下命令进行验证

$boot2docker info

它会打印有关您运行实例的JSON。然后,您可以通过SSH登录并运行:
$boot2docker ssh
$docker run hello-world

就是这样。


4

我在运行Cisco AnyConnect后遇到了这个问题。即使我关闭AnyConnect,问题仍然存在。

@treehau5的回答是有效的,但是执行boot2docker poweroff,然后使用Activity Monitor杀死AnyConnect留下的ciscod也对我有用。然后我打开了一个新的终端窗口,正常启动了boot2docker,Docker命令就可以正常工作了。


有一个正在运行的守护进程:'/opt/cisco/anyconnect/bin/vpnagentd -execv_instance',即使我使用“kill -9”命令杀死它,它也会自动重新启动...你知道如何停止这个守护进程吗?是通过launctl吗? - Nicholas Terry
用户名称不再是"treehau5"。您能否添加到所引用答案的直接链接(由用户"darethas"、"Ashish Juyal"或"wlan0"提供)? - Peter Mortensen

3

对我来说很容易。我升级了VirtualBox,这个问题就解决了。


我的情况也适用。 - pfac

2

我尝试了treehau5的方法,但是没有成功。我将VirtualBox的Network设置更改为boot2docker VM设置 - 'host-only Adapter's Promiscuous mode',并将其设置为“Allow All”。


用户名不再是“treehau5”。这个问题指的是哪个答案? - Peter Mortensen

0

当我遇到类似问题时,下面是适用于我的解决方法。请确保您已经升级了VirtualBox, 然后:

  1. boot2docker stop
  2. boot2docker init
  3. boot2docker start; eval "$(boot2docker shellinit)"

为了谨慎起见,请检查$DOCKER_HOST是否与$(boot2docker ip)匹配。 我怀疑有太多问题出现了,因为一开始的时候,$DOCKER_HOST某种程度上变成了未设置的状态。

该问题及相关讨论可在GitHub问题页面here中找到 - 似乎这通常只是VirtualBox不稳定的情况。


0

我从VirtualBox首选项中删除了vboxnet0,并初始化了第二个boot2docker VM(boot2docker --vm="boot2docker-vm2" init),以重新创建具有正确设置的vboxnet0。

之后,一切似乎恢复正常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接