当 Docker 容器中的 Web 服务无法访问时,可以按照以下步骤进行排查和解决:
docker ps -a
Up
状态(正在运行)。bash
docker start <容器名/ID>
docker logs <容器名/ID>
确认端口映射正确:
docker inspect <容器名/ID> | grep HostPort
确保容器内部的端口(如 80
)已正确映射到主机的某个端口(如 8080
)。
启动时指定端口映射:
docker run -d -p 主机端口:容器端口 <镜像名>
例如:docker run -d -p 8080:80 nginx
。
bash
# 开放主机端口(如8080)
sudo ufw allow 8080 # Ubuntu
sudo firewall-cmd --add-port=8080/tcp --permanent # CentOS
Windows:检查 Windows Defender 防火墙规则。
SELinux(仅限 Linux):
sudo setenforce 0 # 临时关闭(测试用)
进入容器内部,确认服务已监听目标端口:
docker exec -it <容器名/ID> sh
# 在容器内执行:
netstat -tuln | grep 80 # 检查端口监听
curl localhost:80 # 测试容器内访问
容器网络模式:
docker inspect <容器名/ID> | grep NetworkMode
bridge
模式需通过主机端口访问。host
模式直接使用主机网络(无需端口映射)。自定义网络:
docker network ls
docker network inspect <网络名>
bash
docker exec -it <容器名/ID> cat /etc/nginx/conf.d/default.conf
0.0.0.0
(而非 127.0.0.1
)。bash
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <容器名/ID>
curl <容器IP>:<容器端口>
如果成功,说明问题出在端口映射或防火墙。bash
netstat -tuln | grep 8080
bash
systemctl status docker # Linux
docker-compose
的检查如果使用 docker-compose.yml
:
1. 确认 ports
配置正确:
yaml
ports:
- "8080:80"
2. 重新启动服务:
bash
docker-compose down && docker-compose up -d
容器是否运行? → 否 → 启动容器并检查日志
↓是
端口映射是否正确? → 否 → 重新运行容器并指定端口
↓是
主机防火墙是否放行? → 否 → 配置防火墙/SELinux
↓是
容器内服务是否监听? → 否 → 检查应用配置
↓是
主机是否能访问容器IP? → 否 → 检查Docker网络
↓是
问题解决 → 可能是客户端或DNS问题
通过以上步骤,可以逐步定位并解决 Docker Web 服务无法访问的问题。