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

时间:2019-08-25 18:55:47

标签: 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作为代理找到了仅针对HTTP流量的解决方案。但不幸的是,这无法处理其他TCP端口。

1 个答案:

答案 0 :(得分:0)

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

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

在使用HTTP的情况下,还有进一步的细节,即URL的主机名部分也在HTTP Host:标头中发送: :Web浏览器都进行DNS查找 eg stackoverflow.com并连接到其IP地址,并发送一个Host: stackoverflow.com HTTP标头。这是一种特定的机制,可让您在端口80上运行代理,然后通过虚拟主机设置转发到其他后端服务。

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

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