Docker的网络基础:
默认网络模式,特殊的几种网络模式,容器和宿主机的通信方式,容器与外部主机的通信方式。
一:Docker默认的原生网络:bridge桥接
在bridge模式下,容器没有一个公有IP,只有宿主机可以直接访问。外部主机是不可见的。
容器通过宿主机的NAT规则,才可以访问外网。
先yum install -y bridge-utils
下载查看桥接的指令工具
这两个例子都是在告诉我们,容器的原生网络,在没有指定模式时,默认是会出现在桥接上,通过docker0这个桥接,与外部进行通信。我们使用ip a查看宿主机的网络设定:可以看到有生成docker0这个桥接:而它的网络IP,是一个私有网段。
宿主机与容器的通信:通过桥接。
二:host模式:
host模式同样使用的是原生网桥,通过docker0这个桥接与外部和宿主机进行通信。不同的是,host模式会使用宿主机的主机名。另外,host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少了隔离性。
三:none模式:
none模式是一种无网络模式,即程序本身不需要与外部通信,只需要自己运行即可。
使用docker inspect v1
v1为我拉起的这个容器名,来查看容器的配置参数。
四:Docker以容器名通信:joined模式
容器之间除了使用ip通信外,还可以使用容器名称通信。
joined模式为一种较为特殊的网络模式: 处于joined模式的容器,相当于共用网络。
处于这个模式下的Docker容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
五:link模式:链接容器
link模式主要用于链接两个容器,让其可以一直处于能被互相联系到的状态。
格式: --link :alias
name和id为源容器的name和id,alias为源容器再link下的别名
link的主要功能不止于此,他还是动态的!
当前的解析:
新的解析:
link动态解析,链接后相当于永久保持联系方式,无论双方怎样变化,联系方式依旧会有。
六:Docker自定义网络:bridge
docker提供了三种自定义网络驱动:
bridge、overlay、macvlan
bridge驱动类似默认的bridge网络模式,但增加了一些新的功能。
overlay和macvlan是用于创建跨主机网络的
自定义网络:特点:内含DNS解析,并且可以指定IP地址。原始网桥不可以指定IP
下面为bridge,类似于原生网络的bridge
在宿主机上使用ip a
可以看到:my_net1生成了新的一个虚拟网络设备,所有添加到这个网络中的容器都会连接到这个接口。
自定义网络是可以为其指定IP的,从而不必跟着网段递增原则。
指定网段和IP:
桥接到不同网桥上的容器,彼此是不同通信的。docker在设计上就是要隔离不同的network。
理一下:
my_net1:172.18.0.x网段:v1:172.18.0.2:v2:172.18.0.3
my_net2:172.20.0.x网段:v3:172.20.0.2:v4:172.20.0.3
那么如果想让v1和v3,v4也通信,即实现在不同网桥的容器通信:
就需要添加网卡,采用双网卡结构进行通信。
docker network connect 网卡 要添加的容器
七:外网访问容器:端口映射:
一条指令就学会:
docker run -d --name nginx -p 80:80 nginx.latest
#-d 代表后台运行 --name为给容器命名 -p为端口映射,冒号前面为宿主机端口,冒号后面为容器端口
外网访问容器用到了docker-proxy和iptables DNAT:
宿主机访问本机容器使用的是iptables DNAT
外部主机访问容器或容器之间的访问是docker-proxy实现
先看下方线路的箭头:
外部信息发送到宿主机网卡设备上,docker-proxy识别到请求的是docker容器,于是将请求信息发送给docker桥接docker0,通过docker0宿主机就可以把请求信息发送至docker容器,从而由容器去处理请求。
返回来看上方箭头:
docker容器如果要返回信息到外网时,一定要先通过docker0这个桥接与宿主机进行通信,宿主机通过NAT的方式,将请求发送给自己的网卡,然后传到外部的网络。
要始终铭记一点:docker容器是和宿主机共享内核的,是寄托在宿主机上的。
八:跨主机、容器通信:
跨主机网络解决方案主要有以下:
docker原生的overlay和macvlan
第三方的flannel、weave、calico
macvlan网络方案实现:
它是linux kernel提供的一种网卡虚拟化技术。不需要使用linux bridge,直接使用物理接口即可。
macvlan网络在二层上是隔离的,所以不同马层vlan网络的容器无法通信【不在同一网段】,可在三层上通过网关将macvlan网络连通【路由器】。
实现:两台宿主机都需要双网卡,并且开启网卡混杂模式,docker容器ip需要在同一网段:
主机1:
ip link set eth0 promisc on #开启混杂模式
ip link set up eth0 #启用网卡【我虚拟网卡是新加的,没有启用,已经启用则不需要这一步】
##这里我双网卡新开的一块为eth0,根据自己情况选择。但是macvlan方式会独占网卡。
##两台要通信的docker容器所在宿主机都要开启混杂模式
docker network create -d macvlan --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o parent=eth0 mac_net1
#创建macvlan网络,网段可以任意,我就选择了20段,因为我docker0是17段的。
#要指定父级网卡,会占用该网卡【eth0】
#我命名该网络为mac_net1 ,命名无要求,方便识别即可。
docker run -it --name v1 --network mac_net1 --ip 172.20.0.10 ubuntu
#运行一个使用该网络的容器,指定IP 【因为这是自定义网络】
主机2:
macvlan网络结构:
容器接口直接与宿主机网卡连接,不需要在网桥上再添加接口,不需要NAT或者端口映射。所以有一个明显缺点,会占用网卡
但是该技术提供了一种解决办法:使用vlan子接口实现多macvlan网络。
vlan可以将物理二层网络划分4094个逻辑网络,彼此隔离,vlan id取1-4094
大大的小小阳