美文网首页
Docker 网络 (一)

Docker 网络 (一)

作者: wayyyy | 来源:发表于2018-09-26 23:22 被阅读0次

    Docker 网络从覆盖范围分为2类:

    • 单个host网路
    • 更复杂的多honst网络

    docker 安装时会自动在host上创建3个网络,可以用docker netwotrk ls命令查看:

    root@JD:~# docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    ef94058ac2d1        bridge              bridge              local
    e3735a28ba6e        host                host                local
    33ccd8769d68        none                null                local
    
    none 网络

    one 网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其他任何网卡。容器创建时,可以通过--network=none 指定使用 none 网络。

    root@JD:~# ocker run -ti --network=none busybox
    / # ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
    

    封闭意味着隔离,一些对安全性要求高并且不需要联网的应用可以使用 none 网络。

    host 网络

    连接到 host 网络的容器共享 Docker host 的网络栈,容器的网络配置与 host 完全一样。可以通过 --network=host 指定使用 host 网络。

    root@JD:~# ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP group default qlen 1000
        link/ether fa:16:3e:fb:04:56 brd ff:ff:ff:ff:ff:ff
        inet 192.168.0.3/20 brd 192.168.15.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::f816:3eff:fefb:456/64 scope link 
           valid_lft forever preferred_lft forever
    3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
        link/ether 02:42:8e:a8:29:31 brd ff:ff:ff:ff:ff:ff
        inet 172.17.0.1/16 scope global docker0
           valid_lft forever preferred_lft forever
    
    root@JD:~# docker run -it --network=host busybox
    / # ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast qlen 1000
        link/ether fa:16:3e:fb:04:56 brd ff:ff:ff:ff:ff:ff
        inet 192.168.0.3/20 brd 192.168.15.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::f816:3eff:fefb:456/64 scope link 
           valid_lft forever preferred_lft forever
    3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue 
        link/ether 02:42:8e:a8:29:31 brd ff:ff:ff:ff:ff:ff
        inet 172.17.0.1/16 scope global docker0
           valid_lft forever preferred_lft forever
    

    直接使用 Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择 host 网络。当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host 上已经使用的端口就不能再用了。

    bridge网络

    Docker 安装时会创建一个 命名为 docker0 的 linux bridge。如果不指定--network,创建的容器默认都会挂到 docker0 上。

    root@JD:~# brctl show
    bridge name bridge id       STP enabled interfaces
    docker0     8000.02428ea82931   no  
    

    interfaces为空,docker0上没有任何其他网络设备。创建一个容器有什么变化。

    root@JD:~# docker run -d httpd
    
    root@JD:~# brctl show
    bridge name bridge id       STP enabled interfaces
    docker0     8000.02428ea82931   no      veth81fc97e
    
    root@JD:~# docker exec -ti ce7e09953588
    root@ce7e09953588:/usr/local/apache2# ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
    4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
        link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.17.0.2/16 scope global eth0
           valid_lft forever preferred_lft forever
    

    一个新的网络接口 veth81fc97e 被挂到了 docker0 上,veth81fc97e就是新创建容器的虚拟网卡。

    容器有一个网卡eth0@if5。大家可能会问了,为什么不是veth81fc97e 呢?
    实际上eth0@if5 和veth81fc97e 是一对 veth pair。veth pair 是一种成对出现的特殊网络设备,可以把它们想象成由一根虚拟网线连接起来的一对网卡,网卡的一头(eth0@if5)在容器中,另一头(veth81fc97e )挂在网桥 docker0 上,其效果就是将 eth0@if5也挂在了 docker0 上。

    网络拓扑.png
    • 实践
      • 创建网桥
        # brctl addbr br2
        
      • 创建网络空间
        # ip netns add ns1
        # ip netns add ns2
        # ip netns list
        
      • 创建veth_peer
        # ip link add eth@ifn1 type veth peer name veth1
        # ip link add eth@ifn2 type veth peer name veth2
        
      • 将eth@ifn1和eth@ifn2放入网络空间中并设置ip
        # ip link set eth@ifn1 netns ns1
        # ip netns exec ns1 ip addr add local 192.168.10.200/24 dev eth@ifn1
        # ip link set eth@ifn2 netns ns2
        # ip netns exec ns2 ip addr add local 192.168.10.201/24 dev eth@ifn2
        
      • 将veth1和veth2挂到网桥中
        brctl addif br2 veth1
        brctl addif br2 veth2
        
      • 将所有设备up
        ip link set br2 up
        ip link set veth1 up
        ip link set veth2 up
        ip netns exec ns1 ip link set eth@ifn1 up
        ip netns exec ns2 ip link set eth@ifn2 up
        
      • 网络测试
        ip netns exec ns1 ping 192.168.10.201
        ip netns exec ns2 ping 192.168.10.200
        

    参考资料

    1. https://mp.weixin.qq.com/s?__biz=MzIwMTM5MjUwMg==&mid=2653587681&idx=1&sn=de0a60f143d4d8a1f814ce61027acff0&chksm=8d3080f8ba4709eebcf2887dfbd4efeae1e6e120e2c2a8c55740071c51e6a52be61f4a280323&scene=21#wechat_redirect

    相关文章

      网友评论

          本文标题:Docker 网络 (一)

          本文链接:https://www.haomeiwen.com/subject/xsojoftx.html