docker-网络管理(容器之间通信)
Docker 在启动时会创建一个虚拟网桥 docker0,默认地址为 172.17.0.1/16, 容器启动后都会
被桥接到 docker0 上,并自动分配到一个 IP 地址。
docker的网络有三种
bridge:bridge模式下,容器没有一个公有的ip,只有宿主机可以直接访问,外部主机是不可见的,但容器通过宿主机的NAT规则后可以访问外网。
host:host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
none:
网络环境为 none,即不为 Docker Container 任何的网络环境。一旦 Docker Container 采用了
none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。
可以说 none 模式为 Docker Container 做了极少的网络设定,但是俗话说得好“
少即是多”
,在
没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制
开发。这也恰巧体现了 Docker 设计理念的开放。
创建自定义网桥:
还可以自定义网段:
可以在物理机上ip a查看自定义网桥
创建两个容器,桥接到不同的网桥上,彼此之间是不能通信的。
那么如何使两个不同网桥的容器通信呢:
使用docker network connect 命令为vm1添加一块my_net2网卡
容器访问外网是通过iptables的SNAT实现的
而外网访问容器用到了docker-proxy和iptables DNAT
宿主机访问本机容器使用的是iptables DANT
跨主机网络解决方案
1.docker原生的overlay和macvlan
2.第三方的flannel、weave、calica
macvlan网络方案实现:
linux kernel提供的一种网卡虚拟化技术
无需linux bridge,直接使用物理接口,性能极好。
具体操作如下:
1.在两台docker主机上各添加一块网卡,打开网卡混杂模式:
ip link set 网卡名 promisc on
2.创建macvlan网络并用此网络开启一个ubuntu容器
主机1:
主机2:
由上图可以看出,不同主机的容器已经完成了通信,但是如果容器很多,不可能有那么多的网卡,所以可以使用vlan子接口实现macvlan网络。vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094
主机1:(注意:设置docker网络的子网必须在主机的子网下)
主机2:(注意:设置docker网络的子网必须在主机的子网下)
由上图可以看出,不同主机间的容器之间可以ping通