Ip 如何将docker容器端口转发到主机

Ip 如何将docker容器端口转发到主机,ip,docker,Ip,Docker,我正在尝试“dockerize”一个LAMP应用程序,但我在发送电子邮件时遇到了问题。 我有两个容器,一个用于apache/php,另一个用于mysql。 一切正常,但我不能发送任何电子邮件。 我已经在apache容器上安装了sendmail,但它需要连接到smtp服务器 我有点谷歌,大多数答案是“设置你自己的MTA容器”,然而,我在Ubuntu上运行docker,并且已经有了MTA设置(我可以发送电子邮件和使用现成的sendmail)。因此,我们的想法是使用主机smtp服务器 应该可以设置一个

我正在尝试“dockerize”一个LAMP应用程序,但我在发送电子邮件时遇到了问题。 我有两个容器,一个用于apache/php,另一个用于mysql。 一切正常,但我不能发送任何电子邮件。 我已经在apache容器上安装了sendmail,但它需要连接到smtp服务器

我有点谷歌,大多数答案是“设置你自己的MTA容器”,然而,我在Ubuntu上运行docker,并且已经有了MTA设置(我可以发送电子邮件和使用现成的sendmail)。因此,我们的想法是使用主机smtp服务器

应该可以设置一个“隧道”或“路由”(我不确定该术语)来将到端口25的连接从容器内部转发到主机的端口25(基本上与docker对-p的操作相反)。我读过docker advanced networking和“ip”命令手册,但我不知道该怎么做


目前,我的解决方案是使用
--net=host
创建所有容器。这样
sendmail
就可以看到主机的smpt服务器。此方法的问题是:不能同时使用
--link
--net=host
,因此意味着所有容器都必须使用
--net=host

使用docker链接。Docker链接公开环境变量并对/etc/hosts进行更新


您希望从容器内到达主机。你已经可以这样做了。例如,如果运行Docker的主机是
Docker.mb14.com
,则可以从容器中点击该地址

但这会给你一个面向外部的界面,你可能不想听这个。相反,您可以使用面向内部的接口,并在容器中为其命名为友好名称,其中包含一个为主机系统添加条目的示例:

注意:有时您需要连接到Docker主机,这意味着获取主机的IP地址。可以使用以下shell命令简化此过程:

$ alias hostip="ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print \$2 }'"
$ docker run  --add-host=docker:$(hostip) --rm -it debian
(如果您需要IPv6地址,这可能会有所帮助。)


编辑:之后,如果要向前移植以便与容器上的
localhost
对话,则需要自己处理该部分。有很多方法可以做到这一点(,),它们独立于Docker。Docker的
-p
标志没有一个内置的等价物朝另一个方向移动。

链接不符合TAI的情况。我可能你确实可以使用netcat,但我也不知道怎么做,你能举个例子吗?。我只是想知道,我们如何能使用docker用于将端口从主机转发到容器的相同技术,但使用相反的方式:从容器转发到主机。我已经用我列出的三个示例端口转发工具的链接更新了我的答案。Docker不为您提供此功能。您可以设置进入容器的映射,但Docker不管理从容器流出的映射。(但请随意提出一个问题。他们非常友好,反应迅速。)好的,我知道如何使用netcat,我想知道如何操作ip表/路由/隧道(如果可能的话),因为docker似乎在反方向操作。