前言

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. Ubuntu 16.04 上安装 arm-linux-gcc-4.4.3

    参考链接:https://blog.csdn.net/zz56z56/article/details/83021583 注:正常安装后,不同用户切换,需重新刷新环境变量:source /etc/pro ...

  2. scala :: , +:, :+ , ::: , ++ 的区别

    4 种操作符的区别和联系 :: 该方法被称为cons,意为构造,向队列的头部追加数据,创造新的列表.用法为 x::list,其中x为加入到头部的元素,无论x是列表与否,它都只将成为新生成列表的第一个元 ...

  3. python基础之pip、.pyc、三元运算、进制、一切皆对象、可变与不可变类型

    一.pip(下载工具==yum) 1.重点(必须掌握的) 列出已安装的包 pip list 安装要安装的包 pip install xxx 安装特定版本 pip install django==1.1 ...

  4. 按时按登录IP记录Linux所有用户操作日志的方法

    背景:Linux用户操作记录一般通过命令history来查看历史记录,但是如果因为某人误操作了删除了重要的数据,这种情况下history命令就不会有什么作用了.以下方法可以实现通过记录登陆IP地址和所 ...

  5. MongoDB(12)- 查询嵌入文档的数组

    插入测试数据 db.inventory.insertMany( [ { item: "journal", instock: [ { warehouse: "A" ...

  6. Java,用户刷屏检测\相似字符串检测

    背景 近期有几个业务方提出一需求,期望判断一个用户在短期内是否存在刷屏现象,出现后能对其做出限制,并上报. 刷屏定义:取出用户近期20条评论,如果有50%的评论是"相似"的,则认为 ...

  7. Step By Step(userdata)

    Step By Step(userdata) 在Lua中可以通过自定义类型的方式与C语言代码更高效.更灵活的交互.这里我们通过一个简单完整的示例来学习一下Lua中userdata的使用方式.需要说明的 ...

  8. 【RMAN】使用RMAN备份将数据库不完全恢复到指定时间点

    RMAN作为Oracle强大的备份恢复工具,可以协助我们恢复数据库到指定时间点,这便是Oracle不完全恢复的一种体现,通过这种方法可以找回我们曾经丢失的数据.这里以找回误TRUNCATE表数据为例给 ...

  9. CUDA 8的混合精度编程

    CUDA 8的混合精度编程 Volta和Turing GPU包含 Tensor Cores,可加速某些类型的FP16矩阵数学运算.这样可以在流行的AI框架内更快,更轻松地进行混合精度计算.要使用Ten ...

  10. Selenium-python 之 frame定位元素

    定位元素时经常会出现定位不到元素,这时候我们需要观察标签的上下文,一般情况下这些定位不到的元素存放在了frame或者放到窗口了,只要我们切入进去就可以很容易定位到元素. 处理frame时主要使用到sw ...