Docker 的网络模式

6种driver介绍

  • bridge
  • overlay
  • host
  • container
  • macvlan
  • none

bridge:

这是容器默认的网络驱动

很多教程说这是相当于交换机,说这种话的人根本不懂网络。

dockerbridge 相当于一个路由器,使用 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
    但是遇到几个问题:
    1. lan 网络下的容器没有DHCP Client,或者说是几乎所有的docker镜像都没有自带网络管理功能,也就没有dhcp客户端了,
      这一点后来想清楚了,网络在linux中就是一个/dev/路径下的文件,而这个文件是由docker守护进程映射进来的,所以容器内没法决定自己的ip/网关/DNS等信息
      所以只能通过给容器设置静态IP来解决,但是又没有设置网关地址的方法,没法让容器以lede的地址作为网关
    2. bridge网络作为lan的话,lan默认是可以访问互联网的,不需要经过路由器,这是因为bridge网络自带了网关,
      例如你创建一个 172.10.10.0/24 的 bridge网络, 那么docker守护进程会占用 172.10.10.1 创建一个网关,
      并且在使用这个 bridge网络 的容器自动设置网关地址为 172.10.10.1, 你在容器中是无法修改网络配置的,真是悲剧。

鄂ICP备14007840号-1