docker-compose - 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.
解决方案
这在一般(非 HTTP)情况下是不可能的。
在较低级别,如果我连接到10.20.30.40:3306
,Linux 内核会选择一个正在侦听该端口的进程并将请求发送到那里。您不允许将(2) 第二个进程绑定到同一端口。(这也是如果您尝试docker run -p
选择已在使用的主机端口时会出现错误的原因。)
在 HTTP 的情况下,URL 的主机名部分也在HTTPHost:
标头中发送:Web 浏览器既执行 DNS 查找例如 stackoverflow.com
并连接到其 IP 地址,还发送Host: stackoverflow.com
HTTP 标头. 这是允许您在端口 80 上运行代理,然后通过虚拟主机设置转发到其他后端服务的特定机制。
但是,该机制非常特定于 HTTP,并且不适用于不支持它的其他协议。我认为 MySQL 或 ssh 在其有线协议中都没有类似的机制。
(在你描述的特定情况下,这可能相对容易处理。你不想让你的内部数据库或 sshd 公开可见,所以ports:
从你的docker-compose.yml
文件中删除它们,然后只担心代理 HTTP 服务。它是在 Docker 中运行 sshd 非常不寻常且设置复杂,因此您也可以删除它并稍微简化您的堆栈。)
推荐阅读
- javascript - 检查登录状态并根据它更改导航栏文本(React.js)
- javascript - 使用 ref 反应下拉列表并选择标签
- java - 从测试访问私有变量并完成覆盖功能
- python - 仅将字符串拆分为两部分
- python - 非管理员用户无法删除 SO Line (odoo v11)
- file - 防止两个或多个 awk 实例同时写入同一个文件
- python - 命令行中的包导入错误,但在 PyCharm 中没有
- hazelcast-jet - Hazelcast Jet 0.6.1- 多个字段的聚合
- python - 在 python joblib 模块中直接使用 MemmapingPool
- csv - 如何创建从 Google Drive 到 BigQuery 的管道