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 个核心问题:

  1. 学 Docker 网络,必须掌握哪些基础网络概念?
  2. 排查 Docker 网络问题,哪些命令是必用的?
  3. 容器网络的 4 个灵魂拷问,到底答案是什么?
  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% 的新手都会踩坑,这里我们只讲核心用途、实操示例,新手直接抄作业。

  1. 查看 IP 地址:ip addr(首选)/ifconfig

核心用途:查看宿主机、容器的 IP 地址、网卡信息,是排查网络问题的第一步。

优先用ip addr,系统自带无需安装,功能更全,是 Linux 官方推荐。

Docker 场景实操

# 查看宿主机的网卡信息,能看到docker0网桥的IP
ip addr

# 进入容器后,查看容器的IP地址
docker container exec -it 容器名 sh
ip addr
  1. 连通性测试:ping

核心用途:测试两个网络设备之间能不能通,比如宿主机能不能 ping 通容器、容器能不能 ping 通网关、容器能不能上外网。

Docker 场景实操

# 测试容器能不能上外网
docker container exec -it 容器名 ping www.baidu.com

# 测试宿主机和容器之间能不能通信
ping 容器IP地址
  1. 端口连通性测试: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
  1. 路由路径追踪:tracepath /traceroute

核心用途:测试数据包从当前设备到目标地址,经过了哪些节点,能精准定位「网络不通是在哪一步断了」,解决跨主机容器通信问题必用。

Linux 也可以用traceroute,但需要手动安装(yum install traceroute / apt install traceroute);

tracepath是系统自带的,无需安装,新手优先用。

  1. 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 强相关的核心内容。

  1. NAT 到底是什么?

NAT 全称「网络地址转换」,最开始是为了解决 IPv4 地址不够用的问题。

我们前面说过,私网 IP 不能直接上互联网,只有公网 IP 能访问互联网。NAT 的核心作用,就是做私网 IP 和公网 IP 的转换,让无数个用私网 IP 的设备,能共用一个公网 IP 上网。

我们可以把 NAT 比作小区的快递驿站:

  • 你家的门牌号是私网 IP,只有小区内能找到;
  • 驿站的地址是公网 IP,全互联网都能找到;
  • 你往外寄快递(访问外网),驿站会把你的家庭地址,改成驿站的地址发出去;
  • 外面的快递回包,驿站会再转交给你家,全程你不用暴露自己的家庭地址。
  1. 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」、「职场」有趣干货,千万不要错过!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐