如何管理大量端口?

如何管理大量端口?

我正在运行很多服务(其中大多数是 docker 管理的)。我很难管理所有服务的端口号。当我想要启动一个新的例如 HTTP 服务器时,问题就出现了。我必须寻找一个尚未被其他服务占用的端口号。目前,当我想要启动一个新服务器时,我会查找所有已占用的端口,docker ps例如,已占用的端口是 8001、8002、8003……8051,那么我会分配端口 8052。它运行良好,直到某些服务暂时停止,因此不会出现在中docker ps,我将其端口分配给新服务,当旧服务恢复时,我遇到端口冲突。

我已经使用 Nginx 作为反向代理,将我的服务器暴露给公共网络。但这并不能解决我的问题。我仍然必须以某种方式找到最新的未使用的端口号,在这种情况下,单一事实来源也不是nginx.confdocker ps

有没有管理端口的解决方案?一些注册表?

答案1

当您创建容器时,让 Docker 为您找到一个空闲的端口。

文档

您可以指定一个主机端口范围来绑定容器端口,该范围与默认临时端口范围不同:

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

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

随后您可以使用 获取暴露的端口docker inspect,例如像这样:

docker inspect --format '{{ range .HostConfig.PortBindings }}{{ range . }}{{ . }}{{ end }}{{ end }}' container
{127.0.0.1 8095}

我的测试容器的配置:

"PortBindings": {
    "8080/tcp": [
        {
            "HostIp": "127.0.0.1",
            "HostPort": "8095"
        }
    ]
}

答案2

将我的答案从原始帖子中移出

对于基于 http 的服务,使用反向代理可以更轻松地完成此操作。您有一个服务在端口 80/443 上侦听,然后使用通配符 DNS 将所有主机名映射到 Docker 主机,您可以使用唯一的主机名访问每个服务。您也可以使用基于路径的路由,但如果部署的应用程序不是用相对路径编写的,这会变得更具挑战性。

示例反向代理包括 nginx、haproxy 和 traefik。我更喜欢 traefik,因为它旨在根据正在运行的容器自动重新配置。这些代理在 docker 中运行,使用共享的 docker 网络,并且只有代理具有已发布的端口,其余服务通过代理通过 docker 网络访问。

请注意,此代理与您可能在 Docker 外部运行的代理是分开的。如果您有其他外部请求发送到网络上的其他服务器,则两者可以共存。对于 Docker 主机上容器的所有请求,外部代理都会将请求发送到基于 Docker 的代理。

相关内容