有没有办法重置Docker从端口范围分配的端口?

时间:2020-06-04 16:06:52

标签: docker docker-compose

上下文:

将容器端口映射到端口范围时,即使“较低”的端口已经可用,Docker似乎总是在每次容器运行时增加分配的端口。

为了说明我的观点,作为一个最小的可复制示例,我将使用nginxdemos图像。考虑具有以下内容的docker-compose.yml

version: '3'

services:
  hello:
    image: nginxdemos/hello
    ports:
      - "8080-8085:80"

使用scale标志时,端口范围很有用,因此应保留。现在,当我执行docker-compose downdocker-compose up时,我希望端口重置为范围(8080)内的第一个可用端口,但这不会发生。

$ docker-compose up -d
$ docker port nginxdemos_hello_1
80/tcp -> 0.0.0.0:8080
$ docker-compose down
$ docker-compose up -d
$ docker port nginxdemos_hello_1
80/tcp -> 0.0.0.0:8081

相反,Docker在某个地方保留了一个计数器,只是增加了它。据我所知,计数器仅在以下情况下重置:

  • 计数器超出范围限制
  • 重新启动Docker守护程序
  • 端口映射已更改

此行为并非特定于docker-compose,因为docker run也会发生同样的情况。在不同的主机操作系统之间似乎也保持一致。

$ docker run --rm --name hello -d -p "8080-8085:80" nginxdemos/hello
$ docker port hello
80/tcp -> 0.0.0.0:8082
$ docker kill hello
$ docker run --rm --name hello -d -p "8080-8085:80" nginxdemos/hello
$ docker port hello
80/tcp -> 0.0.0.0:8083

问题:

对于快速测试,这可能有点烦人,因为始终需要检查正在使用的端口。

我知道我可以使用HA代理从中抽象出我。但是我只是在想:假设这是正常的行为,是否有一种方法可以使用某种标志来重置此计数器,即不更改端口映射并且不重新启动Docker守护程序?还是HA代理是我最好的选择?

1 个答案:

答案 0 :(得分:1)

在docker documentation中,对于临时端口范围,他们说:

$ docker run -d -p 8000-9000:5000 training/webapp python app.py

这会将容器中的端口5000绑定到主机上介于8000和9000之间的随机可用端口。

即使他们说这是随机的,但根据您在问题中显示的场景以及我在docker网络上的经验,我几乎可以肯定有一种反制。我创建了一个使用docker作为基础设施的CI管道。我使用了HAProxy,运行非常顺利。我强烈推荐HAProxy。