当我运行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还是最近的可用状态?
答案 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
的了解不多,因此,请原谅术语中的任何错误。