计算机睡眠后无法访问 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 容器列出了三个网络接口:docker0
、eth1
和 lo
。我没有运行 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
。将 之后,我能够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的主要内容,如果未能解决你的问题,请参考以下文章
记一次笨比事件,.NET5 api通过docker部署后始终无法访问
无法访问 jarfile - Elastic Beanstalk 上的 Docker