Docker网络篇(四)

在写网络之前分享下官网上讲Docker的网址: https://docs.docker.com/network/

一. 计算机的网络三种模型

        前面讲了很多Docker的安装应用及发布的内容,如果大家有在玩Docker的话应该也和我一样碰到了网络的问题,例如两台机器间通信、不在同一网段的访问;那接下来我就分享下我对这几天折腾的成果分享,在讲之前我们先来了解下计算机中的网络模型:OSI参考模型、TCP/IP生产模型、5层结构学习网络模型。实际的企业生产中并没有使用OSI标准模型的,TCP/IP模型是实际生产中使用的网络架构,5层网络模型是为方便学习而创建的。

 

 

OSI(Open System Interconnection),是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。

由上而下分别为:

应用层:

   与其他计算机进行通讯的一个应用,解决最终通信双方数据传输问题,即不同结点上两个对应应用进程之间的通信。

   协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP等。

表示层:

   定义数据格式以及加密。(在五层模型里面已经合并到了应用层)

   格式有,JPEG、ASCll、DECOIC、加密格式等。

会话层

   定义了如何开始、控制和终止一个会话。(在五层模型里面已经合并到了应用层)

   对应主机进程,指本地主机与远程主机正在进行的会话。

传输层

   定义传输数据的协议端口号,以及流控和差错校验。
   协议有:TCP UDP等,数据包一旦离开网卡即进入网络传输层。

网络层

   进行逻辑地址寻址,实现不同网络之间的路径选择。(路由选择)
   协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP

数据链路层

   建立逻辑连接、进行硬件地址寻址、差错校验等功能。(由底层网络定义协议,ATM,FDDI等)

   将比特组合成字节进而组合成帧,用MAC地址访问介质,能错误发现但不能纠正。

物理层

   建立、维护、断开物理连接。(由底层网络定义协议,RJ45,802.3等)

有了上面的了解,那我们应该明白,作为开发人员的我们应该更多的关注点是在应用层和传输层,例如我们两台服务器之间如果需要进行通信,那么我们就需要知道两台服务器的网卡信息才能进行通信;那接下来我们就来了解下网卡的一些信息

1. 查看网卡[网络接口]

  •     ip link show
  •     ls /sys/class/net
  •     ip a 

 

 上图我们得了虚拟机的网络IP ,我们在物理主机上进行PING时会发现可以互相ping通,因为他们在同一网段,但是在不同网段时就不能ping了,这个问题当时搞了我半天,后面我会进行讲解

如果想要修改网卡信息我们可以通过命令cd /etc/sysconfig/network-scripts/进入看到网卡的信息及配置文件

 

如果我们想修改eth0的网卡信息可以用命令 vi ifcfg-eth0进入修改,其它的一样

 

 

   2. 给网卡添加IP地址 

    例如我们想给网卡eth0增加ip地址我们可以用命令: ip addr add 192.168.0.100/24 dev eth0  进行增加;既然能增加那当然也能删除,如果我们想删除增加的ip地址可以用命令ip addr delete 192.168.0.100/24 dev eth0进行删除

 

 

 上面的截图我们还可以看到网卡的一些其它信息例如:

        状态:UP/DOWN/UNKOWN等

         link/ether:MAC地址

        inet:  绑定的IP地址

  另外补充一点,网卡在修改完成后一定要记得重启,要不然不会生效

         重启网卡:service network restart / systemctl restart network

         启动/关闭某个网卡:ifup/ifdown eth0 or ip link set eth0 up/down 

 二.  Network Namespace 

         有了上面的网络知识的一个了解,那么我们可能会想网络能不能和Docker一样做到虚拟隔离;如果想要做到这点那么我们就得不聊下network namespace了。network namespace 是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自的网络栈信息。不管是虚拟机还是容器,运行的时候仿佛自己就在独立的网络中。network namespace 是 linux 内核提供的功能;

      为了实现这种隔离,我们首先要有一个自己的nsl所以我们用命令ip netns add ns1 ,然后用命令ip netns list 查看有没有创建成功;通过下图我们发现我们创建成功了(如果想删除可以用命令ip netns delete ns1 )

 

 

 

 我们在这个ns1中可以放自己的网卡信息,我们用命令  ip netns exec ns1 ip a  查看该namespace下网卡的情况;我们可以查看到这里面有一个默认的本地网卡信息

 

通过下图对比会发现我们建的网卡的状态是DOWN装态,为了改变这个状态我们重启下网卡

 

用命令ip netns exec ns1 ifup lo   重新启动下网卡,重新启动后我们发现我们网卡状态发生了改变,现在网卡状态和物理主机状态一样都是UNKNOWN

 

 

 

到这一步有些朋友可能会想物理主机有那么多网卡信息,我们自己建的网卡能不能内容上也和物理主机上一样丰富;为了能展现出这样内容我再创建一个network namespace来进行进行关联

用命令  ip netns add ns2 来再创建一个network namespace,创建完成后我们查看我们创建成功了,但是我们的网卡信息也是DOWN状态

 

为改变状态那来呗,用命令ip netns exec ns2 ifup lo来重启下,然后再查看发现状态改变了;有心的朋友们估计会发现重启后信息就变多了,就分配了一个ip地址

 

 

 

 

 

 

 通过上面的步骤我们创建了两个network namespace;但是这两个目前网卡是本地回环网卡还是独立的没办法跟外面建立通信,我想做的一件是想让两个namespace网络连通起来 ;网卡是建立通信的最小单元,为了打通他们之间的

通信,我们只用在他们两边建立一个网卡然后让他们互相连起来,他们不就可以通信了吗;其中Virtual Ethernet Pair,就可以解决上面问题;他们是一个成对的端口

在执行关联前我先查看我现在有的网卡信息

 

 

 用命令ip link add veth-ns1 type veth peer name veth-ns2  创建一对link,也就是接下来要通过veth pair连接的link;创建完成后我们再通过命令查看会发现我们的信息多了两了

 

 

 

 

 创建完成后我们将veth-ns1加入ns1中,将veth-ns2加入ns2中;执行命令

      ip link set veth-ns1 netns ns1

      ip link set veth-ns2 netns ns2 

执行完这两个命令后我们再查看会发现少了两个网卡信息veth-ns1和veth-ns2,因为我们已经把他们分配了

如果想看有没有真加进来我们可以用命令ip netns exec ns1 ip link 查看;ns2方法也是一样的,赖着写了,可以自己玩下

 

 

 

 

        此时veth-ns1和veth-ns2还没有ip地址,显然通信还缺少点条件

            ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1 

            ip netns exec ns2 ip addr add 192.168.0.12/24 dev veth-ns2 

 

 然后执行ip netns exec ns1 ip link 查看发现IP地址并没有上来;问题和前面一样,现在网卡状态是DOWN状态,我们要把他重启下

 

执行命令重启veth-ns1和veth-ns2

 ip netns exec ns1 ip link set veth-ns1 up 

 ip netns exec ns2 ip link set veth-ns2 up 

 

 操作完后我们再次查看,会发现IP信息还是没有

 

 

再次查看,发现state是UP,同时有IP

ip netns exec ns1 ip a 

ip netns exec ns2 ip a 

 

 

   此时两个network namespace互相ping一下,发现是可以ping通的

   ip netns exec ns1 ping 192.168.0.12 

   ip netns exec ns2 ping 192.168.0.11 

 

      Container的NS 

       按照上面的描述,实际上每个container,都会有自己的network namespace,并且是独立的,我们可以进入 到容器中进行验证

         创建两个container

         

 

 

        

          进入到两个容器中,并且查看ip

         

 

 

                互相ping一下是可以ping通的

           

 

 

         值得我们思考的是,此时tomcat01和tomcat02属于两个network namespace,是如何能够ping通的

 

posted @ 2020-08-15 23:05  童话述说我的结局  阅读(108)  评论(0编辑  收藏  举报