关于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网络模式的主要内容,如果未能解决你的问题,请参考以下文章