插件窝 干货文章 docker web 无法访问

docker web 无法访问

容器 端口 Docker 检查 155    来源:    2025-04-24

当 Docker 容器中的 Web 服务无法访问时,可以按照以下步骤进行排查和解决:


1. 检查容器运行状态

docker ps -a
  • 确认容器处于 Up 状态(正在运行)。
  • 如果容器未运行,使用以下命令启动并查看日志: bash docker start <容器名/ID> docker logs <容器名/ID>

2. 检查端口映射

  • 确认端口映射正确

    docker inspect <容器名/ID> | grep HostPort
    

    确保容器内部的端口(如 80)已正确映射到主机的某个端口(如 8080)。

  • 启动时指定端口映射

    docker run -d -p 主机端口:容器端口 <镜像名>
    

    例如:docker run -d -p 8080:80 nginx


3. 检查防火墙/SELinux

  • 防火墙(Linux/macOS/WSL): bash # 开放主机端口(如8080) sudo ufw allow 8080 # Ubuntu sudo firewall-cmd --add-port=8080/tcp --permanent # CentOS
  • Windows:检查 Windows Defender 防火墙规则。

  • SELinux(仅限 Linux):

    sudo setenforce 0      # 临时关闭(测试用)
    

4. 检查容器内服务是否监听正确

进入容器内部,确认服务已监听目标端口:

docker exec -it <容器名/ID> sh
# 在容器内执行:
netstat -tuln | grep 80  # 检查端口监听
curl localhost:80        # 测试容器内访问

5. 检查网络配置

  • 容器网络模式

    docker inspect <容器名/ID> | grep NetworkMode
    
    • 默认 bridge 模式需通过主机端口访问。
    • host 模式直接使用主机网络(无需端口映射)。
  • 自定义网络

    docker network ls
    docker network inspect <网络名>
    

6. 检查应用配置

  • 确保容器内的 Web 服务(如 Nginx/Apache)已正确配置: bash docker exec -it <容器名/ID> cat /etc/nginx/conf.d/default.conf
  • 如果是自定义应用,检查是否监听 0.0.0.0(而非 127.0.0.1)。

7. 测试主机到容器的连通性

  • 从主机直接访问容器的 IP: bash docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <容器名/ID> curl <容器IP>:<容器端口> 如果成功,说明问题出在端口映射或防火墙。

8. 其他常见问题

  • 端口冲突:主机端口已被其他进程占用。 bash netstat -tuln | grep 8080
  • Docker 服务未运行bash systemctl status docker # Linux

9. 使用 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 服务无法访问的问题。