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

标签 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 代理是我的最佳选择?

最佳答案

在 docker documentation对于临时端口范围,他们表示:

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

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

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

关于docker - 有没有办法重置 Docker 从端口范围分配的端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62199203/

相关文章:

docker - Laradock Nginx:无法访问此网站

wordpress - Docker 编写 php-fpm、nginx、mysql 并在 nginx 上使用 wp-cli

build - Docker build 没有网络,但是 docker run 有

超出 Docker 内存限制

docker - 服务访问 127.0.0.1 上的另一个服务?

node.js - Docker 不会将文件更改从主机传播到容器

docker - 恢复VM后无法连接到docker

python - 同一个 docker-compose 中的 Celery 和 Flask

docker - 如何启动容器取决于Docker Compose中的其他容器服务?

django - 使用 webpackDevServer 对 Django 进行 Docker 化