容器的网络模式

容器网络概览

容器之间如何联通是个重要的问题。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等。

原文地址:https://www.cnblogs.com/janeysj/p/13038715.html