我们正在运行带有 Docker 的 RHEL 7 VM 来托管几个内部服务。上次我跑去docker-compose up
启动一个新的 Docker 容器时,我失去了与服务器的 SSH 连接,也无法重新建立它。
一位同事能够诊断出罪魁祸首是一个新的 Docker 网络,该网络是作为执行docker-compose
命令的一部分而创建的,其 IP 范围恰好与我连接的机器所在的那个重叠。我的同事能够通过关闭 Docker 守护程序并删除由 Docker 创建的指向相关 docker 网络网桥的静态路由来重新获得我的访问权限。他之所以能够做到这一点,是因为他在同一子网中拥有另一台机器,他可以通过该机器进行连接。
现在我遇到的问题是,虽然能够再次连接到服务器,但我无法启动 Docker 守护程序,除非它还恢复了行为不端的网络并再次切断我的连接。但是,我也不能先使用docker network rm
或docker network prune
删除网络,因为这些命令仅在 Docker 守护程序正在运行时才有效。我无权访问 IP 与所述 IP 范围不冲突且具有访问我要恢复的机器所需的防火墙规则的机器。
有什么方法可以优雅地解决这种情况并让 Docker 守护程序再次运行而不会失去对机器的访问权限?如有必要,删除与所述网络相关的容器是没有问题的。如果我能首先让机器恢复工作状态,我会很高兴。
我从这篇文章中了解到,可以配置 Docker 允许使用的 IP 范围,一旦事情重新启动并运行,我肯定会这样做。这可能已经自行解决了问题,还是只会影响 Docker 未来创建的网络?
我找到了一个可以说是非正统的解决方案,但它确实有效:我编写了一个脚本来启动 Docker 守护程序,删除有问题的网络,记录哪些网络被删除,然后再次停止 Docker 守护程序,以防万一它不起作用。这样,即使我的 SSH 会话断开,我也可以让该脚本在后台运行并执行必要的命令。这样我就可以回来,检查日志以查看有问题的网络是否消失,最后再次启动 docker Daemon 而不会被踢出。
这不是最优雅的脚本,所以我需要做一些清理工作,但 Docker 又开始工作了。