当前位置: 首页 > news >正文

从浏览器无法访问到Docker容器的 FastAPI 服务地址【宿主机浏览器和容器不在同一个网络层面:端口映射】

文章目录

  • 1. 问题根源:Docker 网络模型
  • 2. 解决方案:端口映射(Port Mapping)
    • 方法 1:重新运行容器并添加端口映射(推荐)
    • 方法 2:获取宿主机的 IP 进行访问(特定情况)
      • 📊 原理示意图
      • 💎 总结

您遇到的问题非常典型,这是由 Docker 的网络模型和容器隔离性导致的。172.17.0.2 是容器的内部私有 IP,无法从您宿主机的浏览器直接访问。


1. 问题根源:Docker 网络模型

hostname -I  # 容器内执行查看容器内ip地址
root@99686ef00ecc:/app# hostname -I
172.17.0.2

Docker 容器运行在一个独立的虚拟网络中(默认是 bridge 网络)。172.17.0.2 是这个容器内部网络的地址,只有以下对象可以访问它:

  1. 同一 Docker 网络下的其他容器
  2. Docker 宿主机本身(即您安装 Docker 的那台电脑或服务器)

您的宿主机浏览器和容器不在同一个网络层面,因此无法直接通过这个私有 IP 通信。


2. 解决方案:端口映射(Port Mapping)

解决方案是在启动容器时,将容器内部的端口 8000 映射到宿主机的一个端口上。这样,访问宿主机的该端口,流量就会自动转发到容器内。

方法 1:重新运行容器并添加端口映射(推荐)

这是最标准、最正确的做法。

  1. 首先,退出当前容器(如果还在运行的话):

    exit
    
  2. 使用 -p 参数重新运行容器,进行端口映射

    # 语法:-p <宿主机端口>:<容器内部端口>
    docker run --rm -it -p 8000:8000 yolov8-cpu:latest /bin/bash
    
    • -p 8000:8000:将宿主机的 8000 端口映射到容器的 8000 端口。
    • 您可以将前面的 8000 改为宿主机任何未被占用的端口,例如 -p 9000:8000
  3. 在容器内启动您的 FastAPI 服务

    python fastapi_yolo_detector2.py
    
  4. 现在,在您宿主机(电脑)的浏览器中访问

    http://localhost:8000
    

    或者

    http://127.0.0.1:8000
    

    localhost127.0.0.1 都代表您的主机自身,现在通过端口映射,请求就会被转发到容器里。

方法 2:获取宿主机的 IP 进行访问(特定情况)

有时您可能需要从局域网内其他设备访问该服务。

  1. 首先,您需要查找到您宿主机在局域网中的真实 IP

    • Windows 宿主机:打开命令提示符,输入 ipconfig,找到“以太网适配器”或“WLAN 适配器”下的 IPv4 地址
    • Linux/macOS 宿主机:打开终端,输入 ifconfigip addr show,找到 eth0wlan0 下的 inet 地址。
  2. 假设您查到的宿主机 IP 是 192.168.1.100,并且您已经按方法 1 做好了端口映射 (-p 8000:8000)。

  3. 那么您可以在同一局域网下的任何设备的浏览器中访问:

    http://192.168.1.100:8000
    

📊 原理示意图

为了帮助您理解,可以看下面这个简单的对比:

没有端口映射 (docker run ...)有端口映射 (docker run -p 8000:8000 ...)
容器网络隔离的私有网络 (172.17.0.2:8000)隔离的私有网络 (172.17.0.2:8000)
宿主机访问无法访问通过 localhost:8000 可以访问
外部访问无法访问通过 宿主机IP:8000 可以访问

💎 总结

  1. 根本原因172.17.0.2 是容器内网地址,宿主机浏览器无法直接访问。
  2. 标准解决方案使用 -p 参数进行端口映射
  3. 正确访问方式:在宿主机浏览器访问 http://localhost:8000
  4. 重启命令:请退出当前容器,使用 docker run -p 8000:8000 ... 重新启动并映射端口。

请按此方法操作,您就能成功从浏览器访问到 FastAPI 服务了。参考gpt。

http://www.dtcms.com/a/353418.html

相关文章:

  • 前端AI应用实践指南:从基础概念到高级实现
  • 云手机的未来发展怎么样?
  • 数据结构(C语言篇):(二)顺序表
  • 状态设计模式
  • 手机冻结技术发展时间轴
  • Flutter项目详解
  • 深度学习实战117-各种大模型(Qwen,MathGPT,Deepseek等)解高考数学题的应用,介绍架构原理
  • C++工程实战入门笔记6-函数(三)关于base16编码的原理和函数模块化实战
  • LINUX --- 网络编程(二)
  • OpenAi在中国拿下“GPT”商标初审!
  • October 2019 Twice SQL Injection
  • Qt图片上传系统的设计与实现:从客户端到服务器的完整方案
  • 对比视频处理单元(VPU)、图形处理器(GPU)与中央处理器(CPU)
  • 多模态模型如何处理和理解图片
  • PPT处理控件Aspose.Slides教程:在.NET中开发SVG到EMF的转换器
  • STM32学习日记
  • 替身演员的艺术:pytest-mock 从入门到飙戏
  • Java基础 8.27
  • 如何使用windows实现与iphone的隔空投送(AirDrop)
  • 【Docker基础】Docker-compose数据持久化与卷管理:深入解析docker volume命令集
  • 【重学MySQL】八十九、窗口函数的分类和使用
  • Mysql杂志(三)
  • 【46页PPT】公司数字化转型规划与实践(附下载方式)
  • 学习Python中Selenium模块的基本用法(7:元素操作-1)
  • 应变片与分布式光纤传感:核心差异与选型指南
  • 极海发布APM32F425/427系列高性能MCU:助力工业应用升级
  • laravel学习并连接mysql数据库
  • Linux 软件编程(十二)网络编程:TCP 并发服务器构建与 IO 多路复用
  • redis---set详解
  • Tortoisegit配置ssh教程