news 2026/7/1 17:22:47

Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通

Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通

学 Docker 网络时,最容易卡在一句话:

容器里面的 localhost,不是你的电脑。

很多后端项目本地可以连接数据库,一放进 Docker 就报错:

ECONNREFUSED 127.0.0.1:27017

原因往往不是 MongoDB 挂了,而是你在容器里写了localhost

这篇文章专门讲 Docker 网络。


1. 先记住一个原则

在宿主机上访问容器:用 localhost + 映射端口 容器访问另一个容器:用容器名 / 服务名 + 容器端口

比如:

浏览器访问后端: localhost:3000 后端容器访问 MongoDB 容器: mongodb://mongo:27017/app

不要混用。


2. Docker 默认 bridge 网络

安装 Docker 后,默认会有几个网络:

dockernetworkls

常见输出:

NETWORK ID NAME DRIVER SCOPE xxxx bridge bridge local xxxx host host local xxxx none null local

其中最常见的是bridge

可以把 bridge 理解成 Docker 在你电脑里创建的一台“虚拟交换机”:

宿主机 │ ├── docker0 / bridge 网络 │ ├── container A │ ├── container B │ └── container C │ └── 本机网络

容器加入 bridge 网络后,会获得一个内部 IP。


3. 查看网络详情

dockernetwork inspect bridge

你会看到类似信息:

{"Name":"bridge","Driver":"bridge","IPAM":{"Config":[{"Subnet":"172.17.0.0/16","Gateway":"172.17.0.1"}]}}

这里有两个重要字段:

字段含义
SubnetDocker 网络使用的子网范围
Gateway这个 Docker 网络的网关

172.17.0.0/16表示这个网络里可以分配一批内部 IP,例如:

172.17.0.2 172.17.0.3 172.17.0.4

这些 IP 主要用于容器之间通信。


4. 为什么不推荐直接用容器 IP?

你可能会想:既然容器有 IP,那后端连接 MongoDB 写 IP 不就行了?

比如:

mongodb://172.17.0.2:27017/app

不推荐。

原因是容器 IP 可能变化:

  • 容器删除后重建,IP 可能变;
  • Compose 重新启动服务,IP 可能变;
  • 网络重新创建,IP 也可能变。

更推荐使用容器名或服务名。

mongodb://mongo:27017/app

这类似一个内部 DNS。


5. 自定义 bridge 网络

默认 bridge 网络能用,但实际项目更推荐自己创建网络。

dockernetwork create app-net

查看:

dockernetworkls

启动 MongoDB:

dockerrun-d\--namemongo\--networkapp-net\-eMONGO_INITDB_ROOT_USERNAME=root\-eMONGO_INITDB_ROOT_PASSWORD=123456\-vmongo-data:/data/db\mongo:7

启动后端:

dockerrun-d\--nameapi\--networkapp-net\-p3000:3000\-eMONGO_URL="mongodb://root:123456@mongo:27017/app?authSource=admin"\my-api:1.0

后端里的mongo就能解析到 MongoDB 容器。


6. 创建指定子网的网络

有时公司内网、VPN、虚拟机网络可能和 Docker 默认网段冲突。

这时可以指定 Docker 网络的子网:

dockernetwork create\--driverbridge\--subnet172.30.0.0/16\--gateway172.30.0.1\app-net

解释一下:

参数作用
--driver bridge使用 bridge 网络驱动
--subnet 172.30.0.0/16指定网络子网
--gateway 172.30.0.1指定网关
app-net网络名字

创建后查看:

dockernetwork inspect app-net

7. 端口映射和 Docker 网络不是一回事

很多人会把-p和 Docker 网络混在一起。

其实它们解决的问题不同。

7.1-p解决的是宿主机访问容器

-p3000:3000

表示:

宿主机 localhost:3000 -> 容器 3000

也就是浏览器、Postman、curl 从宿主机访问容器。

7.2 Docker 网络解决的是容器访问容器

api 容器 -> mongo 容器

这时不需要-p 27017:27017,只要两个容器在同一个网络里,后端就能访问:

mongodb://mongo:27017/app

当然,如果你还想从宿主机上的 MongoDB Compass 连接容器里的 MongoDB,那就需要映射端口:

-p27017:27017

8. 为什么容器里不能写 localhost?

假设后端容器里写:

mongodb://localhost:27017/app

在后端容器看来,localhost指的是:

后端容器自己

不是 MongoDB 容器,也不是宿主机。

所以它会在后端容器内部找 27017 端口,找不到就报错。

正确写法:

mongodb://mongo:27017/app

这里的mongo是 MongoDB 容器名或 Compose 服务名。


9. 常见排查命令

查看网络:

dockernetworkls

查看网络详情:

dockernetwork inspect app-net

查看容器属于哪个网络:

dockerinspect api

进入容器:

dockerexec-itapish

在容器里测试服务名解析:

pingmongo

有些精简镜像没有ping,可以用:

getent hosts mongo

或者临时启动一个网络测试容器:

dockerrun--rm-it--networkapp-net alpinesh

10. 第三篇小结

Docker 网络可以这样记:

宿主机访问容器:localhost + -p 映射端口 容器访问容器:服务名/容器名 + 容器端口 容器里的 localhost:容器自己

常见命令:

# 查看网络dockernetworkls# 创建网络dockernetwork create app-net# 创建指定子网的网络dockernetwork create--driverbridge--subnet172.30.0.0/16--gateway172.30.0.1 app-net# 查看网络详情dockernetwork inspect app-net# 让容器加入网络dockernetwork connect app-net api

下一篇进入 Dockerfile:如何把自己的项目打成镜像。


参考资料

  • Docker networking overview: https://docs.docker.com/engine/network/
  • Bridge network driver: https://docs.docker.com/engine/network/drivers/bridge/
  • docker network create: https://docs.docker.com/reference/cli/docker/network/create/
  • Docker Compose networking: https://docs.docker.com/compose/how-tos/networking/
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 17:22:26

3分钟掌握NCM解密:终极免费工具实现音乐格式自由转换

3分钟掌握NCM解密:终极免费工具实现音乐格式自由转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式无法在其他播放器使用而烦恼吗?ncmdump为你提供完美的本地音乐解密解决方案…

作者头像 李华
网站建设 2026/7/1 17:20:14

Go 语言 fmt 与 log 打印方式详解

在 Go 语言里,打印信息最常用的两个包是 fmt 和 log。fmt 更偏向通用格式化输出,可以输出到控制台、字符串、文件或其他 io.Writer。log 更偏向日志输出,默认会带时间信息,并且提供了打印后退出程序、打印后触发 panic 等能力。一…

作者头像 李华
网站建设 2026/7/1 17:19:04

【观止·诗史汇 HarmonyOS 实战系列 07】兴替明鉴:四维总览与六类分析的朝代洞察模型

【观止诗史汇 HarmonyOS 实战系列 07】兴替明鉴:四维总览与六类分析的朝代洞察模型前六篇已经把《观止诗史汇》的两条主线铺出来了:前四篇解决工程骨架、首页和诗文内容包,第五篇把一首诗的详情页拆成正文、译注、简析、作者、朗读、收藏、笔…

作者头像 李华
网站建设 2026/7/1 17:18:34

Java计算机毕设之基于 SpringBoot 的加密云端日记本管理系统的设计与实现 基于 SpringBoot 的在线日记归档查询系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/7/1 17:06:32

Unity 外部资源加载器(图片+视频+音频+文本)

Unity 外部资源加载器:一个将媒体资源与 Unity 应用主体完全分离的框架,无需重新打包程序即可更新内容。它全面支持外部的图片(用于 UI)、视频、音频和文本文件。 Unity 外部资源加载器 核心功能与支持格式 一个将媒体资源与 Un…

作者头像 李华
网站建设 2026/7/1 17:03:12

Hermes精装攻略|从毛坯到全能助手。工欲善其事,必先利其器

90%的人没有用出Hermes的真正潜力,精装后的Hermes,和默认版完全是两个东西,毛坯临时聪明助手,精装有记忆、有工具、多感官、会进化的专属数字分身,手把手教你从零精装,希望对你有所帮助。 1、先定身份&…

作者头像 李华