在Docker 1.7时,网络部分代码被抽离并成为单独的Docker网络库,即libnetwork。libnetwork使用CNM完成网络功能支持。

在Docker1.9时,引入整套的docker network子命令和跨主机网络支持。

CNM组件

沙盒

沙盒包含容器网络栈信息,可以对网络接口、路由和DNS等进行管理。

沙盒的实现机制可以是linux network namespace、FreeBSD Jail或其他机制。

端点

一个端点可以加入一个沙盒和一个网络,且只属于一个网络和一个沙盒。

端点的实现可以是veth pair、Open vSwitch内部端口等。

网络

网络是可以直接互联的端点。一个网络包含多个端点。

网络的实现可以是Linux bridge、VLAN等。

libnetwork驱动

bridge

Docker默认设置,libnetwork将创建的Docker容器连接到Docker网桥。

容器与外界通信需要使用NAT,增加了通信的复杂性。

host

libnetwork将不会为Docker容器创建网络协议栈,也就是net名字空间。Docker容器中的进程将处于宿主机的网络环境。

容器的其他方面,如文件系统、进程列表等都是和宿主机隔离的。

但host驱动降低了容器与容器之间,容器与宿主机之间的网络隔离。

overlay

采用IETF标准的VXLAN方式,适合大规模云计算虚拟化环境的SDN controller模式。

使用时需要额外的配置存储服务,如Consul、etcd或ZooKeeper。因此在docker服务启动时,需要添加配置存储服务地址。

remote

remote驱动并没有真正的网络实现,而是调用用户实现的网络驱动插件。

null

Docker容器拥有自己的network namespace,但不会做任何网络配置。容器除了loopback网卡之外,没有其他的任何网卡、IP、路由等信息。这可以让用户最大自由的定义容器的网络环境。

创建网络示例

创建两个网络backend和frontend

$ sudo docker network create backend
$ sudo docker network create frontend

查看宿主机上的所有Docker网络

$ sudo docker network ls
NETWORK ID    NAME        DRIVER
97b.......    backend     bridge
c2c.......    frontend    bridge
fde.......    bridge      bridge
936.......    none        null
5b4.......    host        host

除了backend和frontend,其他3个网络是docker daemon默认创建,使用3种不同驱动。

将container1和container2加入backend网络,将container3加入frontend网络

$ sudo docker run -it --name container1 --net backend busybox
$ sudo docker run -it --name container2 --net backend busybox
$ sudo docker run -it --name container3 --net frontend busybox

将container2加入frontend

$ sudo docker network connect frontend container2

results matching ""

    No results matching ""