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

时间:2018-11-12 16:03:29

标签: docker

当我运行docker命令时

docker run -d -P nginx

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

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

docker如何以及何时回收端口?它会回到32768还是最近的可用状态?

1 个答案:

答案 0 :(得分:3)

我花了很多时间才能找到答案,但是docker并没有做很多事情。

我深入到docker-ce源文件中,发现它使用了RequestPortInRange函数,该函数仅给出下一个可用端口。

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

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

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

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

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