Podman环境下启动Pi-hole后Nextcloud容器DNS解析故障排查
问题:Podman Compose部署Pi-hole后Nextcloud无法解析容器域名
用podman-compose部署了Nextcloud、mariadb、redis三个容器,原本Nextcloud能通过容器名(MYSQL_HOST=mariadb、REDIS_HOST=redis)正常连接数据库和缓存服务。但启动Pi-hole容器后,Nextcloud出现数据库连接错误:
Failed to connect to the database: An exception occurred in the driver: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for mariadb failed: Name or service not known
环境信息
- 平台:Raspberry Pi 5
- 系统:基于Debian 12的Raspberry Pi OS
- podman:4.3.1(系统可用最新版)
- podman-compose:1.0.3(系统可用最新版)
- Nextcloud:30.0.4
- Pi-hole:development镜像(当日拉取)
已排查情况
- 怀疑是Podman 4.3的bug,但未找到相关资料;尝试编译升级到Podman 5.3.1,因依赖问题放弃
- Docker部署无此问题
- 切换其他用户运行Pi-hole可恢复正常,但会导致基础设施重复部署
- 修改系统DNS配置(移除127.0.0.1)后问题仍存在
解决方案
1. 为容器显式指定Podman内置DNS
Podman 4.x的容器DNS解析逻辑和Docker有差异,Pi-hole启动后可能干扰了默认的容器DNS resolver。在podman-compose.yml中给Nextcloud、mariadb、redis容器添加DNS配置,优先使用Podman内置的DNS服务(通常为10.88.0.1,可通过podman network inspect podman确认具体地址):
services: nextcloud: # 其他配置... dns: - 10.88.0.1 - 你的Pi-hole物理IP(可选,用于外部域名解析) mariadb: # 其他配置... dns: - 10.88.0.1 redis: # 其他配置... dns: - 10.88.0.1
2. 统一容器到自定义Podman网络
确保所有容器(包括Pi-hole)处于同一个自定义网络中,避免默认网络的DNS冲突:
- 创建自定义网络:
podman network create nextcloud-net
- 在
podman-compose.yml中为所有容器指定该网络:
networks: default: external: true name: nextcloud-net
容器间的域名解析会通过Podman内置DNS完成,不受Pi-hole的DNS配置影响。
3. 修改Pi-hole的端口监听规则
Pi-hole默认占用53端口,可能抢占了Podman内置DNS的端口。修改Pi-hole容器配置,让其仅监听物理网卡的53端口,不占用Podman虚拟网卡的端口:
services: pihole: # 其他配置... ports: - "你的物理网卡IP:53:53/tcp" - "你的物理网卡IP:53:53/udp" # 保留其他端口映射...
4. 配置Podman dnsmasq强制解析容器域名
编辑Podman的dnsmasq配置文件(路径通常为/etc/containers/dnsmasq.conf),添加容器域名的静态解析规则:
address=/mariadb/你的mariadb容器IP address=/redis/你的redis容器IP
保存后重启Podman服务:
sudo systemctl restart podman
内容的提问来源于stack exchange,提问作者Plasm
相关产品推荐
相关产品推荐

