首页 > 解决方案 > Docker: run multiple container on same tcp ports with different hostname

问题描述

Is there a way to run multiple docker containers on the same ports? For example, I have used the ports 80/443 (HTTP), 3306 (TCP/MySQL) and 22 (TCP/SSH) in my docker-compose file. Now I want to run this docker-compose for different hostnames on the same ip address on my machine. - traffic from example1.com (default public ip) => container1 - traffic from example2.com (default public ip) => container2 I have already found a solution only for the HTTP traffic by using an additional nginx/haproxy as a proxy on my machine. But unfortunately, this can't handle other TCP ports.

标签: docker-composeport

解决方案


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

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

在 HTTP 的情况下,URL 的主机名部分也在HTTPHost:标头中发送:Web 浏览器既执行 DNS 查找例如 stackoverflow.com并连接到其 IP 地址,还发送Host: stackoverflow.comHTTP 标头. 这是允许您在端口 80 上运行代理,然后通过虚拟主机设置转发到其他后端服务的特定机制。

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

(在你描述的特定情况下,这可能相对容易处理。你不想让你的内部数据库或 sshd 公开可见,所以ports:从你的docker-compose.yml文件中删除它们,然后只担心代理 HTTP 服务。它是在 Docker 中运行 sshd 非常不寻常且设置复杂,因此您也可以删除它并稍微简化您的堆栈。)


推荐阅读