在容器中为应用设置 SMTP 服务器



我有一个发送电子邮件的应用程序,需要在端口 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服务器的理想方法是什么。

  1. 是否应在应用容器中创建 smtp 服务器。遇到这个博客 http://www.tothenew.com/blog/setting-up-sendmail-inside-your-docker-container/

  2. 如果不是 (1(,那么最好创建一个 smtp 容器并映射端口。是这样,出现上述错误的原因是什么。

以下是我的码头工人的组成方式:

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 主机的主机端口和可公开路由的 IP 地址(直接访问。

没有其他人能够像这样使用您的SMTP服务器。我认为这可能会导致收件人不接受它发送的电子邮件的问题(见 https://serverfault.com/q/364473(。@David Maze有一个观点,那就是无论如何最好使用公共/官方邮件提供商。

我认为问题是主机上的其他内容已经在该端口上侦听

尝试找出主机上的哪些端口正在侦听 https://www.cyberciti.biz/faq/how-do-i-find-out-what-ports-are-listeningopen-on-my-linuxfreebsd-server/

在主机上使用其他端口:

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:
- "2525:25"
networks:
- default
gearmand:
image: <path>/<to>/gearmand:latest
ports:
- "4730:4730/tcp"
networks:
- default

最新更新