当我运行 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 或最近的可用值吗?
我花了很多时间才找到答案,但docker并没有什么作用。
我深入docker-ce研究源文件,发现它使用了一个RequestPortInRange简单地给出下一个可用端口的函数。
现在,当您运行docker run -d -P nginx命令时,docker 会为您提供“临时范围”中的第一个可用端口,即 32768 - 61000 (正如您所指出的)。
一旦您销毁/停止容器,它应该恢复到32768,但是,它会转到下一个可用端口,即32769(至少在我的计算机上)。
因此,我认为在容器被销毁后,任何操作系统可能需要一段时间linux才能收回端口,但netstat -lntu确认该端口不再使用。
所以,我的理论是(这可能是完全错误的,在这种情况下我很高兴得到纠正),它创建了一个PortAllocator事物的实例,因此它有一个状态。因此,下次docker run -P ...调用时,它将前往下一个可用端口。即使您创建其他容器,它docker engine也会为您提供下一个可用端口,而不是之前可用的端口,这一事实也证实了这一点。
我希望我回答了你的问题,但我对此了解不多golang,请原谅任何术语错误。
| 归档时间: |
|
| 查看次数: |
1015 次 |
| 最近记录: |