【问题标题】:Several containers on same host addressed with similar port同一主机上的多个容器使用相似的端口寻址
【发布时间】:2019-05-29 18:26:28
【问题描述】:

我有一个使用硬编码端口 8090 的客户端。 我希望机器 A 运行该客户端的 3 个实例,因此每个客户端地址不同的服务器。 3 个服务器中的每一个都托管在一个专用容器中,3 个容器托管在 IP 为 8.8.4.4 的机器 B 上。 问题是每个客户端都指向 8.8.4.4:8090,但我想将每个客户端路由到特定的容器。

我认为解决方案应该如下: 每个客户端将使用特定的 IP 地址,例如 8.8.4.1、8.8.4.2、8.8.4.3。 不知何故,我将在机器 A 上映射 IP 8.8.4.1、8.8.4.2、8.8.4.3 应该映射到 localhost。 拥有将从 8.8.4.1:8090 转发到 8.8.4.4:1000 的代理服务器。 将容器 c1 的端口从端口 1000 转发到 8090。 对其他 2 个 IP 执行相同操作。

我的主要差距是如何从 IP 8.8.4.1 映射回 localhost,以便代理服务器了解它应该将其转发到 8.8.4.4:1000。

图表。 A、B都是windows机器。 c1、c2、c3 是容器。 A B +--------------------+ +--------------------+ | | | 1000:8090 | | | | +----------+ | | | | | c1 | | | +----------------------------------->+ | | | | | +----------+ | | | | 2000:8090 | | | | +----------+ | | +----------------------------------->+ c2 | | | | | | | | | | | +----------+ | | | | 3000:8090 | | | | +----------+ | | +----------------------------------->+ c3 | | | | | | | | | | | +----------+ | +--------------------+ +--------------------+ ``

欢迎您的想法和想法!

【问题讨论】:

    标签: windows docker networking


    【解决方案1】:

    我建议你看看nginx,接下来是路由配置示例。

    假设客户端都运行在机器A上,机器A的ip是8.8.4.5,机器A上还有nginx运行:

    nginx.conf的一部分

    stream {
        upstream server1 {
            server 8.8.4.4:1000;
        }
    
        upstream server2 {
            server 8.8.4.4:2000;
        }
    
        upstream server3 {
            server 8.8.4.4:3000;
        }
    
        server {
            listen 8090;
            server_name nginx1;
            proxy_pass server1;
        }
    
        server {
            listen 8090;
            server_name nginx2;
            proxy_pass server2;
        }
    
        server {
            listen 8090;
            server_name nginx3;
            proxy_pass server3;
        }
    }
    

    然后在hosts文件旁边添加:

    8.8.4.5 nginx1
    8.8.4.5 nginx2
    8.8.4.5 nginx3
    

    客户端使用 next 进行连接:

    • client1: nginx1:8090
    • client2: nginx2:8090
    • client3: nginx3:8090

    如果不想使用nginx的vhost,可以直接在一张网卡上使用多个ip,不需要设置hosts文件。见this

    PS:当然,如果您的客户能够像我一开始所想的那样绑定到不同的 ip,那么可以这样:

    tcp_client.bind(('8.8.4.1', xxx))
    tcp_client.connect((server_ip, server_port))
    

    那么用remote_addr区分连接也可以,如下:

    stream {
        upstream server1 {
            server 8.8.4.4:1000;
        }
    
        upstream server2 {
            server 8.8.4.4:2000;
        }
    
        upstream server3 {
            server 8.8.4.4:3000;
        }
    
        server {
            listen 8090;
    
            if ($remote_addr ~* "8.8.4.1")
            {
                proxy_pass server1;
            }
    
            if ($remote_addr ~* "8.8.4.2")
            {
                proxy_pass server2;
            }
    
            if ($remote_addr ~* "8.8.4.3")
            {
                proxy_pass server3;
            }
         }
    }
    

    【讨论】:

    • 感谢您的回答。 nginx 解决方案看起来像我需要的。我想在机器 A 上运行 nginx。如何配置对 8.8.4.1 的请求将从机器 A 定向到机器 A?我应该修改主机文件吗?如果我这样做,nginx 会知道请求被定向到 8.8.4.1 而不是 localhost?
    • 我想我对你的问题有些误解,所以我现在更新。随着新的更新,nginx 监听不同的 vhost(或 ip),然后您的客户端可以连接到不同的 vhost 或 ip,最后将您路由到相同的 ip,但不同的端口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2016-05-02
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2016-04-08
    相关资源
    最近更新 更多