Docker 网络的理论基础
本章节主要是要理解网络的理论,实际操作的内容并不多。
Network Namespace
Docker 网络的底层原理是Linux的Network Namespace。
Network Namespace
是 Linux 内核提供的,用于实现网络虚拟化
的重要功能。它能创建多个隔离的网络空间,每个独立的网络空间内的防火墙、网卡、路由表、邻居表、协议栈等都是独立的。
不管是虚拟机还是容器,当运行在独立命名空间是,就像是一台单独的主机。
CNM
CNM : Container Network Model
: 容器网络模型。是一种网络连接的解决方案,是一种设计规范、设计标准,它规定了Docker网络的基础组成要素。
它定义了三个基本要素 :
沙盒Sandbox
,终端Endpoint
,网络Network
1、沙盒
: 一个独立的网络栈,其中包括以太网接口、端口号、路由表、DNS配置等。Linux 的 Network Namespace 是沙盒的标准实现。
2、终端
: 虚拟网络接口,主要负责创建连接,即将沙盒链接到网络上。一个终端只能接入某一个网络。
3、网络
: 802.1d(就是一个标准) 网桥的软件实现,是需要交互的终端的集合。
Libnetwork
CNM
是设计规范,而Libnetwork
是开源的、由 Go 语言编写的、跨平台的 CNM 的 标准实现。
LIbnetwork
除了实现了 CNM 的三个组件外,还实现了本地服务发现、容器负载均衡、以及网络控制层与管理层的功能。
Driver
每种不同的网络类型都有对应的不同的底层Driver,这些Driver负责在主机上真正实现需要的网络功能,例如 veth-pair 设备等。
不过,无论哪种网络类型,其工作方式都是类似的:1) 通过调用Docker引擎的API发出请求;
2)由Libnetwork 做出框架性的处理;
3)将请求转发给相应的Driver。
通过docker network ls
命令可以查看当前主机所连接的网络及网络类型。

补充-Linux 中的常用网络命令
ip address 命令
可以简写 为
ip addr
或ip a
作用 : 查看、添加和删除网络接口的 IP 地址信息。
【查看所有网络接口的IP地址信息】:
ip address show
orip address
orip addr
orip a
作用和
ifconfig
命令效果一样
【查看某个网络的IP地址信息】:
ip address show eth0
: eth0 就是网络接口
【添加一个IP到某个网络接口】:
ip address add 192.168.1.100/24 dev eth0
:
add\] : 表示添加,后面跟着的就是 IP 地址 \& 子网掩码
【删除某个网络接口的IP】:
ip address delete 192.168.1.100 dev eth0
:
delete\] : 表示删除,可以简写为 \[del\]。
ip link 命令
作用 :查看、启用、禁用网络接口以及修改一些接口级别的设置。
【查看所有网络接口及状态】:
ip link show
【查看特定网络接口的信息】:
ip link show eth0
【启用某个网络接口】:
ip link set dev eth0 up
【禁用某个网络接口】:
ip link set dev down
【给网络接口分配命名空间】:
ip link set veth0 netns NamespaceName
【添加 veth 对 (虚拟网络接口对)】 - 关键:
veth 对是成对出现的虚拟网络接口,数据发送到其中一个接口会从另一个接口接收,反之亦然。
就相当于一根网线。veth 对可以连接不同的 Namespace ,实现两个网络的互联互通。
命令 :ip link add veth0 type veth peer name veth1
【这行命令做了以下几件事】:
1)创建了一个名为 veth0 的虚拟网络接口。
2)创建了一个名为 veth1 的虚拟网络接口,它是 veth0 的对端。
3)将这两个接口配对,使得它们之间可以直接通信。
【删除veth 对】:
ip link delete veth0
会自动的删除另一个与之配对的网络端口。
ip netns 命令
作用 : 是一个管理和操作网络命名空间(network namespaces)的命令。
【查看所有的网络命名空间】:
ip netns list
【添加一个网络命名空间】:
ip netns add namespace-name
【删除一个网络命名空间】:
ip netns delete namespace-name
【在特定的网络命名空间中执行命令】:
ip netns exec namespace-name xxxxx
xxxxx\] 表示要执行的命令,例如 ip address add ... 等操作网络的命令。
brctl 命令
使用前安装一下 :
yum install -y bridge-utils
【作用 】 :
brctl
是一个用于 Linux 系统中管理以太网桥接接口的命令行工具。
- 它允许用户创建、维护和检查 Linux 内核中的以太网桥(bridge),从而实现网络流量在多个网络接口之间的转发,就像它们连接到同一个物理交换机一样。
- 这对于需要在同一台机器上实现网络隔离或构建复杂的网络拓扑结构特别有用,比如在虚拟化环境、容器网络等场景中。
【查看所有的网桥】
brctl show
【新增/删除 一个网桥】新增 :
brctl addbr bridge-name
删除 :
brctl delbr bridge-name
【添加/删除 接口到网桥】添加 :
brctl addif bridge-name interface-name
删除 :
brctl delif bridge-name interface-name
实践-对Network Namespace 的理解
需求描述
通过手动创建两个Network Namespace,并 分别创建对应的 IP地址,创建虚拟网络接口对,能够相互ping通。
表示两个网络能够正常访问。以此来体会 网络命名空间的实际作用。
网络拓扑简图

实际操作
创建两个命名空间
ip netns add ns1
ip netns add ns2
创建虚拟网络接口 veth pair
如果想要让两个网络命名空间连通,则需要用到虚拟设备接口技术 veth pair。该技术需要一对网络接口分别置于两个命名空间中。
【创建网络接口对】 :
ip link add veth-ns1 type veth peer name veth-ns2
【查看网络接口对】 :
ip link show
: 具有MAC地址、不具有IP、状态为 DOWN
把网络接口分配给命名空间
ip link set veth-ns1 netns ns1
ip link set veth-ns2 netns ns2
分配完成后,可以在命名空间下查看对应的接口:
ip netns exec ns1 ip address
: 在ns1
中执行ip address
命令,查看网络信息。
给网络命名空间分配IP
【给两个命名空间中的 各自的网络端口 添加IP】
ip netns exec ns1 ip address add 192.168.1.100/24 dev veth-ns1
ip netns exec ns2 ip address add 192.168.1.200/24 dev veth-ns2
启用网络端口
【将两个命名空间中的 各自的端口状态置成 up】
ip netns exec ns1 ip link set dev veth-ns1 up
ip netns exec ns2 ip link set dev veth-ns2 up
测试连通性
【分别在命名空间中 ping 另一个命名空间的IP】
ip netns exec ns1 ping 192.168.1.200
ip netns exec ns2 ping 192.168.1.100
以上,两个端口互相能够 ping 通,证明我们手动创建的两个网络通了。
Docker中常用的网络命令
【查看网络】
- 列出所有的网络 :
docker network ls
- 查看指定网络的详细信息 :
docker network inspect bridge[网络名称]
【创建一个新的bridge类型的网络 】
docker network create -d bridge networkName
[-d bridge]
表示指定网络的类型为 bridge
【将现有容器连接到某个网络 】
docker network connect networkName containerName
【将容器从网络中断开连接 】
docker network disconnect networkName containerName
【创建容器时即指定网络】
docker run --name containerName --network networkName ... image:tag ...
[--network networkName] 表示容器要加入的网络
【删除网络 】
docker network rm networkName
bridge 网络
Docker Bridge 网络
是 Docker 默认的网络驱动 。当你安装 Docker 时,它会自动创建一个名为 docker0 的桥接网络,这是一种虚拟以太网桥 ,只能
用于转发配置在同一宿主机
上的不同 Docker 容器
之间的数据包。
基本概念
【Bridge 网络】:
* 默认情况下,Docker 使用 bridge 驱动来创建一个私有的内部网络,
* 该网络允许在同一个宿主机上运行的容器相互通信。
【docker0】:
* 这是 Docker 在安装时自动创建的一个桥接网络接口,
* 所有使用默认 bridge 网络的新建容器都会连接到这个网络,并通过它进行通信。
【IP 地址分配】:
* Docker 会为每个连接到默认 bridge 网络的容器分配一个 IP 地址。
* 这些 IP 地址是从一个预定义的私有地址池中分配出来的。
特性
【自动配置】:
Docker 自动处理大多数配置细节,包括创建和管理 docker0 网桥、为容器分配 IP 地址等。
【隔离性】:
默认情况下,不同的 Docker 主机上的容器即使位于相同的 IP 地址范围内也不会相互干扰,因为它们彼此间是完全隔离的。
【端口映射】:
为了使外部网络能够访问容器内的服务,可以使用 -p 或 --publish 标志将容器的端口映射到宿主机上的端口。
【DNS 解析】:
对于连接到同一自定义 bridge 网络的容器,Docker 提供内置的 DNS 服务器以便于容器之间可以通过名称互相解析。
一张图,多个容器和多个网络的结构:
- 默认情况下,容器会自动加入 docker0 网桥;
- 若指定容器加入某个网络也是支持的;
- 一个容器可以在多个网络中。

none 网络(了解)
none 网络
是一种特殊的网络模式,它实际上**不为容器提供任何网络功能**
。
- 当你启动一个容器并指定使用 none 网络模式时,该容器将不会有任何网络接口除了回环接口(loopback interface)。
- 这意味着容器将被完全隔离在网络层面,无法与外部网络通信,也无法被外部网络访问。
- 启动容器时指定none网络 :添加
--network none
参数
host 网络(了解)
host 网络
是一种允许容器共享宿主机网络栈的网络配置方式。
当一个容器使用 host 网络模式运行时,它不会获得自己独立的网络命名空间,而是直接使用宿主机的网络接口。
这意味着该容器可以直接监听宿主机的所有网络接口,并且其网络配置(如端口)与宿主机完全一致。
启动容器时指定host网络:添加
--network host
参数
【Host 网络模式的特点】
直接访问宿主机网络
:使用 host 网络模式的容器可以直接访问宿主机的所有网络接口,这包括物理网卡、虚拟网卡等。
无网络隔离
:与默认的 bridge 或其他网络模式不同,host 模式下的容器不具有网络层面的隔离性。容器和宿主机在网络层面上几乎是等同的。
端口无需映射
:由于容器直接使用宿主机的网络栈,因此不需要通过 -p 或 --publish 参数来发布容器端口到宿主机上,因为它们已经在同一个网络空间内。
Linux 专属:值得注意的是,host 网络模式仅在 Linux 上可用.