docker-网络管理(容器之间通信)

Docker 在启动时会创建一个虚拟网桥 docker0,默认地址为 172.17.0.1/16, 容器启动后都会
被桥接到 docker0 上,并自动分配到一个 IP 地址。

docker-网络管理(容器之间通信)

docker-网络管理(容器之间通信)

docker的网络有三种

docker-网络管理(容器之间通信)

bridge:bridge模式下,容器没有一个公有的ip,只有宿主机可以直接访问,外部主机是不可见的,但容器通过宿主机的NAT规则后可以访问外网。

docker-网络管理(容器之间通信)

host:host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。

docker-网络管理(容器之间通信)

none:

网络环境为 none,即不为 Docker Container 任何的网络环境。一旦 Docker Container 采用了
none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。
可以说 none 模式为 Docker Container 做了极少的网络设定,但是俗话说得好“
少即是多”
,在
没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制
开发。这也恰巧体现了 Docker 设计理念的开放。

docker-网络管理(容器之间通信)

docker-网络管理(容器之间通信)

docker-网络管理(容器之间通信)

创建自定义网桥:

docker-网络管理(容器之间通信)

还可以自定义网段:

docker-网络管理(容器之间通信)

可以在物理机上ip a查看自定义网桥

docker-网络管理(容器之间通信)

创建两个容器,桥接到不同的网桥上,彼此之间是不能通信的。

docker-网络管理(容器之间通信)

那么如何使两个不同网桥的容器通信呢:

 使用docker network connect 命令为vm1添加一块my_net2网卡

docker-网络管理(容器之间通信)

容器访问外网是通过iptables的SNAT实现的

docker-网络管理(容器之间通信)

而外网访问容器用到了docker-proxy和iptables DNAT

     宿主机访问本机容器使用的是iptables DANT

docker-网络管理(容器之间通信)

跨主机网络解决方案

1.docker原生的overlay和macvlan

2.第三方的flannel、weave、calica

macvlan网络方案实现:

   linux kernel提供的一种网卡虚拟化技术

   无需linux bridge,直接使用物理接口,性能极好。

具体操作如下:

  1.在两台docker主机上各添加一块网卡,打开网卡混杂模式:

    ip link set 网卡名 promisc on

docker-网络管理(容器之间通信)

docker-网络管理(容器之间通信)

2.创建macvlan网络并用此网络开启一个ubuntu容器

主机1:

docker-网络管理(容器之间通信)

docker-网络管理(容器之间通信)

主机2:

docker-网络管理(容器之间通信)

由上图可以看出,不同主机的容器已经完成了通信,但是如果容器很多,不可能有那么多的网卡,所以可以使用vlan子接口实现macvlan网络。vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094

主机1:(注意:设置docker网络的子网必须在主机的子网下)docker-网络管理(容器之间通信)

主机2:(注意:设置docker网络的子网必须在主机的子网下)

docker-网络管理(容器之间通信)

由上图可以看出,不同主机间的容器之间可以ping通