docker如何自动为容器分配和回收端口

vid*_*uch 3 docker

当我运行 docker 命令时

docker run -d -P nginx
Run Code Online (Sandbox Code Playgroud)

docker 将运行并自动为 nginx 的端口 80 分配端口。如果我停止映像并再次启动它,则会为 nginx 分配一个新端口(通常是下一个可用端口)。

据我发现,端口分配的范围基于临时端口范围,在 docker 情况下默认为 32768 - 61000。(https://docs.docker.com/v17.09/engine/userguide/networking/default_network/binding / )

docker 如何以及何时回收端口?它会返回到 32768 或最近的可用值吗?

sci*_*cho 6

我花了很多时间才找到答案,但docker并没有什么作用。

我深入docker-ce研究源文件,发现它使用了一个RequestPortInRange简单地给出下一个可用端口的函数。

现在,当您运行docker run -d -P nginx命令时,docker 会为您提供“临时范围”中的第一个可用端口,即 32768 - 61000 (正如您所指出的)。

一旦您销毁/停止容器,它应该恢复到32768,但是,它会转到下一个可用端口,即32769(至少在我的计算机上)。

因此,我认为在容器被销毁后,任何操作系统可能需要一段时间linux才能收回端口,但netstat -lntu确认该端口不再使用。

所以,我的理论是(这可能是完全错误的,在这种情况下我很高兴得到纠正),它创建了一个PortAllocator事物的实例,因此它有一个状态。因此,下次docker run -P ...调用时,它将前往下一个可用端口。即使您创建其他容器,它docker engine也会为您提供下一个可用端口,而不是之前可用的端口,这一事实也证实了这一点。

我希望我回答了你的问题,但我对此了解不多golang,请原谅任何术语错误。