• Docker 容器网络


    默认网络

    当安装docker时,它会自动创建3个网络。可以使用docker network ls 来查看。
     
    zane@zane-V:~$ docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    4b10534b40ff        bridge              bridge              local               
    7dbe50e049ea        host                host                local                          
    08bfed547b1e        none                null                local
    当运行容器的时候,可以指定容器使用哪个网络,用--network 参数。
     
    bridge网络代表的是出现在ifconfig 中的 docker0. 除非你使用docker run --network=<>来指定使用的网络,
    否则都会使用这个默认的bridge网络。
     
    zane@zane-V:~$ ifconfig
     
    docker0   Link encap:以太网  硬件地址 02:42:dc:06:cb:3c 
              inet 地址:172.17.0.1  广播:0.0.0.0  掩码:255.255.0.0
              inet6 地址: fe80::42:dcff:fe06:cb3c/64 Scope:Link
              UP BROADCAST MULTICAST  MTU:1500  跃点数:1
              接收数据包:47395 错误:0 丢弃:0 过载:0 帧数:0
              发送数据包:49555 错误:0 丢弃:0 过载:0 载波:0
              碰撞:0 发送队列长度:0
              接收字节:1932484 (1.9 MB)  发送字节:156709338 (156.7 MB)
    可以查看默认网络,检查默认网络,但是不能删除默认网络。可以增加自己定义的网络,这些在你长时间不用可以删除的。
    我们先来看看默认bridge网络,然后再学习如何创建自己的网络。
     
    默认bridge网络细节

     
    默认bridge网络存在于所有的docker主机。docker network inspect 命令返回关于网络的信息:
    zane@zane-V:~$ docker network inspect bridge
    [
        {
            "Name": "bridge",
            "Id": "4b10534b40ffa1d92610668060d8b831079a213f81f82c4f97f71ed1eb54b441",
            "Scope": "local",
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": null,
                "Config": [
                    {
                        "Subnet": "172.17.0.0/16",
                        "Gateway": "172.17.0.1"
                    }
                ]
            },
            "Internal": false,
            "Containers": {},
            "Options": {
                "com.docker.network.bridge.default_bridge": "true",
                "com.docker.network.bridge.enable_icc": "true",
                "com.docker.network.bridge.enable_ip_masquerade": "true",
                "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
                "com.docker.network.bridge.name": "docker0",
                "com.docker.network.driver.mtu": "1500"
            },
            "Labels": {}
        }
    ]
    docker引擎自动创建子网络和路由。docker run 命令自动添加新的容器到这个网络。
    zane@zane-V:~$ docker run -itd --name=container1 busybox
    Unable to find image 'busybox:latest' locally
    latest: Pulling from library/busybox
    557a0c95bfcd: Pull complete
    Digest: sha256:ae007bdb45fc0d56e3d705b97640ac24844bcc9ce4c8b8493f216a57ab6af0d5
    Status: Downloaded newer image for busybox:latest
    72b7379b7d426f4bab0a41a83643da3e2a40ed38f976154a413b914326af330b
    zane@zane-V:~$ docker run -itd --name=container2 busybox
    e9bce535ae32945f5e43340facdb6c16c93d92119e85b61c6cb7a5379a0caf63
    创建两个容器之后再次检测网络,会显示新的容器在这个默认bridge网络中:
     
    zane@zane-V:~$ docker network inspect bridge
    [
        {
            "Name": "bridge",
            "Id": "4b10534b40ffa1d92610668060d8b831079a213f81f82c4f97f71ed1eb54b441",
            "Scope": "local",
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": null,
                "Config": [
                    {
                        "Subnet": "172.17.0.0/16",
                        "Gateway": "172.17.0.1"
                    }
                ]
            },
            "Internal": false,
            "Containers": {
                "72b7379b7d426f4bab0a41a83643da3e2a40ed38f976154a413b914326af330b": {
                    "Name": "container1",
                    "EndpointID": "63adfc2048157821ef74c5ff7220053d47df2e34042a93938fb9d653188bf121",
                    "MacAddress": "02:42:ac:11:00:02",
                    "IPv4Address": "172.17.0.2/16",
                    "IPv6Address": ""
                },
                "e9bce535ae32945f5e43340facdb6c16c93d92119e85b61c6cb7a5379a0caf63": {
                    "Name": "container2",
                    "EndpointID": "0a2d00f6688b36431e8338583ae30d8d23451dc42b8edc058c3622d3e5a51aef",
                    "MacAddress": "02:42:ac:11:00:03",
                    "IPv4Address": "172.17.0.3/16",
                    "IPv6Address": ""
                }
            },
            "Options": {
                "com.docker.network.bridge.default_bridge": "true",
                "com.docker.network.bridge.enable_icc": "true",
                "com.docker.network.bridge.enable_ip_masquerade": "true",
                "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
                "com.docker.network.bridge.name": "docker0",
                "com.docker.network.driver.mtu": "1500"
            },
            "Labels": {}
        }
    ]
    容器使用ip地址和其他的容器通讯。docker不支持自动发现服务,在默认bridge网络中。
    如果你想使用容器的名称来通讯,你必须通过 docker run --link 选项。
     
    你可以连接一个正在运行的容器,然后检查它的配置文件:
    zane@zane-V:~$ docker attach container1
    / # ifconfig
    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:37 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:5031 (4.9 KiB)  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:0
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
     
    / # whoami
    root
    / # uname -a
    Linux 72b7379b7d42 4.2.0-27-generic #32~14.04.1-Ubuntu SMP Fri Jan 22 15:32:26 UTC 2016 x86_64 GNU/Linux
    / # exit
    zane@zane-V:~$
    注意:上面的exit 会使整个container1 停止。而不是想象中的退出了这个shell。
     
    重启container1,看看能不能和上面的container2相通:
    zane@zane-V:~$ docker attach container1
    / # ping -w3 172.17.0.3
    PING 172.17.0.3 (172.17.0.3): 56 data bytes
    64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.071 ms
    64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.045 ms
    64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.047 ms
     
    --- 172.17.0.3 ping statistics ---
    3 packets transmitted, 3 packets received, 0% packet loss
    round-trip min/avg/max = 0.045/0.054/0.071 ms
    退出刚刚的连接,使container1继续运行着,使用 Ctrl -p + ctrl -q 。
     
    桥接网路

     
    用户创建定义的最简单的网络就是一个桥接网路。这个网路和默认的docker0网络相似。
     
    zane@zane-V:~$ docker network create --driver bridge isolated_nw
    6e9792814d7ec6ab954c207dbec1eb61dba1f9b37750fba9e5f9721c074901fe
    zane@zane-V:~$ docker network inspect isolated_nw
    [
        {
            "Name": "isolated_nw",
            "Id": "6e9792814d7ec6ab954c207dbec1eb61dba1f9b37750fba9e5f9721c074901fe",
            "Scope": "local",
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": {},
                "Config": [
                    {
                        "Subnet": "172.19.0.0/16",
                        "Gateway": "172.19.0.1/16"
                    }
                ]
            },
            "Internal": false,
            "Containers": {},
            "Options": {},
            "Labels": {}
        }
    ]
    zane@zane-V:~$ docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    4b10534b40ff        bridge              bridge              local               
    7dbe50e049ea        host                host                local               
    6e9792814d7e        isolated_nw         bridge              local               
    c741cdd168b0        my-bridge-network   bridge              local               
    08bfed547b1e        none                null                local 
    当你创建了一个网络,可以启动容器并使用这个网络。通过docker run --network=<NETWORK>选项。
    zane@zane-V:~$ docker run --network=isolated_nw -itd --name=container3 busybox
    ff22003c26acb64fb7b867b4cbaeb96ebf7b11765a2623379c82aa33182de026
    zane@zane-V:~$ docker network inspect isolated_nw
    [
        {
            "Name": "isolated_nw",
            "Id": "6e9792814d7ec6ab954c207dbec1eb61dba1f9b37750fba9e5f9721c074901fe",
            "Scope": "local",
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": {},
                "Config": [
                    {
                        "Subnet": "172.19.0.0/16",
                        "Gateway": "172.19.0.1/16"
                    }
                ]
            },
            "Internal": false,
            "Containers": {
                "ff22003c26acb64fb7b867b4cbaeb96ebf7b11765a2623379c82aa33182de026": {
                    "Name": "container3",
                    "EndpointID": "7bea487483d2e4a4d1e7eba08b58a596df884e738b0a5d5219abfa57ebefc89e",
                    "MacAddress": "02:42:ac:13:00:02",
                    "IPv4Address": "172.19.0.2/16",
                    "IPv6Address": ""
                }
            },
            "Options": {},
            "Labels": {}
        }
    ]
    在同一个网络中的容器可以立刻相互通信。虽然这个网络本身与其他网络中的容器 是隔离的。
     
    在用户自己定义的bridge网络,linking 是不支持的。你可以给网络中容器开放一个公共的容器端口。
    如果你想使桥接网络的一部分可用于外部网络,这将是非常有用的。
    如果你想在单一主机上运行一个相对小的网络,使用桥接网络是有效果的。
     
    然而你想创建一个显著的大 网络,可以通过overlay 网络来实现。
     
    docker_gwbridge 网络

     
    docker在两种情况下回自动创建一个本地的桥接网络,docker_gwbridge:
    • 当你初始化或者加入一个swarm,Dcoker会创建docker_gwbridge.
      • 并使用它作为 不同主机的swarm 节点通讯网络。
    • 当没有一个容器网络可以提供与外部的连接,
      • Docker将容器连接到docker_gwbridge网络以及容器的其他网络,
      • 以便容器可以连接到外部网络或其他swarm节点。
    如果需要自定义配置,你可以提前创建一个docker_gwbridge.除此之后,在有需求的时候才创建它。
     
    下面的例子通过一些自定义的选项来创建docker_gwbridge:
    zane@zane-V:~$ docker network create --subnet 172.30.0.0/16 
    > --opt com.docker.network.bridge.name=docker_gwbridge 
    > --opt com.docker.network.bridge.enable_icc=false 
    > docker_gwbridge
    689e4d893ca525c9e6765abbbe65d68f40ce2bca9592cf6c2b147b06647f8354 
    当您使用overlay网络时,docker_gwbridge网络总是存在。
     
    Docker swarm模式的overlay网络

    你可以在一个运行swarm 模式的,管理节点中创建一个overlay网络,而不是使用外部键值存储。
    该swarm使overlay网络仅对swarm中需要服务的节点可用。
    当你创建一个使用overlay网络的服务,管理节点自动扩展overlay网络到那个运行服务任务的节点中。
     
    下面的示例显示如何创建网络并将其用于来自swarm中的管理器节点的服务:
     
    # Create an overlay network `my-multi-host-network`.
    $ docker network create 
    --driver overlay 
    --subnet 10.0.9.0/24 
    my-multi-host-network
    400g6bwzd68jizzdx5pgyoe95
     
    # Create an nginx service and extend the my-multi-host-network to nodes where
    # the service's tasks run.
    $ docker service create --replicas 2 --network my-multi-host-network --name my-web nginx
     
    716thylsndqma81j6kkkb5aus
    具有额外键值存储的overlay网络

     
    如果你在swarm 模式下没有使用Docker 引擎,overlay网络需要一个有效的键值存储服务。
    支持键值存储的包括Consul,Etcd,ZooKeeper。在这个版本的引擎中创建网络之前,必须安装和配置你选择的键值存储服务。
     
    注意:在Doker 引擎中运行swarm 模式,和使用其他键值存储的网络是不兼容的。
     
    网络中的每台主机必须运行着Docker 引擎的实例。
    这简单的方式就是提供的主机都是Docker 主机.
    应该在每台主机上开放下面的端口:
     
    在创建overlay 网络前,你需要在docker daemon中配置一些选项。
    OptionDescription
    --cluster-store=PROVIDER://URL
    
    Describes the location of the KV service.
    --cluster-advertise=HOST_IP|HOST_IFACE:PORT
    
    The IP address or interface of the HOST used for clustering.
    --cluster-store-opt=KEY-VALUE OPTIONS
    
    Options such as TLS certificate or tuning discovery Timers
    在swarm中的一台机器上创建overlay 网络
    $ docker network create --driver overlay my-multi-host-network
    这会使得单一网络跨越多个主机。overlay网络为容器提供完全的隔离
    之后在每台主机,创建容器的时候确定指定了网络的名字。
     
    $ docker run -itd --network=my-multi-host-network busybox
     
    每次连接,每个容器都可以和网络中的所有容器相连而不管这些容器是哪个Docker 主机创建的。
     
    定制网络插件

    只要你想,你可以写自己的网络驱动插件。
     
    总结

     
    • 一般容器使用ip地址通讯,也可以使用容器名称进行通信,但必须制定参数
      • docker run --link
    • 连接到正在运行的容器中
      • docker attach container1
      • 注意:误退出容器
        • 在容器shell 界面 的exit 会导致容器停止,而不是仅仅退出shell
        • 正常退出可以使用 ctr -p + ctr -q 
    • 同一网络中的容器可以通信,与其他网络中的容器隔离
    • 开放共同端口,用于在桥接模式下,本地主机容器与外部主机容器通信
    • docker_gwbridge 用于与外部网络连接
  • 相关阅读:
    python协程爬取某网站的老赖数据
    python异步回调顺序?是否加锁?
    go语言循环变量
    使用memory_profiler异常
    安装python性能检测工具line_profiler
    等我!
    pytorch代码跟着写
    Python异常类型总结
    Python项目代码阅读【不断更新】
    夏令营体会
  • 原文地址:https://www.cnblogs.com/Aiapple/p/6991475.html
Copyright © 2020-2023  润新知