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

📅 2026/7/1 17:23:02
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启动 MongoDBdockerrun-d\--namemongo\--networkapp-net\-eMONGO_INITDB_ROOT_USERNAMEroot\-eMONGO_INITDB_ROOT_PASSWORD123456\-vmongo-data:/data/db\mongo:7启动后端dockerrun-d\--nameapi\--networkapp-net\-p3000:3000\-eMONGO_URLmongodb://root:123456mongo:27017/app?authSourceadmin\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-net7. 端口映射和 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:270178. 为什么容器里不能写 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 alpinesh10. 第三篇小结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/