我有一个应用程序,该应用程序发送电子邮件并要求在端口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
谢谢!
答案 0 :(得分:1)
如果您希望仅从另一个容器而不是从外部容器即可访问SMTP服务器,则无需映射端口。
使用docker-compose,所有定义的容器将自动添加到网络中,在该网络中,容器可以通过名称相互访问(请参见https://docs.docker.com/compose/networking/)。如果您的自定义“默认”网络是桥接网络,那么它也将正常工作。
这意味着您可以从其他容器直接在smtp:25
访问SMTP容器(即其内部端口和内部主机名,而不是docker主机的主机端口和可公开路由的IP地址)。
没有其他人能够使用您的SMTP服务器。我认为这可能会导致收件人不接受它发送的电子邮件的问题(请参阅https://serverfault.com/q/364473)。 @David Maze指出,无论如何还是最好使用公共/官方邮件提供商。
答案 1 :(得分:0)
我认为问题在于主机上的其他内容已经在该端口上进行监听
尝试找出主机上正在使用https://www.cyberciti.biz/faq/how-do-i-find-out-what-ports-are-listeningopen-on-my-linuxfreebsd-server/监听的端口
答案 2 :(得分:0)
使用主机上的其他端口:
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