从零开始的网络链路之旅 —— 从 Docker 容器到云端服务器

场景假设

当我们坐在公司工位上,打开自己的 Mac,运行一个 Docker 容器,里面的服务需要访问腾讯云上的一台 Linux CVM 服务器。

看似只是“一个容器访问云服务器”这么简单的事,但中间其实跨越了容器网络、宿主机网络、公司内网、互联网骨干网、云厂商网络等多个环节。

每一跳都可能是性能瓶颈或故障点。

今天,我们要做的,就是从 0 开始把这个链路跑通、看懂、拆解。这一篇作为系列开篇,先带你俯瞰全局。


1. 为什么要学这一系列?

在面试、排查问题、或者搭建环境时,我们经常会碰到这样的情况:

  • Docker 容器能 ping 宿主机,但不能访问外网
  • 本机能 curl 云服务器,容器里却不行
  • 云服务器端口明明开放,外网就是访问不了
  • 网络延迟突然飙高,但不知道卡在哪一段

本质原因:我们对整个通信链路缺乏全局认知,只会在某一个点上试探性地排查,却不知道它和上游/下游是怎么衔接的。

本系列文章的目标,就是让我们能把这条链路从头到尾画出来,并且在任何一个环节出问题时,知道用什么工具排查


2. 总览:从 Docker 容器到云服务器的完整路径

下面是这次系列的核心链路示意图:

你可以把它想象成一个跨越多个“国家”的旅行——每经过一个国境线,都要换交通工具、过海关、验证身份。


3. 我们要解决的核心问题

本系列将围绕两个核心问题展开:

  1. 容器如何访问公网?
    • 容器本身没有公网 IP,它的网络是怎么通过宿主机 NAT 出去的?
    • 宿主机又是如何通过公司内网出口 NAT 到互联网的?
    • DNS 解析在容器里和宿主机里是一样的吗?
  2. 公网如何访问云服务器?
    • 云厂商网络是怎么把流量送到你的 CVM 的?
    • TCP/TLS 是怎么建立连接的?
    • 中间有哪些安全策略可能会阻断访问?

4. 关键知识点预告

为了让你能跟得上整个链路,我们会在后续几篇里分别讲解以下主题:

  • 容器网络 Docker 的网络模式、veth pair、docker0 网桥、iptables NAT 规则。
  • 内网出口与 NAT 路由表、默认网关、NAT 出口、防火墙策略。
  • 公网路由与 DNS BGP、ISP、DNS 递归解析和权威解析流程。
  • 云厂商网络 SLB/ELB、Anycast、云内部私网路由、安全组。
  • TCP/TLS 协议 三次握手、四次挥手、TLS 握手、证书验证。
  • 故障排查方法 ping、curl、traceroute、tcpdump、iptables 规则分析。

5. 后续文章路线

  1. 本机与 Docker 容器的网络世界 → 容器是如何通过宿主机联网的
  2. 从宿主机到公司网络出口 → 内网是如何 NAT 出公网的
  3. 互联网传输与 DNS 解析 → 数据包如何在 ISP 和骨干网上传递
  4. 进入云厂商网络与负载均衡 → 云网络是怎么找到你的服务器的
  5. TCP/TLS 握手与应用层通信 → 协议细节与安全加密
  6. 全链路复盘与常见故障排查 → 从 0 到 1 的排查闭环

6. 预告:下一篇我们要干什么?

第 2 篇里,我们将从最微观的地方开始——Docker 容器内部的网络

我们会启动一个容器,手动 ping 宿主机、抓包,看它的数据包是怎么通过 veth pair 和 docker0 网桥流转的,并解释 NAT 是怎么让它访问外网的。

到时候,我们会画出这样一张图(示意):

[ 容器 eth0 ] ←→ [ vethX ] ←→ [ docker0 ] ←→ [ 宿主机 eth0 ]
       容器内网IP       veth pair连接           宿主机内网IP