【发布时间】:2019-10-28 22:25:37
【问题描述】:
如果以下任何问题属于“愚蠢的问题”类别,请原谅我 - 仍然在讨论 docker 的工作方式 - 只开了/关了一个月。
我有一些 Windows docker 主机。当 docker 启动我们的容器时,它会创建一个 nat 网络供容器进行通信。这包括创建一个 Hyper-v 虚拟适配器作为网络网关,并为 dns 和 139 开放端口 53 用于 SMB...
当这些容器被停止、删除并且网络被修剪时,它只会杀死 docker 网络 - 它永远不会返回并破坏它创建的网络适配器,它们会继续监听 53 和 139。
通常这不是什么大问题,但似乎当主机已经启动足够长的时间,并且其中一堆已经建立时,我们开始获得无法访问的新容器并在其中看到类似的错误日志:
Resolver Setup/Start failed for container <CONTAINER NAME>, "error in opening name server socket listen udp 172.22.32.1:53: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted."
我在这里的假设是它正在尝试创建一个新网络,但该地址已经存在一个网络,所以它正在轰炸......
重新启动 docker 服务会清除所有这些陈旧的网络,但它似乎无法自行清理。
还有其他人遇到过这样的问题吗?这是期望的行为吗?我可以进行某种配置更改以强制其清理吗?我的任何假设是否完全偏离了基础?
如果您需要更多信息,请告诉我。
谢谢!
【问题讨论】:
-
您确定该端口尚未被其他进程占用。不能说 Windows,但我对 RHEL 做类似工作没有任何问题。
-
好像不是这样。很难诊断,因为 docker 容器使用的端口不会显示在 windows 上的 netstat 中,但我们看不到这些端口上运行的其他任何东西。
-
docker run -d --name $name --restart=unless-stopped -p $hostPort:4200 $name是我的绑定方式。希望你也这样做。在 Windows 上,您可以netstat -a -n -o获取进程 ID,然后在 Windows 上的任务管理器(详细信息选项卡)以关联 PID。 -
也可以尝试
docker ps看看是否有任何东西在该端口上运行 -
绝对没有其他 docker 容器在相关端口上运行。您实际上可以将 -b 标志扔到 netstat 中,它会告诉您保持它打开的服务。无需在任务管理器中关联。 netstat 报告的唯一端口是 docker 接口地址本身;不是集装箱港口。这些根本没有暴露于 netstat - 这使得故障排除非常困难/烦人。
标签: docker docker-compose docker-for-windows