Docker系列4:Docker网络虚拟化基础

发布时间:2020-07-10 19:00:09 作者:zxhk
来源:网络 阅读:244

一、网络虚拟化技术介绍

1、什么是虚拟化网络

虚拟化网络即由linux内核所虚拟出来的网络,事实上,linux内核可模拟多种网络设备

    Docker系列4:Docker网络虚拟化基础

网络虚拟化的解决方案有很多,例如:

在物理机上可以有多个虚拟交换机,容器可以分别接在不同的虚拟交换机上,如果两个虚拟交换机不在同一个网段,那么如何进行通信呢?

    Docker系列4:Docker网络虚拟化基础 

此时需要进行转发

    Docker系列4:Docker网络虚拟化基础

2、如何实现两个物理机上的容器怎么通信?

方法1:是桥接模式(比如vmware的桥接)

    Docker系列4:Docker网络虚拟化基础

当有数据包过来的时候,物理机网络会判断目标mac

    Docker系列4:Docker网络虚拟化基础

注意:

方法2:NAT模式

    Docker系列4:Docker网络虚拟化基础

注意:此时的问题问题是虽然能将数据发送出去,但是回不来

以上两种方式都存在各自的问题

方法3:叠加网络(Overlay network),这种网络是基于隧道模式实现的

    Docker系列4:Docker网络虚拟化基础

二、Docker网络详解

1、Docker的三种网络

[root@host1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
591c75b7dbea        bridge              bridge              local
386d8dc4beb8        host                host                local
eb7b7cf29f29        none                null                local

2、bridge就是桥接模式

[root@host1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  ...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  ...
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  ...
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:a4:e8:44:11 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
[root@host1 ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:3f:bf:cf brd ff:ff:ff:ff:ff:ff
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:3f:bf:d9 brd ff:ff:ff:ff:ff:ff
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether 02:42:a4:e8:44:11 brd ff:ff:ff:ff:ff:ff
6: veth7c1728b@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default 
    link/ether 9a:be:3b:60:d7:2e brd ff:ff:ff:ff:ff:ff link-netnsid 0

启动一个容器

[root@host1 ~]# docker run --rm --name vh2 -it busybox
/ #

此时物理机会多出一个网卡设备

[root@host1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
 ...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
 ...
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
 ...
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:a4:e8:44:11 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:a4ff:fee8:4411/64 scope link 
       valid_lft forever preferred_lft forever
6: veth7c1728b@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 9a:be:3b:60:d7:2e brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::98be:3bff:fe60:d72e/64 scope link 
       valid_lft forever preferred_lft forever

在容器中看一下网卡信息

/ # ip addr

可以通过brctl开控制和查看物理机网卡和容器网卡的对应关系

[root@host1 ~]# yum install bridge-utils -y
[root@host1 ~]# brctl show
bridge namebridge idSTP enabledinterfaces
docker08000.0242a4e84411noveth7c1728b

其实在使用了Docker0网桥的时候,系统是会自动生成一个iptables规则的【POSTROUNTING规则】

[root@host1 ~]# iptables -L -n --line -t nat
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           

Chain DOCKER (2 references)
num  target     prot opt source               destination         
1    RETURN     all  --  0.0.0.0/0            0.0.0.0/0

docker的客户端来源有三种

3、host模式

一个容器中要隔离6类名称空间

思考:有三个容器,这个三个容器只隔离三个名称空间 user mount pid,而另外三个是容器共享的,会是什么现象,如下图

    Docker系列4:Docker网络虚拟化基础

让容器共享物理机的名称空间

4、NULL模式

5、容器模型分类示意图

  Docker系列4:Docker网络虚拟化基础

6、查看创建容器的时网络信息

查看一下 bridged 网络模型信息

[root@host1 ~]# docker network inspect bridge
        ...
        ...
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
        ...
        ...
        ...
            "com.docker.network.bridge.name": "docker0",
        ...

查看容器的网络类型

[root@host1 ~]# docker container inspect vh2
        ...
        ...
        ...
        "NetworkSettings": {
            "Bridge": "",
        ...
        ...
        ...


推荐阅读:
  1. Docker基础(4)——Dockerfile书写
  2. Docker系列9:Docker file指令详解(1)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

docker k8s 容器

上一篇:PLIST基本缺陷列表与GLIST 成长缺陷列表

下一篇:建议收藏:不容错过的 Node.js 项目架构

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》