Docker compose Docker:在相同的tcp端口上使用不同的主机名运行多个容器

Docker compose Docker:在相同的tcp端口上使用不同的主机名运行多个容器,docker-compose,port,Docker Compose,Port,有没有办法在同一个端口上运行多个docker容器?例如,我在docker compose文件中使用了端口80/443(HTTP)、3306(TCP/MySQL)和22(TCP/SSH)。现在,我想在我的机器上为同一ip地址上的不同主机名运行这个docker compose。 -来自example1.com的流量(默认公共ip)=>container1 -example2.com的流量(默认公共ip)=>container2 通过在我的机器上使用额外的nginx/haproxy作为代理,我已经找到

有没有办法在同一个端口上运行多个docker容器?例如,我在docker compose文件中使用了端口80/443(HTTP)、3306(TCP/MySQL)和22(TCP/SSH)。现在,我想在我的机器上为同一ip地址上的不同主机名运行这个docker compose。 -来自example1.com的流量(默认公共ip)=>container1 -example2.com的流量(默认公共ip)=>container2
通过在我的机器上使用额外的nginx/haproxy作为代理,我已经找到了一个只针对HTTP流量的解决方案。但不幸的是,这无法处理其他TCP端口。

这在一般(非HTTP)情况下是不可能的

在较低的级别,如果我连接到
10.20.30.40:3306
,Linux内核将选择一个正在侦听该端口的进程,并将请求发送到该端口。不允许将第二个进程绑定到同一端口。(这也是如果您尝试
docker run-p
拾取已在使用的主机端口时出错的原因。)

在HTTP的情况下,还有一个更详细的信息,URL的主机名部分也在HTTP
host:
头中发送:Web浏览器对例如
stackoverflow.com
进行DNS查找并连接到其IP地址,还发送一个
host:stackoverflow.com
HTTP头。这是一种特定的机制,允许您在端口80上运行代理,然后通过虚拟主机设置转发到其他后端服务

不过,这种机制非常特定于HTTP,并且不适用于不支持它的其他协议。我认为MySQL或ssh在其有线协议中都没有类似的机制


(在您描述的特定情况下,这可能比较容易处理。您不想让内部数据库或sshd公开显示,因此请从
docker compose.yml
文件中删除它们的
端口:
,然后只需担心代理HTTP服务。这是非常不寻常和复杂的设置要在Docker中运行sshd,您还可以删除它并稍微简化堆栈。)

这在一般(非HTTP)情况下是不可能的

在较低的级别上,如果我连接到
10.20.30.40:3306
,Linux内核将选择一个正在侦听该端口的进程并将请求发送到该端口。不允许将第二个进程绑定到同一端口。(这也是如果您尝试
docker run-p
拾取已在使用的主机端口时出错的原因。)

在HTTP的情况下,还有一个更详细的信息,URL的主机名部分也在HTTP
host:
头中发送:Web浏览器对例如
stackoverflow.com
进行DNS查找,并连接到其IP地址,还发送一个
host:stackoverflow.com
HTTP头t允许您在端口80上运行代理,然后通过虚拟主机设置转发到其他后端服务

不过,这种机制非常特定于HTTP,并且不适用于其他不支持它的协议。我认为MySQL或ssh在其有线协议中都没有类似的机制

(在您描述的特定情况下,这可能比较容易处理。您不想让内部数据库或sshd公开显示,因此请从
docker compose.yml
文件中删除它们的
端口:
,然后只需担心代理HTTP服务。这是非常不寻常和复杂的设置要在Docker中运行sshd,您还可以删除它并稍微简化堆栈。)