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

为什么 Linux 上默认没有 host.docker.internal

在 Linux 环境中,host.docker.internal 是 Docker 为容器提供的一个特殊 DNS 名称,用于指向宿主机的 IP 地址(类似 macOS/Windows 中的行为)。但这个功能在 Linux 上默认不启用,需要手动配置才能使用。以下是详细解释和解决方案:


1. 为什么 Linux 上默认没有 host.docker.internal

  • 历史原因: Docker 最初在 macOS/Windows 上通过虚拟机运行,host.docker.internal 被设计为指向宿主机。而 Linux 是原生运行 Docker 的,默认没有此机制。

  • 网络隔离: Linux 容器默认使用桥接网络(bridge),与宿主机隔离,无法直接通过简单域名访问宿主机。


2. Linux 上如何让容器访问宿主机?

方法 1:直接使用宿主机 IP
  • 通过 ip route 命令获取宿主机的 IP(通常是 docker0 网卡的网关):

    bash

    复制

    下载

    ip route show default | awk '{print $3}'

    输出示例:

    复制

    下载

    172.17.0.1
  • 在 Dockerfile 或启动命令中,将 host.docker.internal 替换为宿主机 IP:

    diff

    复制

    下载

    -Dskywalking.collector.backend_service=host.docker.internal:11800
    +-Dskywalking.collector.backend_service=172.17.0.1:11800
方法 2:运行时添加 --add-host 参数
  • 运行容器时,通过 --add-host 将 host.docker.internal 绑定到宿主机的网关 IP:

    bash

    复制

    下载

    docker run --add-host=host.docker.internal:host-gateway your-image
    • host-gateway 是 Docker 的保留关键字,自动解析为宿主机的网关 IP。

方法 3:使用 network_mode: host
  • 在 Docker Compose 或启动命令中,将容器的网络模式设为 host,使容器共享宿主机的网络栈:

    yaml

    复制

    下载

    # docker-compose.yml
    services:your-service:network_mode: host
    • 优点:容器内直接使用 127.0.0.1 即可访问宿主机服务。

    • 缺点:容器与宿主机共享网络,可能导致端口冲突。

方法 4:自定义 Docker 网络
  • 创建自定义网络并指定网关:

    bash

    复制

    下载

    docker network create --driver bridge --subnet 172.25.0.0/16 my-net
  • 运行容器时加入该网络,并通过网关 IP 访问宿主机。

http://www.xdnf.cn/news/6055.html

相关文章:

  • 【内网渗透】——NTML以及Hash Relay
  • MySQL Explain 中 Type 与 Extra 字段详解
  • MySQL 服务器配置和管理(上)
  • 监听用户切换浏览器标签页,切换回页面刷新页面
  • 代码随想录算法训练营第60期第三十五天打卡
  • 嵌入式自学第二十天(5.13)
  • AIStarter新功能上线:模型管理与创作者收益系统全面升级,助力AI开发效率提升
  • 函数定义、 异常处理、 迭代器协议、内置函数、返回值
  • WiFi密码查看器打开软件自动获取数据
  • 通用Agent如何评估效果:智能体评测方案AgentCLUE-General(Manus暂时领先)
  • 人形机器人的 9 个分岔口
  • 图灵爬虫练习平台 第十四题 逆向
  • 一款倒计时结束强制关闭浏览器的插件
  • 可视化图解算法38:重建二叉树
  • C++标准流详解:cin/cout的绑定机制与cerr/clog的缓冲差异
  • Spark集群搭建-Standalone
  • 芯片:金线的作用
  • 关于 ast: Babel AST 全类型总览
  • 在Java中实现Parcelable接口和Serializable接口有什么区别?
  • trame实现双视图(返场版)
  • MySQL 日期计算方法 date_sub()、date_add()、datediff() 详解-文中有示例帮助理解
  • java基础-泛型
  • tails os系统详解
  • 实物工厂零件画图案例(上)
  • 进程与线程:09 进程同步与信号量
  • Linux的域名解析服务器
  • OAuth安全架构深度剖析:协议机制与攻防实践
  • 【Nacos】env NACOS_AUTH_IDENTITY_KEY must be set.
  • SparkSQL 连接 MySQL 并添加新数据:实战指南
  • uniapp+vue3中自动导入ref等依赖