我试图" 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
。
答案 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 rule,netcat,proxy),并且它们独立于Docker。 Docker的-p
标志没有内置的等价物向另一个方向发展。
答案 1 :(得分:-1)
使用泊坞窗链接。 Docker链接公开环境变量以及对/ etc / hosts进行更新。