6种driver介绍
- bridge
- overlay
- host
- container
- macvlan
- none
bridge:
这是容器默认的网络驱动
很多教程说这是相当于交换机,说这种话的人根本不懂网络。
docker
的 bridge
相当于一个路由器,使用 bridge
网络的容器,处于一个下级路由器里
overlay:
相当于在多台集群节点机器上使用的 bridge
,只能在集群中使用,当你使用时会提示:
docker network create -d overlay nginx_net
Error response from daemon: This node is not a swarm manager. Use “docker swarm init” or “docker swarm join” to connect this node to swarm and try again.
该节点不是群集管理器。 使用“ docker swarm init”或“ docker swarm join”将此节点连接到swarm,然后重试。
host:
直接使用主机的网络配置
例如你在容器中监听80端口,那么你宿主机的80端口也被占用了
而且外部网络访问你宿主机的80端口,会访问到这个容器中的80端口
container:
容器模式,类似 host
模式,host模式是让容器使用宿主机的网络,而 container
是让一个容器使用另一个容器的网络docker run --name b2 -it --network container:jjccphp_nginx_1 --rm ubuntu:18.04 bash
macvlan:
1 | docker network create -d macvlan --subnet=192.168.1.0/24 -o parent=eth0 --ip-range=192.168.1.200/30 nginx_net |
macvlan
是一个很难说清楚的网络类型
假设宿主机的IP是 192.168.1.10
那么上面语句创建的网络可以给容器分配IP: 192.168.1.201
和 bridge
类似的, macvlan
也会由docker守护进程创建一个网关:192.168.1.200
由这个网关处理容器和外界的流量
(这一点存疑,没有试验过)
它最大的应用场景,是用来将容器的网络提升到和宿主机一个级别。
但是在一些情况下可能并不理想,例如宿主机没有开启IP转发,或者网卡不支持混杂模式,将会导致 macvlan
网络内的容器只能访问同一虚拟网络的容器,而不能访问互联网,也不能在局域网访问到这些容器
例如在hyper-v中,就需要在虚拟机-设置-网络适配器-展开-高级功能-启用MAC地址欺骗
none:
关闭该容器的网络,在一些不需要网络的任务时,还是有用的。
使用docker中的lede管理容器网络的问题总结
例如给容器限速,GFW之类的功能
- 之前是想一个default网络作为lede的wan用来访问互联网,然后创建一个外部网络
docker network create -d bridge lede_lan
作为 lan
但是遇到几个问题:- lan 网络下的容器没有DHCP Client,或者说是几乎所有的docker镜像都没有自带网络管理功能,也就没有dhcp客户端了,
这一点后来想清楚了,网络在linux中就是一个/dev/路径下的文件,而这个文件是由docker守护进程映射进来的,所以容器内没法决定自己的ip/网关/DNS等信息
所以只能通过给容器设置静态IP来解决,但是又没有设置网关地址的方法,没法让容器以lede的地址作为网关 - bridge网络作为lan的话,lan默认是可以访问互联网的,不需要经过路由器,这是因为bridge网络自带了网关,
例如你创建一个172.10.10.0/24
的 bridge网络, 那么docker守护进程会占用172.10.10.1
创建一个网关,
并且在使用这个 bridge网络 的容器自动设置网关地址为172.10.10.1
, 你在容器中是无法修改网络配置的,真是悲剧。
- lan 网络下的容器没有DHCP Client,或者说是几乎所有的docker镜像都没有自带网络管理功能,也就没有dhcp客户端了,