docker提供的几种原生网络和自定义网络(11)

xgmxm xgmxm     2022-10-24     337

关键词:

Docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多个 host 的网络,本章重点讨论前一种

Docker 安装时会自动在 host 上创建三个网络,我们可用 docker network ls 命令查看:

技术分享图片

下面我们分别讨论它们。

none 网络

故名思议,none 网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其他任何网卡。容器创建时,可以通过 --network=none 指定使用 none 网络。

技术分享图片

我们不禁会问,这样一个封闭的网络有什么用呢?

其实还真有应用场景。封闭意味着隔离,一些对安全性要求高并且不需要联网的应用可以使用 none 网络。

比如某个容器的唯一用途是生成随机密码,就可以放到 none 网络中避免密码被窃取。

当然大部分容器是需要网络的,我们接着看 host 网络。

host 网络

连接到 host 网络的容器共享 Docker host 的网络栈,容器的网络配置与 host 完全一样。可以通过 --network=host 指定使用 host 网络。

技术分享图片

在容器中可以看到 host 的所有网卡,并且连 hostname 也是 host 的。host 网络的使用场景又是什么呢?

直接使用 Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择 host 网络。当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host 上已经使用的端口就不能再用了。

Docker host 的另一个用途是让容器可以直接配置 host 网路。比如某些跨 host 的网络解决方案,其本身也是以容器方式运行的,这些方案需要对网络进行配置,比如管理 iptables,大家将会在后面进阶技术章节看到。

bridge 网络

Docker 安装时会创建一个 命名为 docker0 的 linux bridge。如果不指定--network,创建的容器默认都会挂到 docker0 上

brctl show #查看bridge网络  yum install bridge-utils

docker network inspect bridge   #查看bridge 网络的详细信息

技术分享图片

当前 docker0 上没有任何其他网络设备,我们创建一个容器看看有什么变化。

技术分享图片

一个新的网络接口 veth28c57df 被挂到了 docker0 上,veth28c57df就是新创建容器的虚拟网卡。

下面看一下容器的网络配置。

技术分享图片

容器有一个网卡 [email protected]。大家可能会问了,为什么不是veth28c57df 呢?

实际上 [email protected] 和 veth28c57df 是一对 veth pair。veth pair 是一种成对出现的特殊网络设备,可以把它们想象成由一根虚拟网线连接起来的一对网卡,网卡的一头([email protected])在容器中,另一头(veth28c57df)挂在网桥 docker0 上,其效果就是将 [email protected] 也挂在了 docker0 上。

我们还看到 [email protected] 已经配置了 IP 172.17.0.2,为什么是这个网段呢?让我们通过 docker network inspect bridge 看一下 bridge 网络的配置信息:

技术分享图片

原来 bridge 网络配置的 subnet 就是 172.17.0.0/16,并且网关是 172.17.0.1。这个网关在哪儿呢?大概你已经猜出来了,就是 docker0。

技术分享图片

当前容器网络拓扑结构如图所示:

技术分享图片

容器创建时,docker 会自动从 172.17.0.0/16 中分配一个 IP,这里 16 位的掩码保证有足够多的 IP 可以供容器使用。

除了 none, host, bridge 这三个自动创建的网络,用户也可以根据业务需要创建 user-defined 网络,下一节我们将详细讨论。

user-defined 网络

Docker 提供三种 user-defined 网络驱动:bridge, overlay 和 macvlan。overlay 和 macvlan 用于创建跨主机的网络,我们后面有章节单独讨论。

    我们可通过 bridge 驱动创建类似前面默认的 bridge 网络,例如:

技术分享图片

    查看一下当前 host 的网络结构变化:

技术分享图片

    新增了一个网桥 br-eaed97dc9a77,这里 eaed97dc9a77 正好新建 bridge 网络 my_net 的短 id。执行 docker network inspect 查看一下 my_net 的配置信息:

技术分享图片

    这里 172.18.0.0/16 是 Docker 自动分配的 IP 网段。

    我们可以自己指定 IP 网段吗?
答案是:可以。

    只需在创建网段时指定 --subnet 和 --gateway 参数:

技术分享图片

    这里我们创建了新的 bridge 网络 my_net2,网段为 172.22.16.0/24,网关为 172.22.16.1。与前面一样,网关在 my_net2 对应的网桥 br-5d863e9f78b6 上:

技术分享图片

    容器要使用新的网络,需要在启动时通过 --network 指定:

技术分享图片

    容器分配到的 IP 为 172.22.16.2。

    到目前为止,容器的 IP 都是 docker 自动从 subnet 中分配,我们能否指定一个静态 IP 呢?

    答案是:可以,通过--ip指定。

技术分享图片

    注:只有使用 --subnet 创建的网络才能指定静态 IP

my_net 创建时没有指定 --subnet,如果指定静态 IP 报错如下:

技术分享图片

    好了,我们来看看当前 docker host 的网络拓扑结构。


技术分享图片

通过前面小节的实践,当前 docker host 的网络拓扑结构如下图所示,今天我们将讨论这几个容器之间的连通性。

技术分享图片

两个 busybox 容器都挂在 my_net2 上,应该能够互通,我们验证一下:

技术分享图片

可见同一网络中的容器、网关之间都是可以通信的。

my_net2 与默认 bridge 网络能通信吗?

从拓扑图可知,两个网络属于不同的网桥,应该不能通信,我们通过实验验证一下,让 busybox 容器 ping httpd 容器:

技术分享图片

确实 ping 不通,符合预期。

“等等!不同的网络如果加上路由应该就可以通信了吧?”我已经听到有读者在建议了。

这是一个非常非常好的想法。

确实,如果 host 上对每个网络的都有一条路由,同时操作系统上打开了 ip forwarding,host 就成了一个路由器,挂接在不同网桥上的网络就能够相互通信。下面我们来看看 docker host 满不满足这些条件呢?

ip r 查看 host 上的路由表:

# ip r

......

172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1

172.22.16.0/24 dev br-5d863e9f78b6  proto kernel  scope link  src 172.22.16.1

......

172.17.0.0/16 和 172.22.16.0/24 两个网络的路由都定义好了。再看看 ip forwarding:

# sysctl net.ipv4.ip_forward

net.ipv4.ip_forward = 1

ip forwarding 也已经启用了。

    条件都满足,为什么不能通行呢?

    我们还得看看 iptables:

# iptables-save

......

-A DOCKER-ISOLATION -i br-5d863e9f78b6 -o docker0 -j DROP

-A DOCKER-ISOLATION -i docker0 -o br-5d863e9f78b6 -j DROP

......

原因就在这里了:iptables DROP 掉了网桥 docker0 与 br-5d863e9f78b6 之间双向的流量

    从规则的命名 DOCKER-ISOLATION 可知 docker 在设计上就是要隔离不同的 netwrok。

    那么接下来的问题是:怎样才能让 busybox 与 httpd 通信呢?

    答案是:为 httpd 容器添加一块 net_my2 的网卡。这个可以通过docker network connect 命令实现

技术分享图片

    我们在 httpd 容器中查看一下网络配置:

技术分享图片

    容器中增加了一个网卡 eth1,分配了 my_net2 的 IP 172.22.16.3。现在 busybox 应该能够访问 httpd 了,验证一下:

技术分享图片

busybox 能够 ping 到 httpd,并且可以访问 httpd 的 web 服务。当前网络结构如图所示:

技术分享图片

下一节我们讨论容器间通信的三种方式

容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信

 

IP 通信

 

从上一节的例子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡。

 

满足这个条件后,容器就可以通过 IP 交互了。具体做法是在容器创建时通过 --network 指定相应的网络,或者通过 docker network connect 将现有容器加入到指定网络。可参考上一节 httpd 和 busybox 的例子,这里不再赘述。

 

Docker DNS Server

 

通过 IP 访问容器虽然满足了通信的需求,但还是不够灵活。因为我们在部署应用之前可能无法确定 IP,部署之后再指定要访问的 IP 会比较麻烦。对于这个问题,可以通过 docker 自带的 DNS 服务解决。

 

从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过“容器名”通信。方法很简单,只要在启动时用 --name 为容器命名就可以了。

 

下面启动两个容器 bbox1 和 bbox2:

 

docker run -it --network=my_net2 --name=bbox1 busybox

 

docker run -it --network=my_net2 --name=bbox2 busybox

 

然后,bbox2 就可以直接 ping 到 bbox1 了:

 

技术分享图片

 

    使用 docker DNS 有个限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的。下面验证一下:

 

    创建 bbox3 和 bbox4,均连接到 bridge 网络。

 

docker run -it --name=bbox3 busybox

 

docker run -it --name=bbox4 busybox

 

    bbox4 无法 ping 到 bbox3。

 

技术分享图片

 

joined 容器

 

joined 容器是另一种实现容器间通信的方式。

 

joined 容器非常特别,它可以使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined 容器之间可以通过 127.0.0.1 直接通信。请看下面的例子:

 

    先创建一个 httpd 容器,名字为 web1。
docker run -d -it --name=web1 httpd 然后创建 busybox 容器并通过 --network=container:web1 指定 jointed 容器为 web1:

 

技术分享图片

 

    请注意 busybox 容器中的网络配置信息,下面我们查看一下 web1 的网络:

 

技术分享图片

 

    看!busybox 和 web1 的网卡 mac 地址与 IP 完全一样,它们共享了相同的网络栈。busybox 可以直接用 127.0.0.1 访问 web1 的 http 服务。

 

技术分享图片

 

joined 容器非常适合以下场景:

 

  1.             不同容器中的程序希望通过 loopback 高效快速地通信,比如 web server 与 app server。        

  2.             希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。        

 

容器之间的通信我们已经搞清楚了,接下来要考虑的是容器如何与外部世界通信?这将是下一节的主题。

 

 

 




none和host网络的适用场景-每天5分钟玩转docker容器技术(31)

本章开始讨论Docker网络。我们会首先学习Docker提供的几种原生网络,以及如何创建自定义网络。然后探讨容器之间如何通信,以及容器与外界如何交互。Docker网络从覆盖范围可分为单个host上的容器网络和跨多个host的网络,本章... 查看详情

docker网络(代码片段)

docker的几种原生网络模式host:该模式下,容器将不会虚拟出自己的网卡,配置自己的IP等,而是共享Dockerhost的网络栈,容器的网络配置与Dockerhost完全一样None:该模式关闭了容器的网络功能,除了lo,没有其他任何网卡。Bridge:... 查看详情

云原生docker09-docker网络详解(代码片段)

【云原生|Docker】09-Docker网络详解文章目录【云原生|Docker】09-Docker网络详解前言网络详解bridge网络基于bridge网络的容器访问外部网络外部网络访问基于bridge网络的容器host网络none网络container网络自定义网络自定义bridge网络容器的... 查看详情

docker原生网络技术简介

Docker原生网络技术简介默认网络在宿主机部署好DockerEngine后会默认创建三种网络:Bridge、Host和None,如下:dockernetworklsNETWORKIDNAMEDRIVERSCOPE93dab79cdb5abridgebridgelocalc920c9c10e62hosthostlocald2a11ea1c70anonenulllocalBridge默认的Bridg 查看详情

跨主机网络概述-每天5分钟玩转docker容器技术(48)

前面已经学习了Docker的几种网络方案:none、host、bridge和joined容器,它们解决了单个DockerHost内容器通信的问题。本章的重点则是讨论跨主机容器间通信的方案。跨主机网络方案包括:docker原生的overlay和macvlan。第三方方案:常用... 查看详情

rpc的几种服务端模型分析

...节的协议。通常client端为服务的调用方,server端为服务的提供方。他们之间可以在不同的网络、不同的机器,使用不同的语言。  server端作为一个网络的服务提供者,需要能为多个client端提供高质量的服务,如下总结了几... 查看详情

docker网络管理(容器间通信)(代码片段)

一、前言由于docker技术的火爆,导致现在越来越多的企业都在使用docker这种虚拟化技术。企业中使用docker这种虚拟化技术,其目的就是为了让docker中的容器对外提供服务。因此,我们必须深入了解一下docker的网络知识,以满足更... 查看详情

docker网络详解(代码片段)

Docker网络Docker网络架构libnetwork中的5种内置驱动Docker原生网络bridge模式host模式none模式Docker自定义网络创建自定义网桥bridge如何让不同网段的容器可以相互通信Docker基础知识可点击查看之前文章Docker网络架构Docker有自己的网络库&#... 查看详情

云原生时代必须具备的核心技能之docker高级篇(docker网络详解)(代码片段)

  前面给大家项目的介绍了Docker的基础内容Docker基础篇接下来给大家系统的介绍下Docker高级篇的内容:网络核心、Docker实战、DockerCompose、Harbor以及Swarm。欢迎关注收藏哦Docker网络介绍  Docker是基于LinuxKernel的namespace,... 查看详情

网络爬虫的几种常见类型

常见的优秀网络爬虫有一下几种类型:1.批量型网络爬虫:限制抓取的属性,包括抓取范围,特定目标,限制抓取时间,限制数量以及相知抓取页面,总之明显的特征就是受限,2.增量网络爬虫(通用爬虫):与前者相反,没有... 查看详情

linux企业运维——docker网络

Linux企业运维——Docker(五)网络文章目录Linux企业运维——Docker(五)网络1、Docker原生网络1.1、bridge网络1.2、host网络1.3、none网络1.4、网络ip分配规则2、Docker自定义网络2.1、自定义网络创建2.2、不同网桥的容器如... 查看详情

简谈-网络爬虫的几种常见类型

  众所周知,网络爬虫(或称为网络爬虫、网络蜘蛛、机器人)是搜索引擎最上游的一个模块,是负责搜索引擎内容索引的第一关。很多人为了提高自己网站的索引量,都是去网上随便找一些爬虫工具来使用。但是很多人不知... 查看详情

031none和host网络的适用场景(2019-02-18周一)

...ps://www.cnblogs.com/CloudMan6/p/7053617.html 本节开始,会学习docker的几种原生网络,以及如何创建自定义网络。然后探究容器之间如何通信,以及容器与外界如何交互 docker网络从覆盖范围可以分为单个host上的容器网络和跨多个ho... 查看详情

更改 docker 自定义网络的默认子网

】更改docker自定义网络的默认子网【英文标题】:Changingdefaultsubnetfordockercustomnetworks【发布时间】:2017-10-1515:58:09【问题描述】:我们的内部网络保留了172.20.0.0/16范围供内部使用,docker默认使用172范围作为内部网络。我可以通过... 查看详情

objective-c枚举的几种定义方式与使用

  假设我们需要表示网络连接状态,可以用下列枚举表示:enumCSConnectionState{CSConnectionStateDisconnected,CSConnectionStateConnecting,CSConnectionStateConnected,};  然而定义枚举变量的方式却太不简介,要依如些语法编写:enumCSConnectionStatestate... 查看详情

docker学习笔记之网络篇

一、网络docker提供几种网络,它决定容器之间和外界和容器之间怎么样去相互通信。查看网络,我们可以执行:dockernetworkls650)this.width=650;"src="https://mmbiz.qpic.cn/mmbiz_png/rtibSseGoBickKAsUTQWT3LB0IwZbVvkGibnlicIY1MmQqItURJuib1coNqPzsmuE5ZMaFP9654 查看详情

云计算核心技术docker教程:docker使用网桥网络

...网桥可以是在主机内核中运行的硬件设备或软件设备。就Docker而言,网桥网络使用软件网桥,该软件网桥允许连接到同一网桥网络的容器进行通信,同时提供与未连接到该网桥网络的容器的隔离。Docker网桥驱动程序会自动在主机... 查看详情

面试官:docker有几种网络模式?5年工作经验都表示答不上来。。

...a;知知行行链接:https://www.cnblogs.com/loronoa/p/16566818.htmldocker容器网络Docker在安装后自动提供3种网络ÿ 查看详情