`

容器网络

阅读更多
    Docker 安装时,默认会创建三个网络,可使用“docker network ls”查看:
$ docker network ls
NETWORK ID          NAME                DRIVER
7fca4eb8c647        bridge              bridge
9f904ee27bf5        none                null
cf03ee007fb4        host                host

    运行容器时,可通过“--network”标记来指定想要连接的网络,不然默认使用的是 bridge 网络。容器中的网络接口 docker0 代表的就是 bridge 网络。
    none 网络可将容器添加到特定于容器的网络堆栈中。那个容器缺少网络接口。使用“docker attach”命令绑定到这样的一个容器,然后查看它的堆栈,就会发现类似下面的情况:
# 没指定使用 none 网络时的情况
$ docker run -itd --name normalcontainer busybox
$ docker attach normalcontainer
/ # cat /etc/hosts
127.0.0.localhost ip6-localhost ip6-loopback
fe00::0 ip6-mcastprefix
ff02::1 ip6-allrouters
172.17.0.2      ad7c6453bb9d
/ #
/ # 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:16 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:1296 (1.2 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:1
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ # exit

# 指定 none 网络时的情况
$ docker run -itd --network none --name nonenetcontainer busybox
$ docker attach nonenetcontainer
/ # cat /etc/hosts
localhost::1.0.0.ip6-localnet6-localhost ip6-loopback
ff00::0 ip6-allnodesfix
ff02::2 ip6-allrouters
/ #
/ # 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)
/ #
/ # ^p ^q       # 这里按下“Ctrl-p Ctrl-q”可让容器回到后台运行。
$

    而 host 网络是将容器添加到主机的网络堆栈上,也就是让容器与主机之间的网络不再隔离。比如,容器的 80 端口上运行的 Web 服务此时在主机的 80 端口上也能直接访问到。
    none 和 host 网络是不可直接配置的,而 bridge 可以。
    要查看一个或多个网络的详细信息,可以使用“docker network inspect”命令。
    使用默认的 bridge 网络连接的容器之间可以根据 IP 互相通信。由于 Docker 并不支持在默认的 bridge 网络上进行“自动服务发现(Automatic Service Discovery)”,所以若要容器可根据容器名解析出 IP 地址,就应该使用自定义的网络代替(虽然也可使用“docker run --link”选项关联多个容器到 docker0 网络上,但并不推荐)。
    要创建网络,可以使用“docker network create”命令,比如:
        docker network create --driver bridge isolated_nw
    自定义的网络不支持“--link”,但可以在此网络中的容器上发布和公开容器端口。这在想将 bridge 网络的一部分用于外部网络时尤其有用。下图显示了这种关系。

    创建 bridge 网络适用于想在单个主机上运行相对较小的网络时的情况。不过还可以通过创建 overlay 等网络来创建更大的网络。
    Docker 会在下面两种情形下自动创建一个名为 docker_gwbridge 的本地 bridge 网络:
    1、初始化或加入 swarm 时,可用来在不同主机的 swarm 节点之间进行通信。
    2、当没有一个容器网络可以提供对外连接时,除了当前的网络之外,Docker 还会把这个容器连接到 docker_gwbridge 网络,以便该容器能连接到外部网络或其他 swarm 节点。
    但是你也可以提前创建一个自定义的 docker_gwbridge 网络,如下例所示:
$ 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

    注意:使用 overlay 网络时,docker_gwbridgw 网络始终存在。
    你还可以在没有外部键值存储区的以 swarm 模式运行的管理器节点上创建一个 overlay 网络。swarm 使得 overlay 网络只对 swarm 中需要服务的节点可用。当使用 overlay 网络创建一个服务时,管理器节点会自动将该网络扩展到运行服务任务的节点。
    下面的示例演示如何创建网络并在 swarm 中的管理器节点中为服务使用它:
$ docker network create --driver overlay \
                        --subnet 10.0.9.0/24 \
                        my-multi-host-network
400g6bwzd68jizzdx5pgyoe95

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

    注意:只有 swarm 服务可以连接到 overlay 网络,而不是单独的容器。
  • 大小: 20.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics