【问题标题】:Docker can't connect to boot2docker because of TCP timeout由于 TCP 超时,Docker 无法连接到 boot2docker
【发布时间】:2014-11-01 05:07:03
【问题描述】:

我正在运行Mac OS 10.9.5(小牛队),我已经按照https://docs.docker.com/installation/mac/ 安装了 Docker。 即使 boot2docker 虚拟机在后台运行,我在运行 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 虚拟机中运行,并且我的端口是正确的。

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

【问题讨论】:

  • 我今天也遇到了这个问题。我最近更新了vbox,不知道它们是否相关。
  • 我什至尝试重新安装它但没有任何成功。
  • 对于 Windows 上的 boot2docker,请参阅 stackoverflow.com/a/29303930/6309
  • 您好,只是好奇,您在遇到这种情况时在哪里运行 cisco anyconnect?
  • @treehau5 嗨,当我遇到这种情况时,我安装了 cisco anyconnect,但我没有连接到 VPN。

标签: osx-mavericks docker boot2docker


【解决方案1】:

我正在使用OS X v10.10 (Yosemite) 和 Cisco Anyconnect(这对于使用 boot2docker 来说显然是一个糟糕的组合),以下终于为我工作了(感谢linked GitHub issue comment):

这些步骤将添加端口转发规则并修改您的环境以使 Docker 指向 127.0.0.1(而不是 192.168.59.103 或其他经过 NAT 的 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

【讨论】:

  • 我在 Mavericks 遇到了这个问题——罪魁祸首是 Cisco Anyconnect。 Docker 工作正常,然后回到家,一切都坏了。
  • 是的!这对我有用!在我需要使用 anyconnect 连接到我工作的 VPN 之前,我的一切运行良好,然后它停止响应。我在 OSX Yosemite 上。
  • 我不知道为什么会这样,但确实如此。第一次执行clean install of boot2docker 后,我在运行docker run hello-world 时得到dial tcp: lookup index.docker.io: connection refused。我没有 Cisco AnyConnect 或任何其他奇怪的 VPN 设置——只有 OSX 10.10.3。
  • 谢谢这是在 Yosemite 10.10.3 上为我修复的那个
【解决方案2】:

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

首先,打开 VirtualBox 并检查 boot2docker 虚拟机上的网络设置,以查看 host only 适配器的名称。就我而言,它是 vboxnet1;对你来说,它可能是 vboxnet0。

然后,应用这个命令:

sudo route -nv add -net 192.168.59 -interface vboxnet1

现在您应该可以运行 Docker 命令了。

更多信息请参见this issue

随着时间的推移,我注意到这个问题的一个共同点是 Cisco anyconnect(包括我在内),因为它很有价值。

【讨论】:

  • 谢谢,这一步修复了它。非常感谢。
  • 我应该在 docker 还是我的 iTerm shell 中运行这个命令?要么会给我一个错误。
  • @kxxoling 我在 item2 中运行得很好。错误是什么?
  • @treehau5 终于,我发现我一开始是对的,问题是我同事导出的 docker 镜像。
  • 仅供参考,在我的笔记本电脑进入睡眠状态之前,docker 对我来说工作正常。然后我遇到了这个答案解决的问题。
【解决方案3】:

这是我为解决此问题所做的(我使用 OS X v10.10(优胜美地)并且接受的答案对我不起作用):

  • boot2docker delete - 警告:这会删除你所有的 Docker 镜像。
  • 在 VirtualBox 中,转到 VirtualBox(菜单)→ 首选项 → 网络 → 仅主机网络
    • 删除仅主机网络,然后我重新添加它们
  • boot2docker init
  • boot2docker up

现在 Docker 可以通过 iTerm2 从 OS X 命令行为我工作。

【讨论】:

  • 这仅在您关闭 anyconnect 时有效,而且我们可能希望添加一条警告,说明此操作会删除您的所有图像。这里有第二部分的修复:github.com/boot2docker/boot2docker/issues/…
  • 这对我有用,但我不需要删除我的仅主机网络。
  • 正如@cbron 所说 - 这仅在您关闭 Cisco AnyConnect 时有效
  • 这是唯一对我有用的解决方案,我没有使用任何 Cisco 的东西,但我同时在 VirtualBox 中有 4 个 Vagrant VM。
【解决方案4】:

这也发生在我身上,之前的答案都没有解决这个问题。

今天,由于同事的建议,我没有先启动我的 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
【解决方案5】:

好的,我也遇到过这种情况。

首先,需要设置环境变量。但是,即使在那之后,我仍然不断收到 I/O 超时错误。

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

我第一次执行,

$boot2docker init

这表示,VM 已经在运行了。

然后我继续尝试启动它。

$boot2docker start

这就开始了。

你可以通过运行来验证它

$boot2docker info

它会打印一个关于您正在运行的实例的 JSON。

然后,你可以通过 ssh 进入并运行

$boot2docker ssh
$docker run hello-world

就是这样。

【讨论】:

    【解决方案6】:

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

    @treehau5 的答案有效,但执行 boot2docker poweroff,然后使用活动监视器,杀死 AnyConnect 留下的 ciscod 也对我有用。然后我打开一个新的终端窗口并正常启动 boot2docker,然后 Docker 命令运行正常。

    【讨论】:

    • 有一个守护进程正在运行:'/opt/cisco/anyconnect/bin/vpnagentd -execv_instance' 会自动启动备份,即使我杀死 -9 它......任何线索如何阻止它恶魔。是通过 launctl 吗?
    • 用户名不再是“treehau5”。您能否将直接链接添加到引用的答案(用户“darethas”、“Ashish Juyal”或“wlan0”)。
    【解决方案7】:

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

    【讨论】:

    • 也适用于我的案例。
    【解决方案8】:

    我尝试了treehau5的方法,但没有奏效。我将 VirtualBox 的 boot2docker 虚拟机设置的网络设置 - 'host-only Adapter's Promiscuous mode 更改为 'Allow All'。

    【讨论】:

    • 用户名不再是“treehau5”。参考了哪个答案?
    【解决方案9】:

    当我遇到类似的障碍时,这对我有用。确保您已升级 VirtualBox,然后:

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

    然后,为了理智起见,检查$DOCKER_HOST 是否与$(boot2docker ip) 匹配。我怀疑我有很多事情要做,就像我刚开始时一样,$DOCKER_HOST 不知何故变得不稳定。

    可以在 GitHub 问题页面 here 中找到该问题和一些讨论 - 它看起来似乎通常只是 VirtualBox 不稳定的一个案例。

    【讨论】:

      【解决方案10】:

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

      在这之后,事情似乎又恢复了正常。

      【讨论】:

        【解决方案11】:

        在我的情况下,我只需要重新启动我的 Mac 主机,问题就消失了!我没有连接到 VPN 或任何类似的东西。我不确定发生这种情况的原因。

        【讨论】:

          【解决方案12】:

          检查您的 DOCKER_HOST 环境变量。它应该指向:

          export DOCKER_HOST=tcp://192.168.59.103:2376
          

          【讨论】:

          • 是的,设置正确。正如您从命令的输出中看到的那样,docker 命令正确地选择了它。您还有其他建议吗?
          • 你可以尝试重启你的 boot2docker。
          • 也试过几次,还是不行。
          • vboxVM 每次启动时都会获得一个新的 ip。它在 192.168.0.0/16 范围内。你不能总是导出 DOCKER_HOST=tcp://192.168.59.103:2376
          猜你喜欢
          • 2014-02-09
          • 2012-10-16
          • 1970-01-01
          • 2011-10-04
          • 1970-01-01
          • 1970-01-01
          • 2016-11-15
          • 1970-01-01
          • 2016-03-23
          相关资源
          最近更新 更多