计算机睡眠后无法访问 Docker

Posted

技术标签:

【中文标题】计算机睡眠后无法访问 Docker【英文标题】:Docker unreachable after computer sleep 【发布时间】:2015-12-09 10:18:06 【问题描述】:

我刚刚在 Windows 10 上使用 docker-toolbox 1.8.2 安装了 docker。

由于this issue,我不得不使用这些命令重新创建 docker 映像

docker-machine rm default
docker-machine --native-ssh create -d virtualbox default

之后它一直工作正常,除了一个问题:

当 PC 进入睡眠状态然后再次唤醒时,docker 命令无法再连接。示例:

> docker images
An error occurred trying to connect: Get https://192.168.99.100:2376/v1.20/images/json: 
dial tcp 192.168.99.100:2376: ConnectEx tcp: A connection attempt failed because the 
connected party did not properly respond after a period of time, or established connection 
failed because connected host has failed to respond.

但是docker-machine 将机器列为正在运行:

> docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM
default   *        virtualbox   Running   tcp://192.168.99.100:2376

我还可以在 VirtualBox 中确认 VM 屏幕似乎处于活动状态。

我试过启动和停止机器,但没有帮助

C:\x> docker-machine stop default
C:\x> docker-machine start default
Starting VM...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
C:\x> docker-machine env default --shell=powershell

具有讽刺意味的是,最后一个命令挂起,所以我从来没有得到任何环境设置。

唯一有用的是重新启动整个 PC。但这应该是不必要的吧?

我也将其发布为an issue on the docker github repository,但已关闭。 A related issue seems to be this one,但没有针对 Windows 发布解决方法或解决方案。

【问题讨论】:

容器是否连接到与操作系统使用的网络接口不同的网络接口?我在运行 Hyper-V 虚拟机时注意到,在主机从睡眠状态恢复后,它只会唤醒主网络接口,而不是我为虚拟机保留的网络接口。诀窍是禁用然后启用该网络接口。 @Petrik 容器列出了三个网络接口:docker0eth1lo。我没有运行 Hyper-V。我测试了在主机 PC 上禁用/启用 Internet 网络接口,但这没有帮助。 Docker 在主机 PC 上创建了 4 个(四个!)网络接口。 我唯一能想到的就是禁用/启用主机 PC 上的 docker 接口。不知道还有什么可能。 【参考方案1】:

经过与 VirtualBox + Docker Toolbox 的斗争,我终于找到了方法,如何让 Docker 再次工作(即使不重新启动所有容器):

    从睡眠中唤醒电脑 试试docker images(不行) 打开 VirtualBox -> 以保存状态关闭虚拟机 (CTRL+V) 再次运行您的虚拟机 再次尝试docker images(现在应该可以了)

请注意:所有步骤仅在 VirtualBox 中!运行docker-machine restart default 将创建另一个仅主机适配器,这是您不想要的。如果您还是这样做了,请删除所有额外创建的适配器(文件->首选项->VirtualBox 上的网络),然后按照步骤 1-5 操作。

【讨论】:

不错。这对我有用。想知道您是如何决定选择 VirtualBox 而不是 Docker 的吗? 只是一个疯狂的猜测 - 有点像老式 90 年代的冒险游戏,使用“一切都在一切”。这神奇地起作用了。 为我工作。谢谢! 在 Hyper-V 和 Windows 10 上为我工作。打开 Hyper-V > 停止 MobyLinuxVM > 设置 > 自动停止操作 > 设置为“保存”。【参考方案2】:

我在 Windows 8.1 上遇到了完全相同的症状...问题是它实际上并不是特定于 docker 的问题,而是 Windows 如何在睡眠后管理 VirtualBox 网络适配器(我认为...)。就我而言,罪魁祸首是网络适配器的地址在睡眠后变得私有(它们变成了 169.* 地址)。

感谢给我这个想法的人:http://lyngtinh.blogspot.ca/2011/12/how-to-disable-autoconfiguration-ipv4.html

修复:

    以管理员身份启动命令提示符 找出“有用的”网络适配器:ipconfig /all。对我来说有用的是那些标有“VirtualBox Host-Only Ethernet Adapter”的没有私有 ip(不是以 169.* 开头)的。 运行此命令并记下有用的 VirtualBox 网络适配器的“Idx”:netsh interface ipv4 show inter。 运行此命令以禁用 IP 自动配置:netsh interface ipv4 set interface <idx> dadtransmits=0 store=persistent。将 替换为上一步中找到的每个索引。 重启 Windows

之后,我能够docker-machine start default,然后docker-machine env default --shell cmd,让电脑进入睡眠状态,唤醒并再次运行docker-machine env default --shell cmd

【讨论】:

非常好。我一直在努力解决这个问题【参考方案3】:

我发现删除“仅主机适配器”(File->Preferences->VirtualBox 上的网络)并重新启动 docker-machine 会有所帮助。

不是真正的解决方案。但可能比重新启动计算机更好。

【讨论】:

迄今为止最好的解决方法。它还让我清理了网络列表,我有四个 VirtualBox 网络,但似乎只有一个真正使用过。【参考方案4】:

在这里尝试了所有其他答案,并取得了不同但不一致的成功,在此问题发生后,以下似乎可靠地将它带回给我。

打开一个powershell /命令窗口(如果我在以管理员身份打开的powershell窗口中运行所有docker-machine命令,我会最成功,我不知道这是否重要)然后运行(其中“dev”是您的 docker 机器实例的名称):

docker-machine ssh dev

然后在打开的终端上,运行:

sudo shutdown -r now

当机器重启时,似乎刷新了网络并正常工作。但是请注意,简单地运行 docker-machine restart dev 对我来说没有有同样的效果。

您的机器需要在运行 ssh 之前运行,所以如果它没有运行,请在尝试 SSH 之前执行docker-machine start dev

【讨论】:

【参考方案5】:

在 Windows 8.1 和 docker toolbox 1.12.0 上遇到同样的问题 以上解决方案都不适合我。

[编辑]

找到了另一种在系统唤醒后让 docker 工作的方法:

在 docker Quickstart Terminal 窗口中,停止 docker 进程 Ctrl-C(如果它仍在运行) 运行命令docker-compose down 使用docker-machine stop default 关闭泊坞窗 退出终端窗口Ctrl-D 再次运行 Quickstart Terminal 并执行您需要的所有后续步骤。

【讨论】:

【参考方案6】:

这对我有用,在 Windows 主机上。

将您的网络适配器配置为

1) 允许网络适配器唤醒计算机,

2) 允许魔术包唤醒计算机,

3) 允许 IPV6

http://www.worldstart.com/dropped-internet-connection-in-sleep-mode/

此外,在虚拟机网络设置中,转到高级,并允许 VM 机器混杂模式,或允许所有

【讨论】:

以上是关于计算机睡眠后无法访问 Docker的主要内容,如果未能解决你的问题,请参考以下文章

Docker-无法访问 jar 文件 [关闭]

记一次笨比事件,.NET5 api通过docker部署后始终无法访问

docker-compose部署mysql无法访问

无法访问 jarfile - Elastic Beanstalk 上的 Docker

Docker的RabbitMQ启动后,无法通过浏览器访问15672端口打开界面

Docker的RabbitMQ启动后,无法通过浏览器访问15672端口打开界面