【问题标题】:Docker : find sendmail in other containerDocker:在其他容器中查找 sendmail
【发布时间】: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 execdocker run --from ... 来执行此操作,但它总是感觉像是一个黑客。因此,如果您想拥有不同的电子邮件服务,请运行一个包含开放式 smtp 中继的容器,仅用于您的服务,并在该容器中配置真正的网关。然后,您可以直接与 php 连接该中继(例如,请参阅 github.com/PHPMailer/PHPMailer,但我对 PHP 真的了解不多;))。

标签: docker isolation


【解决方案1】:

容器需要在同一个网络中,这是我的问题。

【讨论】:

  • 您能否详细说明解决此问题所需的条件?
  • 所以基本上,如果您使用 docker-compose,您可以使用 network 属性来确保您尝试链接的两个容器都使用特定的 docker 网络。这允许它们在没有 IP 地址的情况下相互连接,只需使用主机名即可,主机名默认为 docker-compose 中的服务名称。我不使用链接属性。这是一个工作示例gist.github.com/rafalfaro18/d1811dd42f89ae03194aededafb78a4e,因此在这种情况下,两个容器都位于一个名为“wordpress-network”的网络中,因此 wordpress 容器可以使用“db”作为数据库的 url 连接到 db。
  • 如果您使用相同的网络(默认网络除外),则不需要 IP 地址。如果你不使用网络,docker 将使用默认网络,它只能通过 ip 地址而不是主机名访问容器。
  • 所以对于这篇文章的原始问题。您可以修复连接问题,删除链接属性并将相同的自定义网络添加到所有容器。
猜你喜欢
  • 1970-01-01
  • 2019-03-14
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多