zoukankan      html  css  js  c++  java
  • Docker网络

    计算机网络模型

    Linux中网卡

    (1)查看网卡[网络接口]
        ip link show
        ls /sys/class/net
        ip a
        ifconfig
    (2)网卡
    - ip a解读
        状态:UP/DOWN/UNKOWN等
        link/ether:MAC地址
        inet:绑定的IP地址
    - 配置文件
        cat /etc/sysconfig/network-scripts/ifcfg-eth0
    - 给网卡添加IP地址
        - 直接修改ifcfg-*文件
        - 通过命令修改
            - 添加IP地址
                ip addr add 192.168.0.100/24 dev eth0
            - 删除IP地址
                ip addr delete 192.168.0.100/24 dev eth0
    - 网卡启动与关闭
        重启网卡 :service network restart / systemctl restart network
        启动/关闭某个网卡 :ifup/ifdown eth0 or ip link set eth0 up/down
    

    Network Namespace

    在linux上,网络的隔离是通过network namespace来管理的,不同的network namespace是互相隔离的

    network namespace的管理
        ip netns list    #查看
        ip netns add ns1   #添加
        ip netns delete ns1 #删除
    
    namespace实战
    (1)创建一个network namespace
        ip netns add ns1
    (2)查看该namespace下网卡的情况
        ip netns exec ns1 ip a
    (3)启动ns1上的lo网卡(2中方式)
        ip netns exec ns1 ifup lo
        ip netns exec ns1 ip link set lo up
    (4)再次查看
        可以发现state变成了UNKOWN
    (5)再次创建一个network namespace
        ip netns add ns2
    (6)两个namespace网络连通起来(如图)
        veth pair :Virtual Ethernet Pair,是一个成对的端口,可以实现上述功能
    

    (7)创建一对link,也就是接下来要通过veth pair连接的link
        ip link add veth-ns1 type veth peer name veth-ns2
    (8)查看link情况
        ip link
    (9)将veth-ns1加入ns1中,将veth-ns2加入ns2中
        ip link set veth-ns1 netns ns1
        ip link set veth-ns2 netns ns2
    (10)查看宿主机和ns1,ns2的link情况
        ip link
        ip netns exec ns1 ip link
        ip netns exec ns2 ip link
    (11)此时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
    (12)再次查看,发现state是DOWN,并且还是没有IP地址
        ip netns exec ns1 ip link
        ip netns exec ns2 ip link
    (13)启动veth-ns1和veth-ns2
        ip link add veth-ns1 type veth peer name veth-ns2
        ip netns exec ns1 ip link set veth-ns1 up
        ip netns exec ns2 ip link set veth-ns2 up
    (14)再次查看,发现state是UP,同时有IP
        ip netns exec ns1 ip a
        ip netns exec ns2 ip a
    (15)此时两个network namespace互相ping一下,发现是可以ping通的
        ip netns exec ns1 ping 192.168.0.12
        ip netns exec ns2 ping 192.168.0.11
    

    container网络-Bridge

    (1)docker0默认bridge
    QA:为什么centos机器可以和容器内的网络互相通信?
    答案(这里的容器以tomcat为例):

    在tomcat01中有一个eth0和centos的docker0中有一个veth3是成对的,类似于之前实战中的
    veth-ns1和veth-ns2,不妨再通过一个命令确认下:brctl
    安装一下:yum install bridge-utils
    brctl show
    

    QA:为什么容器之间网络可以互相通信呢?

    这种网络连接方法我们称之为Bridge,其实也可以通过命令查看docker中的网络模式:docker network ls
    bridge也是docker中默认的网络模式
    不妨检查一下bridge:docker network inspect bridge
    

    在容器中是可以访问互联网的图示:

    创建自己的network

    (1)创建一个network,类型为bridge
        docker network create tomcat-net
        docker network create --subnet=172.18.0.0/24 tomcat-net(指定网段的方式)
    (2)查看已有的network:
        docker network ls
    (3)查看tomcat-net详情信息:
        docker network inspect tomcat-net
    (4)创建tomcat的容器,并且指定使用tomcat-net
        docker run -d --name custom-net-tomcat --network tomcat-net tomcat
    (5)查看custom-net-tomcat的网络信息
        docker exec -it custom-net-tomcat ip a
    (6)查看网卡接口
        brctl show
    

    QA: 如果此时去通信上面我们创建的tomcat01发现是无法通信的?
    docker exec -it custom-net-tomcat ping 172.17.0.2(这里指的是tomcat01的ip地址)

    解决办法:

    命令:docker network connect tomcat-net tomcat01
    查看tomcat-net网络,可以发现tomcat01这个容器也在其中
    此时进入到tomcat01或者custom-net-tomcat中,不仅可以通过ip地址ping通,而且可以通过名字ping到,这时候因为都连接到了用户自定义的tomcat-net bridge上  
    

    Host & None

    Host

    (1)创建一个tomcat容器,并且指定网络为host
        docker run -d --name my-tomcat-host --network host tomcat
    (2)查看ip地址
        docker exec -it my-tomcat-host ip a
    

    None

    (1)创建一个tomcat容器,并且指定网络为none
        docker run -d --name my-tomcat-none --network none tomcat
    (2)查看ip地址
        docker exec -it my-tomcat-none ip a
    

    多机之间的container通信

    (1)使得两边的eth0能够通信
    (2)前提要确保容器内的IP地址不一样
    (3)将容器中的所有信息当成eth0要传输给另外一端的信息
    (4)具体通过vxlan技术实现
        www.evoila.de/2015/11/06/what-is-vxlan-and-how-it-works
    (5)处在vxlan的底层:underlay
       处在xxlan的上层:overlay
    
  • 相关阅读:
    Axel linux下多线程下载工具
    使用Scala编写Spark程序求基站下移动用户停留时长TopN
    编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本]
    使用Eclipse编译运行MapReduce程序 Hadoop2.6.0_Ubuntu/CentOS
    Eclipse上Hadoop插件中Run On Hadoop原理[转]
    apache官方中文hadoop说明文档地址
    如何在Windows下面运行hadoop的MapReduce程序
    通过web界面查看hadoop集群运行日志的地址
    linux命令-查看当前目录下所有文件的大小:“ll -h”
    BZOJ3979 : [WF2012]infiltration
  • 原文地址:https://www.cnblogs.com/snail-gao/p/12058825.html
Copyright © 2011-2022 走看看