首页 > 解决方案 > 同一主机上的多个容器使用相似的端口寻址

问题描述

我有一个使用硬编码端口 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 | | | | | | | | | | | +----------+ | +--------------------+ +--------------------+ ``

欢迎您的想法和想法!

标签: windowsdockernetworking

解决方案


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

假设客户端都运行在 machineA 上,machineA 的 ip 为 8.8.4.5,nginx 也在 machineA 上运行:

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 进行连接:

  • 客户端1:nginx1:8090
  • 客户端2:nginx2:8090
  • 客户端3:nginx3:8090

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

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;
        }
     }
}

推荐阅读