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

时间:2015-02-21 21:34:54

标签: ip docker

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

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

应该可以设置一个"隧道"或者"路线" (我不确定这个术语)将连接到端口25从容器内部转发到主机的端口25(基本上与docker用-p相反)。我已经阅读过docker高级网络和' ip'命令手册,但我无法知道如何做到这一点。

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

2 个答案:

答案 0 :(得分:4)

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

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

一样

documentation for this包含为主机系统添加条目的示例:

  

注意:有时您需要连接到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

(和there's an open issue如果您需要IPv6地址可能会有所帮助。)

修改:之后,如果您要向前移植以便与容器上的localhost通话,则需要自己处理该部分。有很多方法可以执行此操作(firewall rulenetcatproxy),并且它们独立于Docker。 Docker的-p标志没有内置的等价物向另一个方向发展。

答案 1 :(得分:-1)

使用泊坞窗链接。 Docker链接公开环境变量以及对/ etc / hosts进行更新。

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