docker原生网络
none:禁用网络接口。
默认用桥接模式。
host网络模式
docker run -it --name vm --network host ubuntu
不使用- -network指定则默认使用桥接模式。
none模式
创建的容器不需要使用网络,则使用网络none模式把网络禁掉。
doker自定义网络
docker network create -d bridge my_net1
docker network ls
docker run -it --name vm1 --network my_net1 ubuntu
docker network inspect my_net1
指定子网和网关
docker network create -d bridge --subnet 172.22.0.0/24 --gateway 172.22.0.1 my_net2
docker network ls
docker run -it --name vm2 --network my_net2 ubuntu
自定义网络给容器指定IP,但自定义网络必须有–subnet --gateway 参数指定子网和掩码、网关。
宿主机
brctl show
这样就可以通信。
docker network connect my_net2 vm1
docker同主机容器通信
DNS解析功能必须在自定义网络中才可以生效,在docker自带的bridge,none,host中不可以使用。
vm1和vm2为同一主机上的两个容器,使用同一自定义网络,(不使用同一自定义网络是不可以通信的,因为docker
网络是相互隔离的),发现可以通过容器名ping通,不需要知道IP。
两个容器间网络共享。
先使用默认网络方式创建容器vm1,
再添加参数–network container:vm1创建vm2,发现两个容器ip一样。这就是容器的网络共享。
–link 其实是修改了/etc/hosts文件。
env
查看
把link过来的容器变量也设置过来了。
如果vm1 通过–link关联的容器关闭,而重新创建的容器占用关闭容器的IP,再把刚刚关闭的容器启动起来,这时这个启动的容器ip会改变为一个新的,vm1的/etc/hosts文件中IP也会自动改变,自动匹配。
容器如何连接外网
宿主机访问容器的过程
宿主机访问本机容器使用的是iptables DNAT。
访问宿主机的80端口会做nat地址转换,转换到容器的80端口。
查看容器的端口映射:
docker port 容器名
首先访问宿主机的80端口,然后做目的地址转换,转换到真正要访问的应用所在容器的端口。
iptables -t nat -nL
外部主机访问容器或容器之间访问的过程
外部主机访问容器或者容器之间访问是通过docker-proxy实现的。
每做一个端口映射,就会有一个docker-proxy进程开启。
docker-proxy就会处理相应的端口转发的数据包。
跨主机容器通信
上面讲的是同一台主机上的容器之间的通信,那么跨主机的容器之间如何通信呢?
macvlan
overlay技术需要应用隧道技术封包后解包,这样就会有额外的cpu和网络开销。和macvlan对比起来性能上还是会有损失。
macVLAN网络方案直接使用物理接口。
通过命令打开网卡混杂模式。
ip link set device promisc on
在两台主机上添加网卡后,创建网络。
两台主机创建同一子网。
这种macvlan 网络驱动的方式IP是自己分配的。一定要注意自己手动指定IP,网络信息都需要自己维护。不指定会自动分配。
发现两台主机上新建的两个容器可以互相ping通。
brctl show
查看发现没有走桥接。没有生成新的桥接口。直接使用的物理接口。容器的接口直接与主机网卡连接,无需NAT或端口映射。
这就实现了两台主机间容器的通信。但是macvlan会独占主机网卡,可以使用vlan子接口实现多macvlan网络。
不同vlan之间彼此是隔离的。所以ping不通。
如果希望不同vlan的容器之间通信,可以在三层上通过网关将macvlan网络连通起来。