windows - 同一主机上的多个容器使用相似的端口寻址
问题描述
我有一个使用硬编码端口 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 | |
| | | | | |
| | | +----------+ |
+--------------------+ +--------------------+
``
欢迎您的想法和想法!
解决方案
我建议你看一下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;
}
}
}
推荐阅读
- spring-cloud-config - 无法获得适用于 Azure Spring Cloud Config Server 的公钥/私钥身份验证
- angular - 如何跳过空数组观察者?
- docker - Kubernetes pod 中的容器是否属于同一 cgroup?
- grep - 使用正则表达式提取部分 grep 行
- azure - Azure WebApp SNAT Exhaustion - 私有终结点能否改进
- c++ - 如何在不使用库的情况下替换 C++ 中的字符
- php - 我的 wordpress 插件被调用了两次
- python - 根据阈值字典替换某些列中的值?
- angular - core.js:6014 错误类型错误:无法读取未定义的属性“模板”
- html - 我想在菜单或顶栏之后分页/分屏