【发布时间】:2017-10-08 20:52:52
【问题描述】:
我正在学习如何将 Docker 与多个容器一起使用,而不是单个容器。
我想学习如何从容器 A 调用位于容器 B 上的程序。
(即:我希望能够从我的web 容器中调用sendmail,而sendmail 和类似的程序位于mailhog 容器中。)
我有这个:
docker-compose.yml
web:
container_name: centosweb
image: fab/centosweb
ports:
- "80:80"
volumes:
# Single files
- ./config/httpd.conf:/etc/httpd/conf/httpd.conf
# Directories
- ./vhosts:/var/www/html
- /Users/fabien/Dropbox/AppData/XAMPP/web/bilingueanglais/public_html:/var/www/html/bilingueanglais
- ./logs/apache:/etc/httpd/logs # This will include access_log(s) and error_log(s), including PHP errors.
links:
- db:3306
- mailhog:1025
db:
container_name: centosdb
image: fab/centosdb
hostname: db
volumes:
# Single files
- ./config/my.cnf:/etc/my.cnf
# Directories
- ./mysqldata:/var/lib/mysql
- ./logs/mysql:/var/log/mysql
mailhog:
image: mailhog/mailhog
hostname: mailhog
ports:
- 1025:1025
- 8025:8025
但是,现在,web 找不到 /usr/sbin/sendmail,因为它位于 mailhog 容器中。尝试使用 PHP 中的邮件函数会产生 Could not instantiate mail function 错误。
如何将两者联系起来?
【问题讨论】:
-
我不知道 mailhog,我看不出你在这里尝试做的事情的优势?为什么不在你的 Web 容器中安装 sendmail?我认为您使用标准图像不会走得太远。使用它们来构建您自己的。 -- 除此之外,如果你真的想从另一个容器中的一个容器访问软件,你必须通过
docker exec,这意味着你需要在你的Web容器中安装docker客户端和套接字/var/run/docker.sock安装在网络内。 -
在一个图像和容器中使用所有内容效果很好,但我正在尝试学习使用 Docker compose 和多个容器,因为它似乎在生产中很方便。我大致尝试遵循Twelve-Factor App 的模型(但也许这只是过早优化的一个例子?)我的理解是,在生产中(Mailhog 和 mhsendmail 将被其他东西替换),它会使感觉有一个电子邮件容器,与其他容器分开。底线:我试图了解 Docker 多容器是如何工作的。
-
Docker 简化了软件之间的接口——这意味着我们应该只通过网络在容器之间进行通信。如果您只有一台服务器,您可以使用
docker exec或docker run --from ...来执行此操作,但它总是感觉像是一个黑客。因此,如果您想拥有不同的电子邮件服务,请运行一个包含开放式 smtp 中继的容器,仅用于您的服务,并在该容器中配置真正的网关。然后,您可以直接与 php 连接该中继(例如,请参阅 github.com/PHPMailer/PHPMailer,但我对 PHP 真的了解不多;))。