• docker容器网络


    docker容器网络

    docker在安装后自动提供3种网络

     # docker network ls 查看
    
    [root@node0 ~]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    ca3ffc857d6b   bridge    bridge    local
    a3c6e9e82d4c   host      host      local
    68e0702fcaa6   none      null      local
    
    

    docker使用linux桥接,会虚拟一个docker容器网桥(docker0)

    • 启动容器时会根据docker0得网段分配ip地址,称作Container-IP(类似DHCP)
    • docker0是每个容器得默认网关
    • 各容器根据Container-IP直接通信
    [root@node0 ~]# ip a|grep docker0
    3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
        inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
    19: vethb965cf0@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    23: veth022ea6e@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    
    [root@node0 ~]# docker run -it --rm busybox
    / # 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
    
    

    docker4种网络模式

    网络模式 配置 说明
    host --network host 容器和宿主机共享Network namespace
    container --network container:NAME_OR_ID 容器和另外一个容器共享Network namespace
    none --network none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等
    bridge --network bridge 默认模式

    bridge模式

    docker启动时创建docker0虚拟网桥,

    • 在此主机创建的容器都会连接至该虚拟网桥上
    • 该主机所有容器都连接在一个二层网络中
    • bridge模式是docker的默认网络模式,不写--network参数,就是bridge模式。

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

    [root@node0 ~]# docker run fxx013/web:v0.3
    [root@node0 ~]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    ca3ffc857d6b   bridge    bridge    local
    a3c6e9e82d4c   host      host      local
    68e0702fcaa6   none      null      local
    [root@node0 ~]# nmcli device 
    DEVICE       TYPE      STATE      CONNECTION 
    ens160       ethernet  connected  ens160     
    docker0      bridge    connected  docker0    
    vethf26accc  ethernet  unmanaged  --         
    lo           loopback  unmanaged  --         
    
    [root@node0 ~]# ip a|grep veth
    31: vethf26accc@if30: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    
    [root@node0 ~]# docker run -it --rm fxx013/web:v0.3
    / # ip a|grep eth0
    18: eth0@if31: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
        inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
    

    如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机端口]:[容器端口]访问容器。

    docker run -p

    //映射容器端口到宿主机端
    [root@node0 ~]# docker run -it -p 80:80 --rm fxx013/web:v0.3
    [root@node0 ~]# ss -antl
    State   Recv-Q  Send-Q   Local Address:Port   Peer Address:Port  
    LISTEN  0       128            0.0.0.0:80          0.0.0.0:*     
    LISTEN  0       128            0.0.0.0:22          0.0.0.0:*     
    LISTEN  0       128               [::]:22             [::]:*
    
    [root@node0 ~]# docker ps
    CONTAINER ID   IMAGE             COMMAND                  CREATED              STATUS              PORTS                NAMES
    c87b0434bf11   fxx013/web:v0.3   "/bin/httpd -f -h /w…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   gracious_pasteur
    29258754a787   fxx013/web:v0.3   "/bin/httpd -f -h /w…"   14 minutes ago       Up 14 minutes                            kind_mclean
    [root@node0 ~]# docker inspect c87b0434bf11
    。。。
     "IPAddress": "172.17.0.3",
    //主机访问
    [root@node0 ~]# curl 172.17.0.3
    hello world
    //外部访问(如下图)
    

    container模式

    特点:

    • 这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace
    • 和一个指定的容器共享 IP、端口范围等
    • 除了网络方面,其他的如文件系统、进程列表等还是隔离的。
    • 两个容器的进程可以通过 lo 网卡设备通信。

    container模式如下图所示:

    [root@node0 ~]# docker run -it --rm fxx013/web:v0.3
    [root@node0 ~]# docker ps
    CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                NAMES
    d78098f34642   fxx013/web:v0.3   "/bin/httpd -f -h /w…"   9 seconds ago    Up 8 seconds
    [root@node0 ~]# docker inspect d78098f34642
    ...
     "IPAddress": "172.17.0.4",
     
    [root@node0 ~]# docker run  -it --rm --network container:d78098f34642 busybox:latest 
    / # ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
        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
    34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
        link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
        inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
           valid_lft forever preferred_lft forever
    

    host模式

    特点:

    • 和宿主机共用一个Network Namespace
    • 使用宿主机的IP和端口
    • 文件系统、进程列表等还是和宿主机隔离的
    • 可以直接使用宿主机的IP地址与外界通信,网络好
    • 唯一端口,不能重复使用,网络隔离性差

    [root@node0 ~]# docker run  -it --rm --network host busybox:latest 
    / # ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
        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: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq qlen 1000
        link/ether 00:0c:29:bb:6f:ff brd ff:ff:ff:ff:ff:ff
        inet 192.168.94.142/24 brd 192.168.94.255 scope global dynamic ens160
           valid_lft 1025sec preferred_lft 1025sec
        inet6 fe80::c566:2591:64e:9b7c/64 scope link 
           valid_lft forever preferred_lft forever
    [root@node0 ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        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: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether 00:0c:29:bb:6f:ff brd ff:ff:ff:ff:ff:ff
        inet 192.168.94.142/24 brd 192.168.94.255 scope global dynamic noprefixroute ens160
           valid_lft 989sec preferred_lft 989sec
        inet6 fe80::c566:2591:64e:9b7c/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    
    

    none模式

    • 容器创建后不进行任何网络配置
    • 只有lo回环网络
    • 网络安全性较好
    [root@node0 ~]# docker run  -it --rm --network none busybox:latest 
    / # ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
        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
    
    
  • 相关阅读:
    在服务端合并css和js以减少http请求数
    IE6 IE7(Q) IE8(Q) 不完全支持 !important 规则
    js 获取高度,宽度,绑定事件
    一段很有用的获取页面高度的js
    filter用AJAX取回动态数据进行筛选的时候,必须同时指定标签类型和 ID,才能正常进行筛选,要不然在Firefox下会出错
    匿名函数的链式调用
    js从数组中删除指定值(不是指定位置)的元素
    纯CSS的方法解决文字溢出与截断的问题
    javascript sort 排序
    WIN10系统找不到MSVCP120.dll
  • 原文地址:https://www.cnblogs.com/fangxinxin/p/14466182.html
Copyright © 2020-2023  润新知