前言

Docker系列文章:

此篇是Docker系列的第六篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,加油!

  1. 为什么要学习Docker
  2. Docker基本概念
  3. Docker镜像基本原理
  4. Docker容器数据卷
  5. Dockerfile

网卡

网卡是一块计算机硬件。其特点是每一个网卡都有独立的MAC地址,用户可以通过电缆进行相互之间的连接。其主要功能是将数据封装成以太网中的帧,通过链路管理进行传输,接受数据后,对数据进行编码和译码。其优点是提高了CPU的利用率通过链路管理进行传输,提升了CPU的性能。
再用通俗一点的话解释,网卡其实就是七层或者四层网络模型的门户,复制接收和转发数据如下图:

Network Namespace介绍

Network Namespace在逻辑上是网络堆栈的一个副本,它有自己的路由、防火墙规则和网络设备。默认情况下,子进程继承其父进程的Network Namespace。如果不显式创建新的Network Namespace,所有进程都从 init 进程继承相同的默认Network Namespace。

每个新创建的Network Namespace默认有一个本地回环接口 lo,除此之外,所有的其他网络设备(物理/虚拟网络接口,网桥等)只能属于一个Network Namespace。每个Socket也只能和一个Network Namespace通信。

创建Network Namespace

备注:采用的环境为阿里云CentOS 8.2

  1. 检查默认的Network Namespace 的 ID;

    readlink /proc/$$/ns/net
  2. 创建名为networknamespacetest的Network Namespace;

     #创建名为networknamespacetest的Network Namespace
     ip netns add networknamespacetest
     #检查netns是否创建成功
     ls /var/run/netns
  3. 在networknamespacetest中创建一个bash进程并且查看Network Namespace的ID;

      #创建bash进程
      ip netns exec networknamespacetest bash
      #查看Network Namespace的ID
      readlink /proc/$$/ns/net
  4. 经过上面可以得出每个Network Namespace都是相互隔离的,接下来我们看下networknamespacetest有什么构成;

     ip addr
  5. Network Namespace由本地回环接口 lo构成,并且这个接口是处于关闭状态的,接下来我们启动这个回环接口;

    ip link set lo up
  6. 测试lo的连通性;

两个Network Namespace之间如何通信

Veth-Pair

什么是Veth-Pair

Veth是Linux中一种虚拟出来的网络设备,Veth设备总是成对出现,所以一般也叫Veth-Pair。Veth-Pair特点就是无法单独存在,删除其中一个,另一个也会自动消失。Veth的两头都直接连着网络协议栈,所以你创建一个Veth对,主机上就会多2个网卡。

Veth-Pair作用

Veth-Pair作用就是反向流转数据,从一头发数据,就会从另一头收到数据。Veth-Pair常常充当着一个桥梁,连接着各种虚拟网络设备。常见用途是连接两个Netwok Namespace,或者连接Linux-Bridge、OVS 之类的。

实战
  1. 创建两个Network Namespace network01和network02;

     ip netns add network01
     ip netns add network02
  2. 创建一对Veth设备,默认情况下会自动为Veth-Pair生成名称,这里为了方便我们测试,我们在创建时指定 Veth-Pair的名称;

     #创建Veth-Pair
     ip link add veth01 type veth peer name veth02
     #查看主机中Veth-Pair
     ip link ls   
  3. 把这一对Veth-Pair分别放到Network Namespace network01 和 network02中;

     #绑定
     ip link set veth01 netns network01
     ip link set veth02 netns network02

     #查看namespace组成
     ip netns exec network01 ip addr
     ip netns exec network02 ip addr

     #查看主机中是否存在Veth-Pair
     ip link ls

    查看network01和network02中的网络资源,发现各自多了一个网卡,也就是veth设备的两个端点,如下图:

​ 当我们把Veth-Pair分配到Network Namespace中后,在主机上就看不到它们了,如下图:

  1. 给这些Veth-Pair分配IP并启用它们;
#启动设备veth01
ip netns exec network01 ip link set veth01 up
#绑定IP
ip netns exec network01 ip addr add 10.0.1.1/24 dev veth01
#设置IP路由
ip netns exec network01 ip route

#启动设备veth02
ip netns exec network02 ip link set veth02 up
#绑定IP
ip netns exec network02 ip addr add 10.0.1.2/24 dev veth02
#设置IP路由
ip netns exec network02 ip route
  1. 通过ping命令来验证两个Network Namespace是否可以通信;

    ip netns exec network01 ping -c 3 10.0.1.2

至此我们就完成两个Network Namespace之间的通信。

Bridge

什么是Bridge

Linux Bridge(网桥)是工作于二层的虚拟网络设备,功能类似于物理的交换机。Bridge可以绑定其他Linux网络设备作为从设备,并将这些设备虚拟化为端口,当一个从设备被绑定到Bridge上时,就相当于真实网络中的交换机端口插入了一个连接有终端的网线。Bridge有多个端口,数据可以从任何端口进来,进来之后从哪个口出去和物理交换机的原理差不多。

Bridge作用

Veth-Pair可以实现两个Network Namespace之间的通信,但是当需要在多个Network Namespace之间通信的时候,光靠Veth-Pair就显得有一些麻烦了,我们需要在Network Namespace创建很多个Veth才能和多个Network Namespace通信,我们可以把很多Veth-Pair绑定到Bridge上面,Network Namespace就能连通了多个Network Namespace,当需要通信的时候,Network Namespace只要往Bridge发报文,所有Veth-Pair全都可以收到报文信息。

实战
  1. 创建一个br0的网桥,并设置上线;

    ip link add br0 type bridge
    ip link set dev br0 up
    ip addr
  2. 创建Veth-Pair;

    #创建3个 veth pair
    ip link add type veth
    ip link add type veth
    ip link add type veth
  3. 创建Network Namespace;

    #创建3个Network Namespace
    ip netns add net0
    ip netns add net1
    ip netns add net2
  4. 将Veth-Pair的一边挂到Network Namespace中,另一边挂到bridge上,并设IP地址;

    #配置net0
    ip link set dev veth1 netns net0
    ip netns exec net0 ip link set dev veth1 name eth0
    ip netns exec net0 ip addr add 10.0.1.1/24 dev eth0
    ip netns exec net0 ip link set dev eth0 up
    ip link set dev veth0 master br0
    ip link set dev veth0 up

    #配置net1
    ip link set dev veth3 netns net1
    ip netns exec net1 ip link set dev veth3 name eth0
    ip netns exec net1 ip addr add 10.220.1.2/24 dev eth0
    ip netns exec net1 ip link set dev eth0 up
    ip link set dev veth2 master br0
    ip link set dev veth2 up

    #配置net2
    ip link set dev veth5 netns net2
    ip netns exec net2 ip link set dev veth5 name eth0
    ip netns exec net2 ip addr add 10.220.1.3/24 dev eth0
    ip netns exec net2 ip link set dev eth0 up
    ip link set dev veth4 master br0
    ip link set dev veth4 up
  5. 给br0设置IP;

    ip link set dev br0 down
    ip addr add 10.220.1.0/24 dev br0
    ip link set dev br0 up
    ip netns exec net0 ping -c 2 10.220.1.3
  6. 解决ping不通的问题,因为系统为bridge开启了iptables功能,导致所有经过br0的数据包都要受iptables里面规则的限制,我在虚拟机已经安装了Docker,Docker将iptables里面filter表的FORWARD链的默认策略设置成了drop,于是所有不符合docker规则的数据包都不会被forward,导致你这种情况ping不通;

    解决办法有两个:

    第一个就是关闭系统bridge的iptables功能,这样数据包转发就不受iptables影响了:

    echo0 >/proc/sys/net/bridge/bridge-nf-call-iptables;

    第二就是为br0添加一条iptables规则,让经过br0的包能被forward:

     iptables -A FORWARD -i br0 -j ACCEPT;
  7. 验证;

以上涉及的Linux技术其实已经和ocker底层的网络技术有些类似,这里先整体介绍一下,下篇我们对Docker的网络进行探究一下。

结束

欢迎大家点点关注,点点赞!

Docker单机网络上的更多相关文章

  1. Docker单机网络下

    前言 Docker系列文章: 此篇是Docker系列的第七篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,加油! 为什么要学习Docker Docker基本概念 Docker镜像基本原理 ...

  2. Docker单机网络实战

    前言 Docker系列文章: 此篇是Docker系列的第八篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,加油! 为什么要学习Docker Docker基本概念 Docker镜像基本原理 ...

  3. docker单机网络类型

    docker单机网络类型概述 Docker 安装时会自动在 host 上创建三种网络  分别为 bridge    host   none .   可用 docker network ls 命令查看 ...

  4. Docker 单机网络

    Docker Network相关命令 root@ubuntu:~# docker network --help Usage: docker network COMMAND Manage network ...

  5. 理解Docker单机容器网络

    在” 理解Docker单机容器网络 “一文中,还有一个Docker容器网络的功能尚未提及,那就是Docker容器的端口映射.即将容器的服务端口P’ 绑定到宿主机的端口P上,最终达到一种效果:外部程序通 ...

  6. Docker源码分析(七):Docker Container网络 (上)

    1.前言(什么是Docker Container) 如今,Docker技术大行其道,大家在尝试以及玩转Docker的同时,肯定离不开一个概念,那就是“容器”或者“Docker Container”.那 ...

  7. Docker 新网络 overlay 网络

    Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式. 这样不但能够充分利用成熟的IP路由协议进程数据分发,而且在Overlay技术 ...

  8. docker - kubernetes 网络(转)+ 架构图

    1.host网络 连接到 host 网络的容器共享 Docker host 的网络栈,容器的网络配置与 host 完全一样.可以通过--network=host指定使用 host 网络.docker ...

  9. 12、Docker的网络--bridge

    单机网络 Bridge Network Host Network None Network 多机网络 Overlay Network 12.1 网络命名空间   启动一个容器 docker run - ...

随机推荐

  1. Linux巡检常用命令

    # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostn ...

  2. (转)Linux下用户组、文件权限详解

    转自https://www.cnblogs.com/123-/p/4189072.html 用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在linux中每个文件有所有者.所在组.其它 ...

  3. UCOSII中的主栈扩展

    听陈*均说 UCOSII源代码中有这样的机制 当某个TASK的栈不够用.访问越界时 会自动调用系统生成的备用扩展栈区 但这样也有风险 备用扩展栈区如果被击穿则会造成更大的错误,可能会导致程序跑飞,如果 ...

  4. Git 分支基本命令

    1. 查看当前分支 (git branch) 2. 创建分支 (git branch 分支名) 3.切换分支(git checkout 分支名) 4.分支上的常规操作 5.分支的合并 (git che ...

  5. Nginx的超时timeout配置详解

    Nginx的超时timeout配置详解 本文介绍 Nginx 的 超时(timeout)配置. Nginx 处理的每个请求均有相应的超时设置.如果做好这些超时时间的限定,判定超时后资源被释放,用来处理 ...

  6. 07.ElementUI 2.X 源码学习:源码剖析之工程化(二)

    0x.00 前言 项目工程化系列文章链接如下,推荐按照顺序阅读文章 . 1️⃣ 源码剖析之工程化(一):项目概览.package.json.npm script 2️⃣ 源码剖析之工程化(二):项目构 ...

  7. 《MySQL面试小抄》索引考点一面总结

    <MySQL面试小抄>索引考点一面总结 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟 囧囧表示:面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点!!! ...

  8. 微调torchvision 0.3的目标检测模型

    微调torchvision 0.3的目标检测模型 本文将微调在 Penn-Fudan 数据库中对行人检测和分割的已预先训练的 Mask R-CNN 模型.它包含170个图像和345个行人实例,说明如何 ...

  9. vue3函数setUp和reactive函数详细讲解

    1 setUp的执行时机 我们都知道,现在vue3是可以正常去使用methods的. 但是我们却不可以在setUp中去调用methods中的方法. 为什么了??? 我们先了解一下下面这两个生命周期函数 ...

  10. hashmap专题

    hashmap重要变量 源码中定义了很多常量,有几个是特别重要的. DEFAULT_INITIAL_CAPACITY: Table数组的初始化长度: 1 << 4,即 2^4=16(这里可 ...