Docker 网络别再瞎学了!90% 的新手都栽在了基础上,看完少走 90% 的弯路
文章目录
Docker 网络别再瞎学了!90% 的新手都栽在了基础上,看完少走 90% 的弯路

你是不是学 Docker 也这样?
镜像拉取、容器启停、Dockerfile 写得顺风顺水,一碰到网络直接原地懵圈?
明明照着教程做了端口映射,浏览器死活访问不到容器里的服务;
同主机的两个容器,一个能 ping 通一个不行,翻遍全网也找不到问题根源;
硬着头皮啃 bridge、host、overlay 网络模式,看了半个月,连 IP、网关到底是什么都没搞懂,越学越乱?
别慌!其实,90% 的 Docker 新手学网络翻车,都是因为跳过了前置的基础准备,直接去啃复杂的网络模式。
Docker 网络的底层逻辑,从来不是那些花里胡哨的模式,而是基础网络知识的落地。
今天,我们把学 Docker 网络前必须搞懂的核心内容全部讲透,全程无废话、新手零门槛,看完再学 Docker 网络,直接少走 90% 的弯路。
新手学习 Docker 网络的核心问题
很多人对 Docker 网络的学习路径完全错了:
新手最常见的操作,是刚搞懂容器怎么跑,就直接去搜「Docker 网络模式详解」,对着 bridge、host、none 模式死记硬背,结果一到实操还是全是坑。
而所有问题的根源,都是基础网络知识的缺失。Docker 的网络方案,本质上是对 Linux 网络能力的封装,连 IP、网关、NAT 是什么都不清楚,根本不可能搞懂容器为什么能通信、为什么访问不通。
这篇文章作为 Docker 网络学习的前置准备,我们只解决 4 个核心问题:
- 学 Docker 网络,必须掌握哪些基础网络概念?
- 排查 Docker 网络问题,哪些命令是必用的?
- 容器网络的 4 个灵魂拷问,到底答案是什么?
- 决定容器能不能上网的 NAT,到底是什么?
学 Docker 网络前,必须吃透的 4 个模块
01、必懂的网络基础概念
不用去背复杂的网络七层模型,也不用啃晦涩的路由协议,学 Docker 网络,你只需要先搞懂这 5 个核心概念,用最通俗的话讲明白:
| 概念 | 通俗解释 | 和 Docker 网络的核心关联 |
|---|---|---|
| IP 地址 | 设备在网络里的「门牌号」,分为公网 IP(能上互联网)和私网 IP(局域网内用,比如家里的 192.168.x.x) | 每个容器都会分配一个私网 IP,容器之间、容器和宿主机之间,靠 IP 地址互相通信 |
| 子网掩码 | 用来判断两个 IP 是不是在同一个「小区」(局域网)里,只有同一个局域网的设备,才能直接互通 | Docker 默认的容器网段 172.17.0.0/16,子网掩码 255.255.0.0,就是靠它判断两个容器是否在同一个网段 |
| 网关 | 局域网的「小区大门」,设备要访问局域网外的网络,必须经过网关转发 | 容器的网关,就是 Docker 创建的 docker0 网桥,容器要访问外网,全靠这个网关转发 |
| DNS | 互联网的「电话本」,把我们输入的网址(www.baidu.com)翻译成机器能识别的 IP 地址 | 容器里能 ping 通百度,却 curl 不通网址,90% 都是 DNS 配置出了问题 |
| 端口号 | 一个 IP 地址(门牌号)下的不同「房间号」,一个服务器可以通过不同端口,提供多个服务 | 我们做的端口映射-p 8080:80,就是把宿主机的 8080 端口,和容器里 nginx 服务的 80 端口做了映射 |
很多教程会让你背「输入网址敲回车后发生了什么」这道面试题,这个不用死记硬背!
你只需要知道:这个过程的核心,就是 DNS 解析 + 网络通信,搞懂上面 5 个概念,你自然就懂了。
02、Docker 网络排查必用命令
本文中提到的命令,90% 的新手都会踩坑,这里我们只讲核心用途、实操示例,新手直接抄作业。
- 查看 IP 地址:ip addr(首选)/ifconfig
核心用途:查看宿主机、容器的 IP 地址、网卡信息,是排查网络问题的第一步。
优先用ip addr,系统自带无需安装,功能更全,是 Linux 官方推荐。
Docker 场景实操:
# 查看宿主机的网卡信息,能看到docker0网桥的IP
ip addr
# 进入容器后,查看容器的IP地址
docker container exec -it 容器名 sh
ip addr
- 连通性测试:ping
核心用途:测试两个网络设备之间能不能通,比如宿主机能不能 ping 通容器、容器能不能 ping 通网关、容器能不能上外网。
Docker 场景实操
# 测试容器能不能上外网
docker container exec -it 容器名 ping www.baidu.com
# 测试宿主机和容器之间能不能通信
ping 容器IP地址
- 端口连通性测试:telnet /nc(netcat)
核心用途:测试某个 IP 的端口能不能正常访问,比如容器里的 80 端口是否开放,是排查端口映射问题的核心命令。
优先用nc命令,轻量且绝大多数镜像都自带,用法更简单:
# 测试172.17.0.4的80端口是否通,telnet用法
telnet 172.17.0.4 80
# nc替代用法,功能完全一致
nc -zv 172.17.0.4 80
- 路由路径追踪:tracepath /traceroute
核心用途:测试数据包从当前设备到目标地址,经过了哪些节点,能精准定位「网络不通是在哪一步断了」,解决跨主机容器通信问题必用。
Linux 也可以用traceroute,但需要手动安装(yum install traceroute / apt install traceroute);
tracepath是系统自带的,无需安装,新手优先用。
- Web 服务测试:curl
核心用途:发送 HTTP 请求,测试容器里的 web 服务是否正常运行,是 Docker 网络排查最高频的命令。
Docker 场景实操:
# 测试容器里的nginx服务是否正常
docker container exec -it 容器名 curl http://127.0.0.1:80
# 测试端口映射是否生效,在宿主机执行
curl http://宿主机IP:映射的宿主机端口
03、容器网络的 4 个灵魂拷问,搞懂就入门了
搞懂这 4 个问题,你对 Docker 网络的认知,直接超过 80% 的新手。
我们先还原实操场景:
在一台 Linux 宿主机上,启动了 box1、box2、web1 三个容器。
box1 的 IP 是 172.17.0.2,
box2 是 172.17.0.3,
web1 是 172.17.0.4。
问题 1:容器的 IP 为什么是 172.17.0.x 这个网段?
通俗解答:
这个网段是 Docker默认 bridge 网桥的默认私网网段,Docker 安装后,会自动在宿主机上创建一个叫docker0的虚拟网桥,这个网桥默认就配置了 172.17.0.0/16 的网段。
你启动的每一个容器,Docker 都会从这个网段里,给容器分配一个空闲的 IP 地址,就像路由器给家里的手机、电脑分配 192.168.x.x 的 IP 一样。
补充:这个网段不是固定的,你可以通过修改 Docker 的daemon.json配置文件,自定义容器的默认网段。
问题 2:宿主机为什么能直接 ping 通容器的 172.17.0.2 地址?
通俗解答:
docker0 网桥是宿主机和容器之间的「桥梁」,宿主机是这个网桥的「管理员」,和所有容器都在同一个局域网里。
容器的虚拟网卡,通过 docker0 网桥和宿主机的网络栈连在了一起,相当于它们在同一个「小区」里,自然就能直接 ping 通。
问题 3:为什么在容器里,能直接 ping 通 www.baidu.com(外网)?
通俗解答:
这就是我们后面要讲的NAT 技术在起作用。
容器的 IP 是私网 IP,只能在宿主机内部用,不能直接上互联网。当容器要访问外网时,Docker 会通过 NAT 技术,把容器的私网 IP,转换成宿主机的公网 / 局域网 IP,再去访问外网。
就像你家里的手机,用的是 192.168.x.x 的私网 IP,却能刷抖音、逛百度,全靠路由器的 NAT 做地址转换,是一个道理。
问题 4:同一台宿主机上的 box1 和 box2,为什么能直接互通?
通俗解答:
两个容器都连在了同一个 docker0 网桥上,属于同一个网段、同一个局域网,而且 Docker 默认的防火墙规则,允许同一个网桥上的容器互相通信。
就像你家里的两台手机,连了同一个 WiFi,自然就能互相传文件、投屏,没有任何阻碍。
04、NAT 技术,Docker 网络的底层核心
这里我们只讲新手能懂、和 Docker 强相关的核心内容。
- NAT 到底是什么?
NAT 全称「网络地址转换」,最开始是为了解决 IPv4 地址不够用的问题。
我们前面说过,私网 IP 不能直接上互联网,只有公网 IP 能访问互联网。NAT 的核心作用,就是做私网 IP 和公网 IP 的转换,让无数个用私网 IP 的设备,能共用一个公网 IP 上网。
我们可以把 NAT 比作小区的快递驿站:
- 你家的门牌号是私网 IP,只有小区内能找到;
- 驿站的地址是公网 IP,全互联网都能找到;
- 你往外寄快递(访问外网),驿站会把你的家庭地址,改成驿站的地址发出去;
- 外面的快递回包,驿站会再转交给你家,全程你不用暴露自己的家庭地址。
- NAT 和 Docker 网络的核心关联
Docker 的容器网络,90% 的功能都依赖 NAT 实现:
- 容器访问外网:靠源地址 NAT(SNAT)实现,把容器的私网 IP 转换成宿主机的 IP,访问互联网。
- 端口映射外网访问容器:靠目的地址 NAT(DNAT)实现,把访问宿主机端口的请求,转发到容器的对应端口上,这就是
-p 宿主机端口:容器端口的底层原理。
搞懂了 NAT,你就懂了容器为什么能上网、为什么端口映射后就能被外网访问,再学 Docker 网络模式,会轻松 10 倍。
写在最后
很多人觉得 Docker 网络难,本质上是把它想复杂了。
Docker 从来没有创造新的网络技术,只是把 Linux 的网络能力,做了一层封装,让容器能更方便地使用。
如果,你觉得这篇文章对你有帮助,欢迎点赞、在看、转发给身边的朋友。
关注我,我将持续更新更多 Docker、云原生、Python 的实战干货。从 Docker 基础到容器化部署,从 Python 入门到后端开发。
我将把我踩过的坑、总结的实战经验全部分享给你,帮你少走弯路,快速入门。
其他疑问
Docker 新手崩了!镜像删不掉、版本不一致、构建总失败?一篇讲透全流程操作
Dockerfile 别再瞎写了!90% 的人都踩过的坑,底层逻辑 + 最佳实践一篇讲透
Dockerfile 新手秘籍!4 个封神技巧,镜像从 1.14G 瘦到 6M,构建速度快10倍
Flask镜像打包教程,90%的Docker新手必踩的4个致命坑!我全给你踩过了,新手直接抄
Docker 新手抄作业!Dockerfile 的底层逻辑 + 避坑红线 + 最佳实践,看这一篇就够了
相关内容我都给大家做好了,感兴趣的朋友来「我的主页」找一找,直接就可以看到。
欢迎关注 「王二哥的技术笔记」,每天分享「FastAPI」、「Docker」、「Flask」、「职场」有趣干货,千万不要错过!
更多推荐




所有评论(0)