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
原文地址:https://www.cnblogs.com/snail-gao/p/12058825.html