Docker 网络

Docker 网络的底层是Linux的Network Namespace。所以需要先了解Network Namespace。

Network Namespace

Network Namespace 是Linux用于实现网络虚拟化的重要功能,他能创建多个隔离的网络空间,每个独立网络空间内的防火墙、网卡、路由表、邻居表、协议栈都是独立的。

不管是虚拟机还是容器,当运行在独立的命名空间时,就像是一台独立的主机一样。

现在的需求是:创建2个Network Namespace,然后连通他们。

创建2个命名空间

无标题

创建网络接口veth pair

如果要让两个命名空间连通,需要用到虚拟设备接口技术veth pair。该技术需要一对网络接口分别置于两个命名空间中。

下面命令用来创建一对网络接口veth-ns1 和 veth-ns2

ip link add veth-ns1 type veth peer name veth-ns2

此时通过ip link 查看当前网络地址情况,看到新增了两个胡同的veth pair,他们都有MAC地址,但是状态都是DOWN,都没有IP。

无标2题

命名空间添加veth接口

通过ip link set 命令,将刚才两个接口分配给两个命名空间

ip link set veth-ns1 netns ns1
ip link set veth-ns2 netns ns2

此时分别在两个命名空间中执行 ip link 命令,可以看到他们都新增了网络接口

无标3题

为veth 接口分配IP

通过ip netns exec命令,为每个命名空间添加IP

ip netns exec ns1 ip addr add 192.168.1.1/24 dev veth-ns1
ip netns exec ns2 ip addr add 192.168.1.2/24 dev veth-ns2

此时通过在ns1与ns2中运行ip a命令,可以看到接口都有ip了

无标4题

启动veth接口

通过ip link set dev [接口] up 来启动指定的网络接口。

ip netns exec ns1 ip link set dev veth-ns1 up
ip netns exec ns2 ip link set dev veth-ns2 up

相互ping

无5标题

CNM

无6标题

docker网络架构由三部分组成:CNM、Libnetwork 与Driver。

CNM (Container Network Model,容器网络模型):是一种网络连接的解决方案,是一种设计规范、设计标准,其规定了Docker网络的基础组成要素。

CNM中定义了三个基本要素:沙盒Sandbox,终端Endpoint 与网络Network。

  • 沙盒:一个独立的网络栈,包括以太网接口、端口号、路由表、DNS配置等。LInux Network Namespace 是沙盒的标准实现。
  • 终端:虚拟网络接口,负责创建连接,即将沙盒连接到网络上,一个终端只能接入一个网络。
  • 网络:802.1d网桥的软件实现,是需要交互的终端的集合。

Libnetwork

Libnetwork 是开源的、go语言编写、跨平台的CNM的标准实现。

Libnetwork 除了实现CNM的三个组件,还实现了本地服务发现、容器负载均衡、网络控制层与管理层功能。

Driver

无标7题

不同的网络类型对应不同的底层Driver,这些Driver负责在主机上真正实现需要的网络功能,例如创建veth pair 设备等。

无论哪种网络类型。工作方式都是类似的。

  1. 调用Docker 引擎的API 发出请求

  2. Libnetwork 做出框架性处理

  3. 将请求转发给对应的Driver。

通过docker network ls 命令可以查看当前主机所连接的网络及网络类型

无8标题

bridge 网络

bridge 网络 也称单机桥接网络,是Docker 默认的网络模式。该模式只能存在单个Docker主机上,只能连接所在Docker主机上的容器。

docker0网桥

bridge网络 模式中有个默认的虚拟网桥docker0,通过ip a 或者ifconfig 命令可以查看

无标9题

docker0网桥的工作原理

无标10题

在Linux主机上,Docker 的bridge 网络在创建时会创建一个默认网桥docker0。

容器和网桥通过veth pair 技术连接;

网桥与外网通过网络地址转换NAT技术连接,就是将通信的数据包中的内网地址转换为外网地址。

查看网络连接情况

通过 docker network inspect 命令查看当前bridge网络的连接情况。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐