为什么指定端口运行的Docker容器访问时返回连接被拒绝?
Docker Nginx 端口连接被拒绝排查解决步骤
1. 确认容器运行状态与端口映射有效性
- 执行
docker ps -a查看目标容器状态:- 若状态为
Exited,执行docker logs container_name查看启动日志,大概率是挂载目录中的Nginx配置存在语法错误,导致Nginx进程启动失败,没有端口在监听 - 若状态为
Up,检查端口映射列是否显示0.0.0.0:83->83/tcp,如果仅显示:::83->83/tcp说明仅监听了IPv6地址,IPv4访问会被拒绝,需要修改启动命令显式指定IPv4绑定:docker container run -d -it -p 0.0.0.0:83:83 --name container_name -v /home/.../:/container_path/ nginx
- 若状态为
2. 确认容器内部Nginx监听端口配置
官方Nginx镜像默认监听80端口,你当前配置的是宿主机83端口映射到容器83端口,若未修改容器内Nginx配置,容器内部根本没有进程监听83端口,这是该问题最常见的诱因。
- 执行
docker exec -it container_name ss -tunlp查看容器内部监听端口,确认是否有进程监听83端口 - 若仅监听80端口,两种修复方案二选一即可:
- 修改端口映射规则,将宿主机83端口映射到容器默认80端口:启动命令替换为
docker container run -d -it -p 83:80 --name container_name -v /home/.../:/container_path/ nginx - 调整挂载目录中的Nginx配置,将监听端口修改为83,重启容器生效
- 修改端口映射规则,将宿主机83端口映射到容器默认80端口:启动命令替换为
3. 排查宿主机网络与防火墙规则
- 执行
ss -tunlp | grep 83查看宿主机是否有docker-proxy进程监听83端口,若无监听说明Docker端口映射未生效,可尝试执行systemctl restart docker重启Docker服务后重新启动容器 - 执行
iptables -L -n检查是否存在未被注意到的流量拦截规则,部分系统默认配置或运维操作可能会添加非ufw管理的iptables规则 - 登录VPS厂商控制台,检查外层安全组/防火墙配置是否放行83端口的入站流量,云厂商的安全组规则优先级高于VPS内部防火墙配置
- 执行
sysctl net.ipv4.ip_forward检查IP转发是否开启,若返回值为0,执行sysctl -w net.ipv4.ip_forward=1临时开启,同时将net.ipv4.ip_forward=1写入/etc/sysctl.conf永久生效,Docker运行依赖IP转发能力
4. 连通性验证
- 先在宿主机本地执行
curl http://127.0.0.1:83验证本地连通性,本地连通正常后再测试公网访问 - 若本地可通公网不通,优先排查VPS安全组规则、运营商端口封禁两类问题
内容的提问来源于stack exchange,提问作者Nader
相关产品推荐
相关产品推荐

