关于docker那点事儿——docker网络模式

Posted 偷学技术的梁胖胖yo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于docker那点事儿——docker网络模式相关的知识,希望对你有一定的参考价值。

前言

可以说每一次技术的革新都离不开最底层、最复杂也是最核心的两个东西,那就是网络和存储。不管是虚拟化还是容器化都与这两点密不可分。本篇文章主要介绍docker网络模式,通信原理及优缺点

一、容器网卡、网桥docker0、veth关系

在介绍docker的4种网络模型之前,先介绍下容器内网卡与宿主机docker0关系。

Docker daemon启动时会创建一个虚拟网桥设备 docker0(在主机上看来是一个网卡),默认地址为 172.17.1.1/16,容器启动后都会被桥接到 docker0 上,并自动分配到一个 IP 地址,以此来实现网络通信。当然要确保docker0是启动状态。

当我们启动容器时,ip地址会在docker0地址的基础上递增,第一个启动的容器ip地址为172.100.100.2,第二个启动的容器ip地址为172.100.100.3,以此类推

当我们启动一个容器时,容器会创建一对虚拟网卡,也就是veth pair。一边在主机上会出现一个veth开头的虚拟网卡,另一边在docker中生成eth0虚拟网卡,网卡只在该容器network namespace中可见。每一个宿主机的veth网卡都对应容器中的eth0网卡,veth网卡都桥接到docker0以此来实现网络通信。



二、docker的4种网络模式

模式命令(docker run)简述
bridge模式–net=bridge容器默认模式,容器默认连接到docker0网桥上,通过iptables规则来实现通信
host模式–net=host容器与主机共享网络,使用主机网卡端口等信息
container模式–net=container:NAME_or_ID容器与其他容器共享网络,使用已存在容器的网卡信息,两个容器通过lo回环网卡进行通信
none模式–net=none无网卡信息,用户可根据自己需求自定义网络环境

bridge模式

桥接模式也是docker的默认网络模式,就像上述我们讲到的容器网卡以及网桥的关系,就是讲述的桥接模式的工作方式,这里不再赘述。

缺点:宿主机意外的其他主机无法与容器进行通信;

   容器的端口均需要在宿主机映射出来,所有的网络规则都通过nat转发来实现,效率相对较低;

host模式

host模式容器可以直接使用宿主机的ip地址与外界通信,就像应用直接跑在主机上一样,弥补了bridge模式的不足。

启动一个容器查看容器的网卡信息,结果与主机网卡信息一致

缺点:网络环境隔离性差,容器不再拥有独立的网络栈;

   容器与宿主机共享端口范围,可能出现端口被占用情况;

container模式

container模式容器与容器共享网络栈,两个容器可以更高效的通信

查看两个容器的网卡配置发现一模一样

其本质就是将一个容器network namespace加入了一个已存在容器的network namespace

缺点:与bridge模式一样,宿主机意外的主机无法访问到容器。

none模式

none模式是我们使用最少的,该模式除了lo网卡,其他网络设备均没有定义。这种模式更倾向于开发者去开发新的网络模式,如host模式与container模式就是在此模式开发而来。

以上是关于关于docker那点事儿——docker网络模式的主要内容,如果未能解决你的问题,请参考以下文章

关于docker那点事儿——docker compose简介

关于docker那点事儿——Dockerfile编写

关于PHP中对象复制的那点事儿

观察者模式那点事儿

Docker 那些事儿关于容器底层技术的奥秘

关于数据传输中加密解密那点事儿