• 手动创建容器-网络篇


    一直想了解容器是什么东西,由于我最近一直很忙,并且对互联网不是特别了解就搁置了。这两天心血来潮搜了一下,发现容器的网络部分是基于内核的namespace实现,因为我对网络协议栈还是比较了解的,从网络部分入手也是个不错的办法。

    下面先手动创建一个只隔离网络的容器

    • 在一个shell里(姑且称之为shell-1),先创建一个namespace
    unshare -n bash
    

    其实执行完这一行就生成了一个容器,但是这个容器里还没有网络,下面我们把它的网络设置好。

    • 打印出当前shell的进程id
    echo $$
    25431    #这个是打印的进程号
    
    • 打开另一个shell(shell-2)
    ip link add type veth                #生成一对veth
    ip link set veth1 netns 25431        #把其中一个veth放到容器,25431要换成刚才shell-1打印的容器进程号
    

    这里生成的veth0和veth1相当于一对管道,或者说是一对点到点连接。

    •  在shell-1里配置ip地址和路由
    ip link up dev veth1
    ip addr add 1.1.1.1/24 dev veth1
    ip route add default via 1.1.1.2
    
    •  在shell-2里配置ip地址
    ip link up dev veth0
    ip addr add 1.1.1.2/24 dev veth0
    iptables -t nat -I POSTROUTING -s 1.1.1.0/24 -j MASQUERADE    #nat转发
    

     在shell-2里做了地址伪装,现在shell-1这个容器就可以通过veth0/veth1上网了,这个原理应该和容器的nat模式类似,我猜的还不确定,我还没看过真正的容器的实现代码。

    没有容器之前,网口-协议栈-进程之间的关系大致类似于下面这样

    有容器之后的三者的关系类型类似下面这样

    这是网络部分的原理,其他部分的原理应该也类似。

  • 相关阅读:
    《Java基础知识》Java继承的概念和实现
    《Java基础知识》Java包装类,拆箱和装箱
    《Java基础知识》Java方法重载和重写
    《Java基础知识》Java this关键字详解
    《Java基础知识》Java变量作用域
    51nod 1080:两个数的平方和
    51nod 1013:3的幂的和 快速幂
    POJ 1019:Number Sequence 二分查找
    51nod 1393:0和1相等串
    51nod 1267:4个数和为0 哈希
  • 原文地址:https://www.cnblogs.com/4a8a08f09d37b73795649038408b5f33/p/12058700.html
Copyright © 2020-2023  润新知