无法通过NginxProxyManager(NPM)Web UI实现Docker容器服务转发
解决Nginx Proxy Manager转发到Docker容器应用的问题
1. 核心前提:容器需在同一Docker网络
Docker容器默认的bridge网络无法让不同容器直接通过容器名通信,必须将NPM和目标应用容器加入同一个自定义网络:
- 创建自定义网络:
docker network create proxy-net - 把两个容器加入该网络(如果用docker-run启动):
# 重启NPM容器并加入网络 docker run --network proxy-net [你的NPM容器启动参数] # 重启目标应用容器并加入网络 docker run --network proxy-net --name my-app [你的应用容器启动参数] - 如果用docker-compose,在两个服务配置中添加
networks字段:version: '3' services: npm: image: jc21/nginx-proxy-manager:latest ports: - 80:80 - 81:81 - 443:443 networks: - proxy-net my-app: image: [你的应用镜像] container_name: my-app networks: - proxy-net networks: proxy-net: external: true # 若已手动创建网络则加此句,否则删除让compose自动创建
2. 修正NPM转发配置
对照你的配置截图,重点检查:
- 转发目标:必须填写
my-app:3000(容器名+应用内部端口,不是宿主机的3000端口) - Scheme选项:根据应用服务类型选
http或https - 辅助设置:勾选「Websockets支持」(若应用用到websocket),将「转发主机头」设为
$host或www.my-app.com
3. 验证容器间连通性
进入NPM容器内部,测试能否访问目标应用:
# 进入NPM容器 docker exec -it [NPM容器名] /bin/sh # 测试容器连通性 ping my-app # 测试应用是否可访问 curl http://my-app:3000
如果ping不通,说明网络配置有误;如果curl返回应用内容,说明网络正常,问题出在NPM转发规则或外部访问链路。
4. 检查外部访问链路
- 域名解析:在本地执行
nslookup www.my-app.com,确认解析结果为服务器公网IP - 防火墙/安全组:开放服务器80、443端口:
同时检查云服务商安全组,开放80、443端口的入站规则ufw allow 80/tcp ufw allow 443/tcp ufw reload
内容的提问来源于stack exchange,提问作者AndaluZ
相关产品推荐
相关产品推荐

