玖叶教程网

前端编程开发入门

Docker网络(中)(docker0网络)

上一篇我们主要讲了一些简单的docker网络,包括自定义网络,但都是限制于一台主机,这节我们主要来学习下容器访问不同主机上的容器和访问容器外的通信网络。

一、容器访问外部通信

我们的主机和默认的网桥容器都是可以访问外部网络,通过抓包可以看出来是docker0也是通过本机的ens33网络把流量转发到外网的

(1)、容器busybox发出ping包:172.17.0.6 > www.baidu.com

(2)、docker0收到数据包,发现是请求外网的地址,交给NAT处理

(3)、NAT讲源地址转换为ens33的地址:192.168.157.147去访问www.baidu.com

(4)、ping包从网卡ens33发出去,到达www.baidu.com

(5)、回包以相同的原因发给容器busybox,实现了和外网通信

二、外部访问容器

外部访问容器的方式是通过端口映射,将容器的端口映射到宿主机上,实现监听和被访问,每一个映射端口,host都会启动一个docker-proxy进程来处理转发访问的流量

[root@my_server ~]# docker run -d -p 80 httpd
a4a1105bb26d047b5eb5638051cb06360ef4a46ad587738c90ee8c2c0ebb9259
[root@my_server ~]# docker ps |grep a4a
a4a1105bb26d        httpd               "httpd-foreground"   11 seconds ago      Up 10 seconds       0.0.0.0:32768->80/tcp   keen_wilbur
[root@my_server ~]# docker port a4a1105bb26d
80/tcp -> 0.0.0.0:32768
 [root@my_server ~]# curl 127.0.0.1:32768
<html><body><h1>It works!</h1></body></html>

[root@my_server ~]# ps -ef|grep docker-proxy
root      24113   6615  0 14:35 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 32768 -container-ip 172.17.0.5 -container-port 80
root      24406  19472  0 14:38 pts/1    00:00:00 grep --color=auto docker-proxy

三、 docker原生网络方案---overlay

概念理解:docker提供overlay driver,用户创建基于VxLAN的overlay网络,可用将二层数据封装到UDP进行传输,VxLAN提供与VLAN相同的二次以太网服务,但拥有更强的扩展性和灵活性

下面我们就通过实验来理解overlay网络

3.1、部署consul: 一款服务发现和配置的工具,用来保存网络信息

docker run -d -p 8500:8500 -h consul --name sonsul progrium/consul -server  -bootstrap??

浏览器打开http://HostIP:8500 ( http://180.76.166.112:8500 )


3.2、修改其他机器的docker daemon配置文件

$ vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd  -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=consul://180.76.166.112:8500 --cluster-advertise=eth0:2375

$ systemctl daemon-reload
$ systemctl restart docker 
  • --cluster-store 指定consul的地址
  • --cluster-advertise 告诉consul自己的地址

  • 3.3、在host1上创建overlay网络

    $ docker network create -d overlay ov_net1    -d=--driver
    
    $ docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    8a0c50e2cc2a        bridge              bridge              local
    a0eae8fcf59f        host                host                local
    5c1ae9b1bbdc        none                null                local
    7db2c879fd97        ov_net1             overlay             global

    在另一台host2上查看网络

    $ docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    e8aca831788d        bridge              bridge              local
    863d202d5ec8        host                host                local
    09428010ca91        none                null                local
    7db2c879fd97        ov_net1             overlay             global

    要想使用Docker原生Overlay网络,需要满足下列任意条件

    • Docker 运行在Swarm
    • 使用键值存储的Docker主机集群 (需要内核版本>=3.12+),支持VXLAN数据包处理

    3.4、测试overlay网络,在host1运行bbox1容器

    $ docker run -itd --name bbox1 --network ov_net1 busybox
    
    $ docker exec bbox1 ip r
    default via 172.18.0.1 dev eth1 
    10.0.0.0/24 dev eth0 scope link  src 10.0.0.2 
    172.18.0.0/16 dev eth1 scope link  src 172.18.0.2

    在host2运行bbox2容器

    $ docker run -itd --name bbox2 --network ov_net1 busybox
    
    $ docker exec bbox2 ping -c 4 bbox1
    PING bbox1 (10.0.0.2): 56 data bytes
    64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.973 ms
    64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.769 ms
    64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.685 ms
    64 bytes from 10.0.0.2: seq=3 ttl=64 time=0.702 ms
    
    --- bbox1 ping statistics ---
    4 packets transmitted, 4 packets received, 0% pac

    四、 docker原生网络方案---macvlan

    原理:本身是linux kernel模块,允许同一个物理网卡配置多个MAC地址。即多个interface,每个接口配置自己IP,本质是一种网卡虚拟化技术

    优点:性能好

    4.1、开启网卡的混杂模式(两台都开启)

    ip link show eth0
    eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether fa:16:3e:8c:e3:94 brd ff:ff:ff:ff:ff:ff
    
    [root@instance-376y292g-2 ~]# ip link set eth0 promisc on
    [root@instance-376y292g-2 ~]# ip link show eth0
    2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
        link/ether fa:16:3e:8c:e3:94 brd ff:ff:ff:ff:ff:ff

    PROMISC:混杂模式,指一台机器的网卡能够接收所有经过它的数据流,而不论其目的地址是否是它。

    4.2、创建macvlan网络(在两台机器上都要执行)

    $ docker network create -d macvlan \
                   --subnet=192.168.32.0/24 \
                   --gateway=192.168.32.1 \
                   -o parent=eth0 mac_net1 

    这里网关应该是真实存在的,因为docker不会为macvlan创建网关

    -o parent 指定使用网络interface

    4.3、进行测试,在host1上运行bbox1容器,在host2上运行bbox2容器

    $ docker run -itd --name bbox1 --ip=192.168.32.10 --network=mac_net1 busybox
    $ docker run -itd --name bbox2 --ip=192.168.32.11 --network=mac_net1 busybox
    $ docker exec -it bbox2 ping -c 4 192.168.32.10

    本篇的介绍了docker如何和外部通信和外部如何访问容器,还有docker原生网络解决方案overlay和macvlan,下一节我们开始学习docker网络第三方常见的解决方案,感谢您的阅读,欢迎关注和转发

    发表评论:

    控制面板
    您好,欢迎到访网站!
      查看权限
    网站分类
    最新留言