同一主机上的多个容器使用相似的端口进行寻址

时间:2019-05-29 18:26:29

标签: windows docker networking

我有一个使用硬编码端口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。 从端口1000到8090在容器c1处向前端口。 对其他2个IP执行相同操作。

我的主要空白是如何从IP 8.8.4.1映射回本地主机,以便代理服务器理解应该将其转发到8.8.4.4:1000。

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

欢迎您提出想法!

1 个答案:

答案 0 :(得分:0)

我建议您看看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;
    }
}

然后在主机文件旁边添加

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,则不需要设置主机文件。参见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;
        }
     }
}