容器网络

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 网络的一部分用于外部网络时尤其有用。下图显示了这种关系。
[img]http://dl2.iteye.com/upload/attachment/0126/0398/c4d6454a-9e67-33bd-94d8-473a4688033d.png[/img]
创建 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 网络,而不是单独的容器。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值