zoukankan      html  css  js  c++  java
  • 07、Docker网络模式

    1、docker四种网络模式

    • Bridge contauner   桥接式网络模式
    • Host(open) container   开放式网络模式
    • Container(join) container   联合挂载式网络模式,是host网络模式的延伸
    • None(Close) container   封闭式网络模式

    可以通过docker network ls命令来查看

    [root@hackerlin ~]# docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    4a308293f565        bridge              bridge              local
    6a6f7ff6d387        host                host                local
    febe5759f23c        none                null                local

    2、bridge网络模式

      当docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的docker容器会连接到这个虚拟网桥上,所以有默认地址172.17.0.0/16的地址,虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中

      从docker0子网中分配一个IP地址给我容器使用,并设置docker0的IP地址为容器的默认网关,在主机上创建一对虚拟网络veth pair设备,docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的命名命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看

    [root@hackerlin ~]# brctl show
    bridge name    bridge id        STP enabled    interfaces
    docker0        8000.02427cd7e9c0    no        

      bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能,可以使用iptables -t nat -vnL查看

    [root@hackerlin ~]# iptables -t nat -vnL
    Chain POSTROUTING (policy ACCEPT 20 packets, 1238 bytes)
     pkts bytes target     prot opt in     out     source               destination         
        0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0

    2.1、bridge模式示意图

     2.2、演示

    bridge网络模式:--network不指定,默认也是bridge模式

    [root@hackerlin ~]# docker run --name b1 -it --network bridge --rm docker.io/busybox:latest     #创建一个容器
    WARNING: IPv4 forwarding is disabled. Networking will not work.
    / # ifconfig    #查看其IP地址
    eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
              inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
              inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:6 errors:0 dropped:0 overruns:0 frame:0
              TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:516 (516.0 B)  TX bytes:516 (516.0 B)
    
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    
    / # route -n     #查看其路由
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
    172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0
    / # ping 192.168.72.200     #ping宿主机的IP地址可以ping通
    PING 192.168.72.200 (192.168.72.200): 56 data bytes
    64 bytes from 192.168.72.200: seq=0 ttl=64 time=0.261 ms
    64 bytes from 192.168.72.200: seq=1 ttl=64 time=0.081 ms
    64 bytes from 192.168.72.200: seq=2 ttl=64 time=0.079 ms
    64 bytes from 192.168.72.200: seq=3 ttl=64 time=0.087 ms
    ^C
    --- 192.168.72.200 ping statistics ---
    4 packets transmitted, 4 packets received, 0% packet loss
    round-trip min/avg/max = 0.079/0.127/0.261 ms
    / # 

    3、Host网络模式

      如果启动容器的时候使用host模式,那么这个容器将不会获取到一个独立的network namespace ,而是和宿主机共用一个network namespace,容器将不会虚拟出自己的网卡,配置自己的IP地址等,而是使用宿主机的IP和端口,但是,容器其他方面,如文件系统、进程列表等还是和宿主机隔离的

    3.1、host模式示意图

     3.2、演示

    [root@hackerlin ~]# docker run --name b2 -it --network host --rm docker.io/busybox:latest
    / # ifconfig -a
    docker0   Link encap:Ethernet  HWaddr 02:42:7C:D7:E9:C0  
              inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
              inet6 addr: fe80::42:7cff:fed7:e9c0/64 Scope:Link
              UP BROADCAST MULTICAST  MTU:1500  Metric:1
              RX packets:52 errors:0 dropped:0 overruns:0 frame:0
              TX packets:22 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:4298 (4.1 KiB)  TX bytes:1718 (1.6 KiB)
    
    ens33     Link encap:Ethernet  HWaddr 00:0C:29:54:56:5C  
              inet addr:192.168.72.200  Bcast:192.168.72.255  Mask:255.255.255.0
              inet6 addr: fe80::981a:1f98:c28:7ff8/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:74524 errors:0 dropped:0 overruns:0 frame:0
              TX packets:21701 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:76936352 (73.3 MiB)  TX bytes:1884925 (1.7 MiB)
    
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    
    / # 

    4、cobtainer网络模式

    ·  这个模式指定新创建的容器和已经存在的一个容器共享一个network namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的,两个容器的进程可以通过lo网卡设备通信

    4.1、container模式示意图

    4.2演示

    (1)在一个终端,使用bridge网络模式启动容器b1
    [root@hackerlin ~]# docker run --name b1 -it --rm busybox:latest 
    / # ifconfig   b1的ip为172.17.0.2
    eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  
              inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
              inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:6 errors:0 dropped:0 overruns:0 frame:0
              TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:508 (508.0 B)  TX bytes:508 (508.0 B)
    
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    / # echo "hello world b1" > /tmp/index.html
    / # httpd -h /tmp/  在b1上启动httpd服务
    / # netstat -nutl
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       
    tcp        0      0 :::80                   :::*                    LISTEN 
    2)在另一个终端使用Container 网络模式创建容器b2 [root@hackerlin ~]# docker run --name b2 -it --network container:b1 --rm busybox:latest / # ifconfig -a b2的ip和b1一样 eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02 inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:648 (648.0 B) TX bytes:648 (648.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) / # wget -O - -q 127.0.0.1 b1启动的httpd服务,在b2上直接访问 hello world b1 / # ls /tmp/ 但是文件系统并不共享,只共享网络

    5、None网络模式

      使用none模式,docker容器拥有自己的network namespace,但是,并不为docker容器进行任何网络配置,也就是说,这个docker容器没有网卡、IP、路由等信息,只有lo网络接口。需要我们自己为docker容器添加网卡、配置IP等

      不参与网络通信,运行于此类容器中的进程仅能访问本地回环接口;仅适用于进程无需网络通信的场景中,例如:备份、进程诊断及各种离线任务等。

      此模式也可以配置成跟宿主机同一网段的IP地址对外提供服务

    5.1、none模式示意图

    5.2、演示

    [root@hackerlin ~]# docker run --name b1 -it --network none --rm busybox:latest 
    / # ifconfig 
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    / # route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

    5.3、配置容器IP地址和宿主机同一网段

    修改宿主机的网卡配置文件为如下内容

    DEVICE=ens33
    BOOTPROTO=static
    ONBOOT=yes
    TYPE=Ethernet
    BRIDGE="br0"

    并在宿主机创建一个br0的桥接网卡,内容如下

    touch ifcfg-br0
    #网卡内容
    DEVICE="br0"
    BOOTPROTO=static
    ONBOOT=yes
    TYPE="Bridge"
    IPADDR=192.168.72.10
    NETMASK=255.255.255.0
    GATEWAY=192.168.72.2
    DNS1=61.128.128.68

    重启网络服务

    systemctl restart network
    systemctl restart docker

    下载给容器配置IP地址的工具pipwork

    git clone https://github.com/jpetazzo/pipework
    cp ~/pipework/pipework /usr/local/bin/

    运行容器的时候指定none模式

    docker run -itd --net=none --name=nginx1 --privileged docker.io/centos:centos7.7.1908 /usr/sbin/init

    然后使用pipwork工具给配置IP地址

    pipework br0 nginx1 192.168.72.100/24@192.168.72.2

    注意,如果关闭容器,在打开容器 IP地址需要重新配置!

     

     

  • 相关阅读:
    使用 asp.net mvc和 jQuery UI 控件包
    ServiceStack.Redis 使用教程
    HTC T8878刷机手册
    Entity Framework CodeFirst 文章汇集
    2011年Mono发展历程
    日志管理实用程序LogExpert
    使用 NuGet 管理项目库
    WCF 4.0路由服务Routing Service
    精进不休 .NET 4.0 (1) asp.net 4.0 新特性之web.config的改进, ViewStateMode, ClientIDMode, EnablePersistedSelection, 控件的其它一些改进
    精进不休 .NET 4.0 (7) ADO.NET Entity Framework 4.0 新特性
  • 原文地址:https://www.cnblogs.com/hackerlin/p/12696073.html
Copyright © 2011-2022 走看看