目录
[1 基础概念回顾](#1 基础概念回顾)
[1.1 命名空间概述](#1.1 命名空间概述)
[1.2 命名空间的类型](#1.2 命名空间的类型)
[2 网络命名空间(NET Namespace)详解](#2 网络命名空间(NET Namespace)详解)
[2.1 网络命名空间的概念](#2.1 网络命名空间的概念)
[2.2 网络命名空间的作用](#2.2 网络命名空间的作用)
[2.3 网络命名空间的工作原理](#2.3 网络命名空间的工作原理)
[2.3.1 网络命名空间的创建与销毁](#2.3.1 网络命名空间的创建与销毁)
[2.3.2 网络命名空间的网络接口](#2.3.2 网络命名空间的网络接口)
[2.3.3 网络命名空间的网络配置](#2.3.3 网络命名空间的网络配置)
[3 网络命名空间在Docker中的应用](#3 网络命名空间在Docker中的应用)
[3.1 Docker容器中的网络命名空间](#3.1 Docker容器中的网络命名空间)
[3.2.1 Bridge模式](#3.2.1 Bridge模式)
[3.2.2 Host 模式](#3.2.2 Host 模式)
[3.2.3 None模式](#3.2.3 None模式)
[3.3 网络命名空间与Docker网络插件](#3.3 网络命名空间与Docker网络插件)
[4 网络命名空间的实践示例](#4 网络命名空间的实践示例)
[5 总结](#5 总结)
引言
在容器化技术蓬勃发展的今天,Docker 凭借其轻量级、高效隔离和快速部署等特性,成为应用部署和管理的首选方案。而命名空间(Namespace)作为Docker实现资源隔离的核心技术之一,为容器提供了独立的运行环境。其中,网络命名空间(NET Namespace)负责隔离网络资源,使得每个容器都能拥有独立的网络栈,包括网络接口、IP 地址、路由表等。
1 基础概念回顾
1.1 命名空间概述
命名空间是 Linux 内核提供的一种资源隔离机制,它允许将全局资源(如进程 ID、用户 ID、网络接口等)封装在一个独立的命名空间中,使得不同命名空间内的进程无法直接访问或干扰其他命名空间内的资源。
命名空间为容器提供了独立的运行环境,使得容器内的进程就像运行在一个独立的操作系统中一样。
1.2 命名空间的类型
Linux 内核提供了多种类型的命名空间,每种命名空间负责隔离不同类型的资源,常见的命名空间类型包括:
- Mount Namespace:隔离文件系统挂载点
- UTS Namespace:隔离主机名和域名
- IPC Namespace:隔离进程间通信资源(如消息队列、共享内存等)
- PID Namespace:隔离进程ID
- Network Namespace(NET Namespace):隔离网络接口、IP地址、路由表等网络资源
- User Namespace:隔离用户ID和组ID
2 网络命名空间(NET Namespace)详解
2.1 网络命名空间的概念
- 网络命名空间是 Linux 内核提供的一种用于隔离网络资源的机制,每个网络命名空间都有自己独立的网络栈,包括网络接口、IP 地址、路由表、防火墙规则等
- 通过网络命名空间,不同的容器可以拥有独立的网络环境,彼此之间互不干扰
2.2 网络命名空间的作用
- 网络隔离:网络命名空间使得容器内的网络资源与宿主机及其他容器内的网络资源相互独立,提高了系统的安全性,容器内的网络操作不会影响到宿主机或其他容器的网络环境
- 独立网络配置:每个容器都可以拥有自己的IP地址、子网掩码、网关等网络配置,就像运行在一个独立的网络环境中一样,使得容器可以方便地接入不同的网络,满足不同的应用需求
- 网络服务隔离:通过网络命名空间,可以将不同的网络服务隔离在不同的容器中,提高系统的可靠性和可维护性
2.3 网络命名空间的工作原理
2.3.1 网络命名空间的创建与销毁
-
在Linux中,可以使用 ip netns 命令来创建和管理网络命名空间,例如:创建一个新的网络命名空间:
ip netns add my_namespace
[root@node1 ~]# ip netns add my_namespace
[root@node1 ~]# -
创建完成后,可以使用ip netns list命令查看所有已创建的网络命名空间,当不再需要某个网络命名空间时,可以使用ip netns delete命令将其销毁:
ip netns delete my_namespace
[root@node1 ~]# ip netns list
my_namespace
[root@node1 ~]# ip netns delete my_namespace
[root@node1 ~]# ip netns list
[root@node1 ~]#
2.3.2 网络命名空间的网络接口
每个网络命名空间都有自己的网络接口集合,可以使用 ip link 命令来查看和管理网络命名空间中的网络接口
# 在默认的网络命名空间中查看网络接口:ip link show
[root@node1 ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:e5:d1:9d brd ff:ff:ff:ff:ff:ff
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:fc:52:80 brd ff:ff:ff:ff:ff:ff
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:fc:52:80 brd ff:ff:ff:ff:ff:ff
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:f2:25:fb:b0 brd ff:ff:ff:ff:ff:ff
6: br-6c480d3992c5: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:e5:4d:9f:18 brd ff:ff:ff:ff:ff:ff
[root@node1 ~]#
要将网络接口移动到另一个网络命名空间中,可以使用 ip link set 命令
# 将eth0网络接口移动到my_namespace网络命名空间中
ip link set eth0 netns my_namespace
2.3.3 网络命名空间的网络配置
在网络命名空间中,可以像在普通Linux系统中一样配置网络参数,如IP地址、子网掩码、网关等
ip netns exec my_namespace ip addr add 192.168.10.100/24 dev eth0
ip netns exec my_namespace ip link set eth0 up
ip netns exec my_namespace ip route add default via 192.168.10.1
3 网络命名空间在Docker中的应用
3.1 Docker容器中的网络命名空间
- 在Docker容器中,每个容器都会创建一个新的网络命名空间
- 容器内的网络操作(如创建网络接口、配置 IP 地址等)都在该网络命名空间中进行,与宿主机及其他容器的网络环境相互独立
3.2Docker网络模式与网络命名空间
Docker提供了多种网络模式,每种网络模式都基于网络命名空间实现不同的网络隔离和通信方式。
3.2.1 Bridge模式
- Bridge模式 是Docker默认的网络模式
- 在这种模式下,Docker会在宿主机上创建一个虚拟网桥(默认名为docker0),并为每个容器创建一个虚拟网络接口(veth pair),一端连接到容器的网络命名空间,另一端连接到docker0网桥
- 容器之间通过docker0网桥进行通信,同时可以通过docker0网桥与宿主机外部的网络进行通信
- Bridge模式下网络命名空间的流程:
- Docker 启动容器:用户通过Docker命令启动一个容器
- 创建新的网络命名空间:Docker 为容器创建一个新的网络命名空间
- 创建虚拟网络接口(veth pair) :Docker创建一对虚拟网络接口,一端连接到容器的网络命名空间,另一端连接到docker0网桥
- 配置容器网络参数:Docker为容器配置IP地址、子网掩码等网络参数
- 容器通信 :容器通过docker0网桥与其他容器和宿主机外部的网络进行通信
3.2.2 Host 模式
- Host模式下,容器直接使用宿主机的网络命名空间,容器内的网络接口与宿主机上的网络接口共享相同的网络环境
- 这种模式下,容器没有独立的网络命名空间,网络隔离性较差,但网络性能较高
3.2.3 None模式
- None模式下,容器没有网络命名空间,不配置任何网络接口
- 这种模式下,容器无法进行网络通信,适用于一些不需要网络连接的特殊场景
3.3 网络命名空间与Docker网络插件
- 除了Docker自带的网络模式外,还可以使用Docker网络插件来实现更复杂的网络功能
- 这些网络插件通常基于网络命名空间和Linux网络虚拟化技术,为容器提供更灵活、更安全的网络环境
4 网络命名空间的实践示例
# 启动一个基于Bridge模式的容器
docker run -it --name net_namespace_demo ubuntu:20.04 bash
# 在容器内查看网络接口(此时容器有自己的网络命名空间)
ip addr show
# 在宿主机上查看docker0网桥和容器虚拟网络接口
ip addr show docker0
docker inspect net_namespace_demo | grep -i ipaddress
# 退出容器
exit
# 创建一个自定义网络(基于Bridge模式)
docker network create my_custom_network
# 启动一个新容器并连接到自定义网络
docker run -it --name net_namespace_demo2 --network my_custom_network ubuntu:20.04 bash
# 在新容器内查看网络接口和IP地址(与之前的容器在不同的网络命名空间)
ip addr show
# 尝试在新容器内ping宿主机(假设宿主机IP为192.168.10.30)
ping -c 4 192.168.10.30
# 退出容器
exit
# 清理资源
docker stop net_namespace_demo net_namespace_demo2
docker rm net_namespace_demo net_namespace_demo2
docker network rm my_custom_network
5 总结
- 网络命名空间作为Docker实现资源隔离的核心技术之一,为容器提供了独立的网络环境
- 通过网络命名空间,Docker实现了容器内网络资源与宿主机及其他容器内网络资源的隔离,提高了系统的安全性和可靠性
- Docker提供的多种网络模式和网络插件,使得容器可以根据不同的应用需求灵活配置网络环境