容器网络概览
容器之间如何联通是个重要的问题。Docker官方文档 https://docs.docker.com/network/ 介绍了多种网络模式,本文加以阐述:
- bridge
- host
- container
- none
- overlay
- macvlan
- netplugin
默认的容器网络,bridge模式
如果你不给容器网络做任何设置,那么容器将会使用bridge网络模式。该模式下,Docker会为容器创建一个eth0端口,绑定在主机的docker0上,并且给eth0分配一个和docker0同网段的IP地址。
docker run -d --net=bridge busybox:01 sleep 60
进入容器查看网络,如下:
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
193: eth0@if194: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
host网络
对于独立的容器,去掉容器和Docker主机之间的网络隔离,直接使用主机的网络。这种模式适用于系统组件。
docker run -d --net=host busybox:01 sleep 60
container网络
container 启动一个容器,会使用另外一个已经存在的容器的网络,它们会共享网络协议栈,它们的网络是一模一样的。
docker run -d --net=container:a56f9cc34ed0 busybox:01 sleep 60
这里指定网络要使用格式container:<name|id>.那么新创建出来的容器和原来的容器a56f9cc34ed0是一样的网络配置。
none网络
对于none网络模式的容器,禁用容器的所有网络。通常与自定义网络驱动程序一起使用。
docker run -d --net=none busybox:01 sleep 60
overlay网络
overlay网络和macvlan是docker原生的支持跨主机通信的网络模式。Overlay网络把多个Docker daemon连接起来并用swarm services通信。可以利用overlay网络来实现一个swarm service和一个单独容器的通信,或者实现分属于两个不同Docker daemons的单独容器的通信。该方法不需要在这些容器之间设置操作系统的路由。
其中如果要创建一个overlay网络必须要先使用 docker swarm init 将 Docker 守护进程初始化为 swarm manager,或者使用 docker swarm join 将其加入到现有的 swarm 中.然后可以用如下命令创建一个overlay网络:
$ docker network create -d overlay my-overlay
然后再创建容器使用此网络。因为不适用Swarm,所以这里暂不讨论这种网络。
macvlan网络
Macvlan网络允许你给容器分配一个MAC地址 使它看起来像网络上的一个物理设备。Docker守护进程通过容器的MAC地址将流量路由到容器。当希望直接连接到物理网络而不是通过 Docker 主机的网络栈进行路由时(特别是一些老的应用),使用 macvlan 网络是最佳选择。macvlan是linux操作系统内核提供的网络虚拟化方案之一,更准确的说法是网卡虚拟化方案。它可以为一张物理网卡设置多个mac地址,相当于物理网卡施展了影分身之术,由一个变多个,同时要求物理网卡打开混杂模式。针对每个mac地址,都可以设置IP地址,本来是一块物理网卡连接到交换机,现在是多块虚拟网卡连接到交换机。
1. 分别在两个主机上创建相同的macvlan:
docker network create -d macvlan --subnet=172.16.86.0/24 --gateway=172.16.86.1 -o parent=bond0 macvlan-net
2. 然后使用该macvlan的IP分别在两台主机上创建容器,指定IP是为了防止IP冲突:
docker run --name=host1container -d --net=my-macvlan-net --ip=172.16.86.2 busybox:01 sleep 100
docker run --name=host2container -d --net=my-macvlan-net --ip=172.16.86.3 busybox:01 sleep 100
3. 尝试两台容器互ping
上面例子的macvlan的网络拓扑结构如下图所示:
netplugin
netplugin是网络插件模式, 您可以使用Docker安装和使用第三方网络插件。常用的网络插件有flannel、calico等。