Docker Swarm环境下PhpMyAdmin与Traefik V2配置出现404错误排查
问题分析与修复方案
针对你在Docker Swarm中部署PhpMyAdmin+MariaDB栈时遇到的404错误,结合你的配置文件,核心问题出在Traefik的端口配置和冗余的端口映射上,以下是具体修复步骤:
1. 修正Traefik负载均衡端口
Traefik通过Docker内部网络直接与容器通信,不需要使用宿主映射的端口。你的配置中traefik.http.services.pma_phpmyadmin.loadbalancer.server.port设为了8081(宿主端口),但phpmyadmin容器内部实际监听的是80端口,这会导致Traefik无法正确转发请求到容器。
将该配置项改为:
traefik.http.services.pma_phpmyadmin.loadbalancer.server.port=80
2. 移除冗余的ports字段
在Swarm模式下,通过Traefik反向代理访问容器时,不需要暴露ports到宿主节点,这个配置不仅多余,还可能导致网络冲突。直接删除phpmyadmin服务下的:
ports: - 8081:80
3. 验证PMA_ABSOLUTE_URI配置
确保PMA_ABSOLUTE_URI的值与你实际访问的域名完全一致,比如如果你的访问地址是https://pma.example.com,该变量就保持当前配置即可,不要添加额外的路径或拼写错误。
修正后的完整配置
version: '3.1' services: db: image: mariadb:10.6 environment: MYSQL_ROOT_PASSWORD: ******** networks: - backend volumes: - db-data:/db deploy: placement: constraints: - node.labels.db.db-data == true phpmyadmin: image: phpmyadmin environment: - PMA_ARBITRARY=1 - PMA_ABSOLUTE_URI=https://pma.example.com networks: - backend - traefik-public labels: - traefik.enable=true - traefik.docker.network=traefik-public - traefik.constraint-label=traefik-public - traefik.http.routers.pma_phpmyadmin-http.rule=Host(`${DOMAIN?Variable not set}`) - traefik.http.routers.pma_phpmyadmin-http.entrypoints=http - traefik.http.routers.pma_phpmyadmin-http.middlewares=https-redirect - traefik.http.routers.pma_phpmyadmin-https.rule=Host(`${DOMAIN?Variable not set}`) - traefik.http.routers.pma_phpmyadmin-https.entrypoints=https - traefik.http.routers.pma_phpmyadmin-https.tls=true - traefik.http.routers.pma_phpmyadmin-https.tls.certresolver=le - traefik.http.services.pma_phpmyadmin.loadbalancer.server.port=80 networks: traefik-public: external: true backend: external: false volumes: db-data:
验证步骤
- 重新部署栈:
docker stack deploy -c pma-db.yml pma-db
- 查看Traefik的dashboard,确认phpmyadmin的路由和服务是否正常注册
- 访问你的PMA域名,检查是否能正常加载
内容的提问来源于stack exchange,提问作者Maxime Serret
相关产品推荐
相关产品推荐

