一、网络驱动 docker可以通过创建虚拟网卡,通过虚拟网卡转发到宿主机网卡和外部进行通信。除此之外,也可以不创建自己的虚拟网卡而是直接和宿主机共 用网卡直接占用宿主机IP和端口的方式和外部进行通信。docker的网络驱动是可插拔的,默认情况下存在以下几种网络模式: 1、桥接网络模式(bridge): 这是docker默认的网络驱动程序,如果在创建驱动程序时未指定驱动程序类型,默认便是bridge模式。 当你的应用程序是在同一个主机部署独立容器时,推荐使用桥接网络模式。连接到同一桥接网络的容器可以互相通信,对不同桥接网络的容器则无法直接相互通信。 2、覆盖网络模式(overlay):覆盖网络模式可以将不同的Dockerd守护进程连接在一起,该网络模式支持集群容器之间相互通信, 以及集群和某个单机版独立容器直接相互通信,或不同Dockerd守护进程的独立容器之间进行通信。该网络模式使用场景比较广泛,通常集群部署时会使用该模式。 3、主机网络模式(host):如果某个容器需要访问主机的某个服务,那么需要配置主机网络模式,该模式直接占用主机的网络端口和网卡资源。 也就是说docker网络并非隔离而是直接和宿主机共享资源,就好像应用是直接在宿主机上运行一样。但是其它(例如存储,进程命名空间和用户命名空间)相对宿主机隔离的。 该模式仅适用于Docker 17.06及更高版本的swarm服务。 4、MAC网络模式(macvlan):Macvlan网络允许您为容器分配MAC地址,使其显示为网络上的物理设备。Docker守护程序通过其MAC地址将流量路由到容器。 macvlan 使用场景在于如果希望直接连接到物理网络时,使用驱动程序有时是最佳选择,而不是通过Docker宿主机的网络堆栈进行路由。 5、禁用网络模式(none): 禁用容器所有网络。通常与自定义网络驱动程序一起使用。none不适用于群组服务。 6、其它模式(网络插件):可以使用Docker安装和使用第三方网络插件 [root@localhost7C ~]# docker network create -d bridge macvlan overlay [root@localhost7C ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 796c38ad861b bridge bridge local 00e08763c06a host host local 0bf2813ea139 none null local 使用场景 下面我们总结下不同场景建议使用的网络模式: 1、当您需要多个容器在同一个Docker宿主机上进行通信时,使用自定义的桥接网络模式(bridge)是最佳选择。 2、当容器网络堆栈不应与Docker主机隔离但又希望隔离容器的其他方面(cgroup,unix file system)时,使用主机网络模式(host)是最佳选择。 3、当您需要在不同Docker守护进程上运行的容器进行通信时,或者当多个应用程序使用swarm服务协同工作时,覆盖网络模式(overlay)是最佳选择。 4、当您从VM设置迁移或需要容器看起来像网络上的物理主机时,Macvlan网络是最佳的,这样每个主机都具有唯一的MAC地址。 5、另外如果以上模式都不能满足您的需求是,可以查找第三方网络插件进行集成。 例:使用下面的命令创建一个基于bridge driver的自定义网络: [root@localhost7C ~]# docker network create -d bridge --subnet 172.27.0.0/16 --gateway 172.27.0.1 zzhz b3a5712a5391eff8db290b25893e88a496432d54c63df050efb05c44ccbf938f [root@localhost7C ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 796c38ad861b bridge bridge local 00e08763c06a host host local 0bf2813ea139 none null local b3a5712a5391 zzhz bridge local [root@localhost7C ~]# ip a 6: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:cd:40:f8:77 brd ff:ff:ff:ff:ff:ff inet 10.100.0.1/24 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:cdff:fe40:f877/64 scope link valid_lft forever preferred_lft forever 21: br-b3a5712a5391: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:ac:d8:d7:4a brd ff:ff:ff:ff:ff:ff inet 172.27.0.1/16 scope global br-b3a5712a5391 valid_lft forever preferred_lft forever [root@localhost7C ~]# brctl show bridge name bridge id STP enabled interfaces br-b3a5712a5391 8000.0242acd8d74a no docker0 8000.0242cd40f877 no virbr0 8000.525400fbc09b yes virbr0-nic [root@localhost7C ~]# route -n Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.80.2 0.0.0.0 UG 100 0 0 eth0 10.100.0.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0 172.27.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-b3a5712a5391 [root@localhost7C ~]# docker run -it -d --name centosA --network zzhz centos-base:v1 [root@localhost7C ~]# docker exec -it centosA bash [root@833c8730e36d /]# ip a 22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:1b:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.27.0.2/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe1b:2/64 scope link valid_lft forever preferred_lft forever
二、网络通信
1.容器之间的通信和互联 即在同一个宿主机上的容器之间可以通过自定义的容器名称相互访问,比如一个业务