前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Docker 容器如何访问宿主机网络

Docker 容器如何访问宿主机网络

原创
作者头像
Lorin 洛林
发布2025-01-17 18:49:18
发布2025-01-17 18:49:18
2320
举报

前言

  • 最近部署一套系统,使用nginx作反向代理,其中nginx使用docker方式运行:
代码语言:txt
复制
docker run -d --name nginx $PWD:/etc/nginx -p 80:80 -p 443:443 nginx
  • 反向代理配置如下:
代码语言:txt
复制
  location /api {
    proxy_pass http://localhost:1234
  }
  • 配置完成后访问发现服务返回 502 Bad Gateway,进一步查看 nginx 日志发现后端服务拒绝访问,突然恍然大悟,nginx 和后端服务在不同的网络中,那么我们应该如何实现 docker 服务访问宿主网络,下面介绍两种方式:使用宿主机IP、使用host网络。

解决方案

使用宿主机IP

  • 在Linux下安装Docker的时候,会在宿主机安装一个虚拟网卡docker0,我们可以使用宿主机在docker0上的IP地址来访问宿主机网络:
代码语言:txt
复制
$ ip addr show docker0
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:d5:4c:f2:1e brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:d5ff:fe4c:f21e/64 scope link
       valid_lft forever preferred_lft forever
  • 调整后的代理配置
代码语言:txt
复制
  location /api {
    proxy_pass http://172.17.0.1:1234
  }
  • 但Windows和macOS平台下并没有docker0虚拟网卡,此时我们可以使用host.docker.internal这个特殊的DNS名称来解析宿主机IP。
代码语言:txt
复制
  location /api {
    proxy_pass http://host.docker.internal:1234
  }

使用 Host 网络

  • Docker容器运行的时候有host、bridge、none三种网络可供配置。默认是bridge,即桥接网络,以桥接模式连接到宿主机;host是宿主网络,即与宿主机共用网络;none则表示无网络,容器将无法联网。
  • 当容器使用host网络时,容器与宿主共用网络,这样就能在容器中访问宿主机网络,那么容器的localhost就是宿主机的localhost。
  • 在docker中使用--network host来为容器配置host网络
代码语言:txt
复制
docker run -d --name nginx --network host nginx
  • 上面的命令中没像前面一样使用-p 80:80 -p 443:443来映射端口,这是因为本身与宿主机共用了网络,容器中暴露端口等同于宿主机暴露端口。

总结

  • 本文介绍了使用宿主机IP和使用Host网络两种方法来实现从容器中访问宿主机的网络。两种方法各有优劣,使用宿主机IP隔离性更好,但通用性不好;使用host网络,通用性好,但带来了暴露宿主网络的风险。

个人简介

👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.

🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。

🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。

💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。

🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 解决方案
    • 使用宿主机IP
    • 使用 Host 网络
  • 总结
  • 个人简介
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档