基于 Docker 的 MailServer 部署指南 (Gentoo Linux)
使用 Docker 容器化部署 Postfix 与 Dovecot 邮件系统
views
| comments
核心配置要点与规避事项#
- 标准输出重定向 (Syslog 限制): 容器环境通常缺失
syslog进程。Postfix 与 Dovecot 的日志必须显式重定向至/dev/stdout或/dev/stderr,以确保日志可通过docker logs捕获。 - SSL 强制依赖检查: Dovecot 2.3+ 版本即使在
ssl = no模式下,若配置文件中存在未注释的ssl_cert路径,仍会因检查证书文件失败而产生 Fatal 错误。 - LMTP 端口非特权化: 为避免 Linux 容器对 1024 以下端口(特权端口)的权限限制或网络策略拦截,建议将内部 LMTP 投递端口由默认的 24 迁移至高位端口(如 2424)。
- 静态虚拟用户数据库 (Userdb Static): 在使用
passwd-file作为认证源时,userdb应配置为static驱动。需显式指定uid、gid及mail路径格式,防止 Dovecot 自动探测机制在非标准环境下失效。
部署流程#
环境说明:
- 宿主机: Gentoo Linux
- 基础镜像: Rocky Linux 9
- 数据根目录:
/opt/mail_stack - 示例域名:
localhost.com
1. 宿主机环境初始化#
配置数据持久化目录并统一 UID/GID 映射,确保容器内外文件系统访问权限一致。
# 停止宿主机冲突服务
/etc/init.d/postfix stop && rc-update del postfix default
# 初始化目录结构
mkdir -p /opt/mail_stack/{vmail,postfix_conf,dovecot_conf,users}
# 创建映射账号 (UID/GID 5000)
groupadd -g 5000 vmail
useradd -u 5000 -g vmail -s /sbin/nologin -d /opt/mail_stack/vmail vmail
# 配置权限
chown -R vmail:vmail /opt/mail_stack/vmail
chmod -R 770 /opt/mail_stack/vmail
# 配置初始用户凭据
cat << 'EOF' > /opt/mail_stack/users/passwd
guoy@localhost.com:{PLAIN}111111
wanghh@localhost.com:{PLAIN}111111
EOF
chmod 644 /opt/mail_stack/users/passwdzsh2. 提取基础配置文件#
通过临时容器获取各组件的默认配置文件。
docker run --rm -v /opt/mail_stack/postfix_conf:/export rockylinux:9 \
bash -c "dnf install -y postfix && cp -r /etc/postfix/* /export/"
docker run --rm -v /opt/mail_stack/dovecot_conf:/export rockylinux:9 \
bash -c "dnf install -y dovecot && cp -r /etc/dovecot/* /export/"zsh3. Dovecot 配置优化#
编辑 /opt/mail_stack/dovecot_conf/ 目录下的配置文件。
- 协议声明:
dovecot.conf头部添加protocols = imap lmtp。 - 日志输出:
conf.d/10-logging.conf设置为标准流输出。 - 禁用 SSL: 在
conf.d/10-ssl.conf中设置ssl = no并注释所有ssl_cert与ssl_key行。 - LMTP 监听配置: 修改
conf.d/10-master.conf:
textservice lmtp { inet_listener lmtp { address = 0.0.0.0 port = 2424 } } - 认证策略: 重写
conf.d/10-auth.conf:
textdisable_plaintext_auth = no auth_mechanisms = plain login passdb { driver = passwd-file args = scheme=PLAIN username_format=%u /etc/dovecot/users/passwd } userdb { driver = static args = uid=5000 gid=5000 home=/var/vmail/%d/%n mail=maildir:/var/vmail/%d/%n }
4. Postfix 路由配置#
在 /opt/mail_stack/postfix_conf/main.cf 中追加或修改以下参数:
myhostname = mail.localhost.com
mydomain = localhost.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mynetworks = 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16
virtual_mailbox_domains = localhost.com
virtual_transport = lmtp:inet:dovecot:2424
local_recipient_maps =text5. 容器构建与编排#
Dockerfile.postfix:
FROM rockylinux:9
RUN dnf install -y postfix && dnf clean all
RUN postconf -e "maillog_file = /dev/stdout"
CMD ["postfix", "start-fg"]dockerfileDockerfile.dovecot:
FROM rockylinux:9
RUN dnf install -y dovecot && dnf clean all
CMD ["dovecot", "-F"]dockerfiledocker-compose.yml:
services:
dovecot:
build:
context: .
dockerfile: Dockerfile.dovecot
container_name: mail_dovecot
ports:
- "143:143"
volumes:
- ./dovecot_conf:/etc/dovecot
- ./vmail:/var/vmail
- ./users:/etc/dovecot/users
restart: always
postfix:
build:
context: .
dockerfile: Dockerfile.postfix
container_name: mail_postfix
ports:
- "25:25"
volumes:
- ./postfix_conf:/etc/postfix
depends_on:
- dovecot
restart: alwaysyaml6. 服务验证#
执行 docker-compose up -d --build 启动服务。
SMTP 投递测试:
使用 telnet 或 nc 连接宿主机 25 端口,通过 DATA 指令提交邮件。
文件系统验证:
检查 /opt/mail_stack/vmail/localhost.com/guoy/new/ 目录。若生成对应的邮件文件,则说明 Postfix (SMTP) 经由 LMTP 成功向 Dovecot 交付邮件。