我有一个发送电子邮件的应用程序,需要在端口 25 上运行 smtp。为此我创建了另一个容器并将端口 25 从主机映射到容器。
这不是很好,因为它一直抛出以下错误
ERROR: for smtp Cannot start service smtp: driver failed programming external connectivity on endpoint push_smtp_1 (25f260f6185dd34cfdb8fb9956c28187028aaca4d850d7a73acc4c2180c55696): Error starting userland proxy: Bind for 0.0.0.0:25: unexpected error (Failure EADDRINUSE)
不确定这里有什么问题,按照其他帖子,我尝试重新启动 docker 客户端,并验证端口 25 上没有其他任何东西在运行 lsof -i:25
如果我在这里遗漏了什么,请告诉我。
这个问题的第二部分是,处理 smtp 服务器的理想方式是什么。
smtp 服务器是否应该在应用程序容器中创建。看到这个博客 http://www.tothenew.com/blog/setting-up-sendmail-inside-your-docker-container/
如果不是(1),那么创建一个smtp容器并映射端口是否更好。是这样,出现上述错误的原因是什么。
下面是我的 docker-compose 的方式:
version: '3'
services:
push:
image: emailService
ports:
- "9602:9602/tcp"
networks:
- default
build:
context: ./
dockerfile: Dockerfile
args:
- "TARGET=build"
depends_on:
- gearmand
- smtp
smtp:
image: catatnight/postfix:latest
ports:
- "25:25"
networks:
- default
gearmand:
image: <path>/<to>/gearmand:latest
ports:
- "4730:4730/tcp"
networks:
- default
谢谢!
最佳答案
如果您希望 SMTP 服务器只能从其他容器访问,而不是从外部访问,则无需映射端口。
使用 docker-compose,所有定义的容器将自动添加到网络中,容器可以通过它们的名称相互访问(参见 https://docs.docker.com/compose/networking/ )。如果您的自定义“默认”网络是桥接网络,这也适用。
这意味着,您的 SMTP 容器可以通过 smtp:25
直接从其他容器访问(即它的内部端口和内部主机名,而不是您的 docker 主机的主机端口和公共(public)可路由 IP 地址) .
没有其他人能够像那样使用您的 SMTP 服务器。我认为这可能会导致收件人不接受它发送的电子邮件的问题(请参阅 https://serverfault.com/q/364473 )。 @David Maze 说无论如何使用公共(public)/官方邮件提供商可能更好。
关于email - 在容器中为您的应用程序设置 SMTP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52934186/