【问题标题】:Is there a way to reset the port Docker allocates from a port range?有没有办法重置 Docker 从端口范围分配的端口?
【发布时间】:2020-06-05 00:28:45
【问题描述】:

上下文:

当将容器端口映射到端口范围时,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 代理是我的最佳选择?

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    临时端口范围的 docker documentation 中,他们声明:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多