由于tcp超时,docker无法连接到boot2docker

nik*_*hil 63 docker osx-mavericks boot2docker

我正在运行Mac OS 10.9.5,我已经按照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
Run Code Online (Sandbox Code Playgroud)

我已经验证了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
Run Code Online (Sandbox Code Playgroud)

小智 64

我正在使用OSX Yosemite和Cisco Anyconnect(显然使用boot2docker这是一个糟糕的组合),以下内容最终对我有用(感谢链接的GitHub问题评论):

这些步骤将添加端口转发规则并修改您的环境以使docker指向127.0.0.1(而不是192.168.59.103或其他NATed IP).

首先 - 需要安装boot2docker但不运行.

如果它当前正在运行 - 现在停止它:

boot2docker down
Run Code Online (Sandbox Code Playgroud)

添加规则以将流量从转发127.0.0.1:23762376boot2docker vm上的端口:

vboxmanage modifyvm "boot2docker-vm" --natpf1 "docker,tcp,127.0.0.1,2376,,2376"
Run Code Online (Sandbox Code Playgroud)

启动boot2docker:

boot2docker up
Run Code Online (Sandbox Code Playgroud)

设置默认的DOCKER环境变量:

$(boot2docker shellinit)
Run Code Online (Sandbox Code Playgroud)

覆盖DOCKER_HOST变量以指向127.0.0.1:

export DOCKER_HOST=tcp://127.0.0.1:2376
Run Code Online (Sandbox Code Playgroud)

现在您应该能够运行docker命令:

docker version
Run Code Online (Sandbox Code Playgroud)


dar*_*has 57

我也有这个问题,这是临时解决方案.

首先,打开virtualbox并检查boot2docker vm上的网络设置,以查看host only适配器的名称.就我而言,它是vboxnet1; 对你而言,它可能是vboxnet0.

然后,应用此命令:

sudo route -nv add -net 192.168.59 -interface vboxnet1
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:我注意到这个问题的一个共同点是cisco anyconnect(包括我),fwiw

  • 仅供参考,码头工作对我来说很好,直到我的笔记本电脑进入睡眠状态.然后我遇到了这个答案解决的问题. (2认同)

小智 45

这是我为解决这个问题所做的工作(我使用OSX Yosemite并且接受的答案对我不起作用):

  • boot2docker delete- 警告:这会删除所有泊坞窗图像.
  • 在Virtualbox中,转到VirtualBox(菜单)=>首选项=>网络=>仅主机网络
    • 删除仅主机网络,然后重新添加它们
  • boot2docker init
  • boot2docker up

现在,Docker通过iTerm2从OS X命令行工作.

  • 这仅在您关闭anyconnect时有效,而且我们可能还要添加关于删除所有图像的警告.这是第二部分的修复:https://github.com/boot2docker/boot2docker/issues/392#issuecomment-46797422 (5认同)

小智 6

这也发生在我身上,以上都没有解决问题.

今天,感谢同事的建议,我没有先启动我的VPN.我重新启动了我的机器,并从头开始使用docker.

boot2docker init
boot2docker up
$(boot2docker shellinit)
docker run hello-world
Run Code Online (Sandbox Code Playgroud)

按预期工作!

我发现Florian Rosenberg的这篇文章很有用.我详细阅读了它,但我认为他在第一部分中提出的大部分内容已被考虑到最新版本的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
Run Code Online (Sandbox Code Playgroud)

我检查了防火墙规则,确定添加了新规则... sudo ipfw -a list | grep"deny ip"00411 1 64拒绝ip从任何到任何

一旦我删除了防火墙规则:sudo ipfw delete 00411

我能够从OSX命令shell与docker交谈.


小智 5

好的,所以这也发生在我身上.

首先,设置环境变量是必要的.但是,之后,即使在那之后我仍然会收到i/o超时错误.

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

我第一次执行,

$boot2docker init
Run Code Online (Sandbox Code Playgroud)

这就是说,VM已经运行了.

然后我继续尝试启动它.

$boot2docker start
Run Code Online (Sandbox Code Playgroud)

这开始了.

您可以通过运行来验证它

$boot2docker info
Run Code Online (Sandbox Code Playgroud)

它会打印有关正在运行的实例的JSON.

然后,你可以进入它并运行

$boot2docker ssh
$docker run hello-world
Run Code Online (Sandbox Code Playgroud)

而已.希望能帮助到你.