Docker 容器之 Network

好风 发表于 2016-12-12T06:17:45.277356Z
引用地址:https://plus.ooclab.com/note/article/1318

本文以 docker 1.12 为环境,介绍容器网络

参考:

基础

查看当前的网络:

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
ea0ea5394670        bridge              bridge              local               
06877ab4a344        host                host                local               
d2ff49d9f891        none                null                local

当你运行容器时,可以使用 --network 指定上面出现的一个网络。

Docker 默认创建有3种网络:

  • bridge : 与 docker0 网口对应。是默认的 docker 网络(指不带 --network 选项的 docker run 创建的容器)。(注意,docker-compose 现在默认自创网络)
  • host : 与 Host 的网络环境一致。
  • none : 无网络。通常在一个容器不需要网络环境时,可以指定此网络。

bridge

查看 bridge 网络详细信息:

$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "ea0ea53946703144d36fcd2bd06607658e0b9261464b03f1171ecc8f5b1fc29e",
        "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 run 命令默认将新创建的容器加入此网络。

执行下列命令创建两个 busybox 容器,并再次查看 bridge 网络情况。

docker run -itd --name=container1 busybox
docker run -itd --name=container1 busybox
docker network inspect bridge

用户自定义网络

bridge

最简单的 user-defined 网络是使用 bridge 网络:

$ docker network create --driver bridge isolated_nw
a69e29c160f0bd357be44bb4bd4219c306e79e5a9b4b8f50fb4c5aa26cbd1925
$ docker network inspect isolated_nw
[
    {
        "Name": "isolated_nw",
        "Id": "a69e29c160f0bd357be44bb4bd4219c306e79e5a9b4b8f50fb4c5aa26cbd1925",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

现在可以在创建 container 时使用自定义网络:

$ docker run --network=isolated_nw -itd --name=container3 busybox
$ docker network inspect isolated_nw

within a user-defined bridge network (在这些网络之间,而不是之内),不能使用 --link , 可以使用 port 映射。

overlay

需要开启 swarm mode 或者使用第三方 k-v store (Consul, Etcd, and ZooKeeper)。

参考:

创建自定义的 overlay 网络:

$ docker network create \
  --driver overlay \
  --subnet 10.0.9.0/24 \
  my-multi-host-network

创建一个 service 使用该网络:

$ docker service create --replicas 2 --network my-multi-host-network --name my-web nginx

定制网络插件

我们可以开发自己的网络 driver plugin 。