【发布时间】: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 down 和 docker-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