美文网首页
Docker系列之七:Docker网络

Docker系列之七:Docker网络

作者: 小六的昵称已被使用 | 来源:发表于2019-02-25 18:33 被阅读0次

    title: Docker系列之七:Docker网络
    categories: Docker
    tags:
    - Docker
    timezone: Asia/Shanghai
    date: 2019-02-25


    (一).Docker默认的三种网络模式

    Docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多个 host 的网络

    Docker 安装时会自动在 host 上创建三个网络,我们可用 docker network ls 命令查看:

    [root@centos181001 ~]# docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    1d9172a1d121        bridge              bridge              local
    7ff3f15e910e        host                host                local
    24e978b44934        none                null                local
    

    1.none 网络

    • 故名思议,none 网络就是什么都没有的网络。
    • 挂在这个网络下的容器除了 lo,没有其他任何网卡。
    • 容器创建时,可以通过 --network=none 指定使用 none 网络。
    • 一些对安全性要求高并且不需要联网的应用可以使用 none 网络。

    2.host 网络

    • 连接到 host 网络的容器共享 Docker host 的网络栈,容器的网络配置与 host 完全一样。
    • 可以通过 --network=host 指定使用 host 网络。
    • 直接使用 Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择 host 网络。
    • 当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host 上已经使用的端口就不能再用了。
    • Docker host 的另一个用途是让容器可以直接配置 host 网路。
    • 比如某些跨 host 的网络解决方案,其本身也是以容器方式运行的,这些方案需要对网络进行配置

    3.bridge网络

    • Docker 安装时会创建一个 命名为 docker0 的 linux bridge。
    • 如果不指定--network,创建的容器默认都会挂到 docker0 上。
    • 可以通过docker network inspect bridge命令查看bridge 网络的配置信息:

    (二).手动创建user-defined 网络

    Docker 提供三种 user-defined 网络驱动:bridge, overlay 和 macvlan。

    docker network create --driver bridge new-bridge
    docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 new-bridge
    
    docker network inspect new-bridge
    

    (二).容器之间的连通性

    1.两个容器都使用默认的bridge网络,直接可以使用IP地址PING通

    ## 1.启动两个容器
    docker run -it --name centos1 centos
    docker run -it --name centos2 centos
    
    ## 2.查看连个容器分别分配的IP地址是多少
    docker network inspect bridge
    
    ## 3.两个容器之间使用IP互PING是可以通的
    

    2.两个容器使用不同的bridge网络,

    ## 1.创建两个bridge网络
    docker network create --driver bridge new-bridge1
    docker network create --driver bridge new-bridge2
    
    ## 2.运行两个容器,分别指定两个不同的bridge网络
    docker run -it --rm --network new-bridge1 --name centos1 centos
    docker run -it --rm --network new-bridge2 --name centos2 centos
    
    ## 3.分别查看两个容器的IP地址,经过测试两个IP地址之间是不能互通的
    centos1 172.19.0.2
    centos2 172.20.0.2
    
    ## 4.为CentOS1主机添加new-bridge2网卡实现两个主机间互通
    ## 4.为CentOS2主机添加new-bridge1网卡实现两个主机间互通
    docker network connect new-bridge2 centos1
    docker network connect new-bridge1 centos2
    

    (三).容器间通信的三种方式

    1.IP 通信:

    两个容器必须要有属于同一个网络的网卡就可以使用IP互相连接
    

    2.Docker DNS Server:

    通过 IP 访问容器虽然满足了通信的需求,但还是不够灵活。因为我们在部署应用之前可能无法确定 IP,部署之后再指定要访问的 IP 会比较麻烦。对于这个问题,可以通过 docker 自带的 DNS 服务解决。

    • 使用 docker DNS 需要满足的3个条件:
    • 1.只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的。
    • 2.两个容器必须在同一个网络中
    • 3.必须通过--name指定容器名字
    ## 示例:
    ## 1.创建一个user-defined 网络
    docker network create --driver bridge new-bridge
    
    ## 2.启动两个容器
    docker run -it --rm --network new-bridge --name centos1 centos
    docker run -it --rm --network new-bridge --name centos2 centos
    
    ## 3.查看两个容器IP地址
    docker network inspect new-bridge
    
        centos1     172.21.0.2
        centos2     172.21.0.3
    
    ## 4.测试互通性(以下都是可以PING通的)
    ## 在centos1容器内执行:
    ping centos2
    ping 172.21.0.3
    
    ## 在centos2容器内执行:
    ping centos1
    ping 172.21.0.2
    

    3.joined容器

    joined 容器是另一种实现容器间通信的方式。

    joined 容器非常特别,它可以使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined 容器之间可以通过 127.0.0.1 直接通信。

    示例:

    ## 1.先创建一个容器
    docker run -it --rm --name centos1 centos
    
    ## 2.创建第二个容器,并指定 jointed 容器为centos1
    docker run -it --rm --name centos2 --network container:centos1 centos
    
    ## 3.登录两个容器分别查看网络信息
    yum install -y net-tools
    ifconfig
    
    发现两个容器的网卡MAC地址和IP地址完全一样,它们共享了相同的网络栈。他们之间可以直接用127.0.0.1访问互相的服务。
    

    joined 容器非常适合以下场景:

    • 不同容器中的程序希望通过 loopback 高效快速地通信,比如 web server 与 app server。
    • 希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。

    附录:docker网络相关命令详解

    docker network

    [root@centos181001 ~]# docker network --help
    
    Usage:  docker network COMMAND
    
    Manage networks
    管理网络
    
    Commands:
      connect     Connect a container to a network
                    将一个容器连接到某网络
    
      create      Create a network
                    创建一个网络
    
      disconnect  Disconnect a container from a network
                    断开一个容器与某个网络的连接
    
      inspect     Display detailed information on one or more networks
                    显示一个或多个网络的详细信息
    
      ls          List networks
                    显示网络
    
      prune       Remove all unused networks
                    删除所有未使用的网络
    
      rm          Remove one or more networks
                    删除一个或多个网络
    
    Run 'docker network COMMAND --help' for more information on a command.
    

    docker network connect - 将一个容器连接到某网络

    [root@centos181001 ~]# docker network connect --help
    
    Usage:  docker network connect [OPTIONS] NETWORK CONTAINER
    
    Connect a container to a network
    将一个容器连接到某网络
    
    Options:
          --alias strings           Add network-scoped alias for the container
          --ip string               IPv4 address (e.g., 172.30.100.104)
          --ip6 string              IPv6 address (e.g., 2001:db8::33)
          --link list               Add link to another container
                                    添加链接到另一个容器
    
          --link-local-ip strings   Add a link-local address for the container
                                    为容器添加链接本地地址
    
    
    示例:将centos1容器连接到手动建立的new-bridge2网络
    docker network connect new-bridge2 centos1
    

    docker network create - 创建一个网络

    [root@centos181001 ~]# docker network create --help
    
    Usage:  docker network create [OPTIONS] NETWORK
    
    Create a network
    
    Options:
          --attachable           Enable manual container attachment
          --aux-address map      Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
          --config-from string   The network from which copying the configuration
                                    从目前已经存在的某个网络复制配置
    
          --config-only          Create a configuration only network
      -d, --driver string        Driver to manage the Network (default "bridge")
                                    管理网络的驱动程序(默认“桥”)
                                    接受以下3个参数:bridge、macvlan、 overlay
    
          --gateway strings      IPv4 or IPv6 Gateway for the master subnet
                                    主子网的IPv4或IPv6网关,格式:192.168.0.1
    
          --ingress              Create swarm routing-mesh network
                                    创建swarm routing-mesh网络
    
          --internal             Restrict external access to the network
                                    限制对网络的外部访问
    
          --ip-range strings     Allocate container ip from a sub-range
                                    设置子网IP分配区间
    
          --ipam-driver string   IP Address Management Driver (default "default")
                                    IP地址管理驱动程序(默认为“默认”)
    
          --ipam-opt map         Set IPAM driver specific options (default map[])
          --ipv6                 Enable IPv6 networking
                                    允许IPV6网络
    
          --label list           Set metadata on a network
                                    为网络设置标签
    
      -o, --opt map              Set driver specific options (default map[])
          --scope string         Control the network's scope
                                    网络范围,支持:local  swarm
    
          --subnet strings       Subnet in CIDR format that represents a network segment
                                    指定子网,格式:192.168.0.1/24
    
    ## 示例:创建一个桥接网络,网络名称为:new-bridge1
    docker network create --driver bridge new-bridge1
    

    相关文章

      网友评论

          本文标题:Docker系列之七:Docker网络

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