容器删除后,主机映射给容器的端口为何并立即未回收利用?

dhflxejv 2014-07-11 02:46:17
主机将自动给容器的22和80映射两个端口,如:
0.0.0.0:49155->22/tcp, 0.0.0.0:49156->80/tcp
当该容器停止并且删除后,49155和49156这两个主机端口应该被释放,留给新的容器使用,但实际此时再新建容器映射端口发现,这两并未使用,而是系统自动分配这俩端口后面新的端口,比如49157...
只有docker服务重启后原来空出来的端口才会被分配。在三台不同的docker主机上做实验都是如此,貌似不是我配置的问题,不知大家的环境如何?求解!
...全文
218 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyewzlsu 2014-07-11
  • 打赏
  • 举报
回复
通过查看源码docker / runtime / networkdriver / portallocator / portallocator.go可以知道 docker的动态范围端口从 49153-65535 const ( BeginPortRange = 49153 EndPortRange = 65535 ) 分配端口的方式顺序递增,到最大值后,从头开始循环 func nextPort(proto string) int { c := currentDynamicPort[proto] + 1 if c > EndPortRange { c = BeginPortRange } currentDynamicPort[proto] = c return c } container销毁时,会释放端口 func ReleasePort(ip net.IP, proto string, port int) error { ....... allocated := defaultAllocatedPorts[proto] allocated.Remove(port) ....... } findNextPort方法从nexPort方法返回的值中,挑一个没被使用的,如果找一圈没找到,抛出ErrAllPortsAllocated异常。 func findNextPort(proto string, allocated *collections.OrderedIntSet) (int, error) { port := nextPort(proto) startSearchPort := port for allocated.Exists(port) { port = nextPort(proto) if startSearchPort == port { return 0, ErrAllPortsAllocated } } return port, nil } 综上,端口实际上已经释放,但不会马上再使用,除非端口资源非常紧张。 所以你看到的是正常情况,不用但心(前提是你需要用v0.10以上版本)。 循环使用端口这个特性是v0.10版本加上的。 如果低于这个版本,端口号到EndPortRange后,就只能重启Docker了

1,163

社区成员

发帖
与我相关
我的任务
社区描述
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux 机器上,也可以实现虚拟化。
社区管理员
  • Docker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧