如何将Docker容器端口转发给主机

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

我已经谷歌了一点,大多数答案是“设置自己的MTA容器”,但是,我在Ubuntu上运行docker,并已经有一个MTA设置(我可以发送电子邮件和使用sendmail开箱)。 所以这个想法是使用主机smtp服务器。

应该可以设置一个“隧道”或“路由”(我不知道该术语)将连接端口25从容器内部转发到主机端口25(基本上与泊坞与-p)。 我已经阅读了docker高级networking和“ip”命令手册,但我无法想象如何去做。

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

你想从容器内到达主机。 你已经可以做到这一点。 例如,如果运行Docker的主机是docker.mb14.com那么您可以从容器内命中该地址。

但是,这会给你一个外部接口,你可能不想听。 相反,您可以使用面向内部的接口,并使用--add-host <alias>:<ip>在容器内为其指定一个友好的名称。 这会像--link一样添加一个/etc/hosts条目

其中的文档包括为主机系统添加条目的示例:

注意:有时您需要连接到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通话,则需要自己处理该部分。 有很多方法可以做到这一点( 防火墙规则 , netcat , 代理 ),他们独立于Docker。 Docker的-p标志没有内置的相当于另一个方向。

使用docker链接。 Docker链接暴露了环境variables,并且更新了/ etc / hosts。

https://docs.docker.com/userguide/dockerlinks/