Docker基础——Docker Network(网络详解)

目录

[Docker Bridge 网络](#Docker Bridge 网络)

网络介绍

网络使用

容器间的网络通信

端口暴露和转发

[docker Host 网络](#docker Host 网络)

网络介绍

使用场景

[docker Container 网络](#docker Container 网络)

网络介绍

使用场景

[docker none 网络](#docker none 网络)

网络介绍

使用场景


**摘要:**本文全面介绍了 Docker 的四种网络模式:Bridge、Host、Container 和 None。Bridge 网络是默认模式,通过 docker0 网桥实现容器间通信,支持自定义网络和端口转发;Host 网络让容器直接使用宿主机网络栈,性能最佳但需注意端口冲突;Container 网络允许容器共享其他容器的网络命名空间,适用于紧密耦合的服务;None 网络则为容器提供完全隔离的网络环境,适用于高安全性场景。文章通过详细的命令示例和网络配置对比,帮助读者深入理解不同网络模式的特点和适用场景。

Docker Bridge 网络

网络介绍

Docker Bridge 网络采用内置的 bridge 驱动,bridge 驱动底层采用的是 Linux 内核中Linux bridge 技术。就网络而言,bridge 网络是在网络段之间转发流量的链路层设备,而网桥可以是在主机内核中运行的硬件设备或软件设备;就 Docker 而言,桥接网络使用软件网桥 docker0,它允许连接到同一网桥网络的容器进行通信,同时提供与未连接到该网桥网络容器的隔离。

Docker Container 的 bridge 桥接模式可以参考下图:

默认情况下,创建的容器在没有使用--network 参数指定要加入的 docker 网络时,默认都是加入 Docker 默认的单机桥接网络,即下面的 name 为 bridge 的网络。

默认的 bridge 网络会被映射到内核中为 docker0 的网桥上。

Docker 默认的 bridge 网络和 Linux 内核中的 docker0 网桥是一一对应的关系。

bridge 是 Docker 对网络的命名,而 docker0 是内核中网桥的名字。

网络使用

容器间的网络通信

回忆一下之前学到网络知识:多台主机是如何通过网络中进行通信的?

如果是两台主机可以直接通过连接网线的两端进行通信。那多台主机通信怎么处理呢?这就需要新增路由器/交换机,把多台主机连接到路由器/交换机上, 通过路由器/交换机来达到交换数据, 即通信的目的。

其实容器之间的通信也和上面主机通信的方式如出一辙, 安装 Docker的时候会默认安装docker0 这个网桥软件设备, 这个 docker0 设备可以类比成上图的交换机/路由器设备,当我们创建好容器之后, 如果不手动指定网络模式,默认会使用bridge 网络, 容器会自动连接到 docker0 这个网桥设备, 然后通过这个网桥来进行容器间的通信。

我们通过创建两个busybox容器,将他们加入到bridge网络中,然后互相ping对方的看是否能够通信

首先创建两个busybox容器

两个容器都存在与bridge网络中

查看两个容器的ip地址

b1的IP地址

b2的ip地址:

b1 ping b2:

b2 ping b1:

结果可以说明我们的容器容器之间是可以互相通信的,上面我们利用的是docker的bridge网络,下面我们来利用自定义的bridge网络来尝试一下,只有自定义的网络是可以利用DNS解析容器名来进行通信的


我们来验证一下这个是否只有自定义的网络可以利用容器名进行通信

利用我们刚刚的的默认bridge网络,用b1 ping b2:

b2 ping b1:也是如此

接下来我们自己创建一个bridge网络:

创建两个busybox容器b3和b4,使用--network参数直接连接到net1网络,不需要使用connect

查看net1是否存在了这两个容器:

利用b3 ping b4:

利用b4 ping b3:

端口暴露和转发

暴露方式

端口暴露有 2 种方式,在启动容器的时候添加端口参数,一种-P 暴露所有端口,一种是 -p,暴露指定端口

-P方式

将指定的容器端口映射至主机所有地址的一个动态端口,·"动态端口"指随机端口,具体的映射结果可使用 docker port 命令查看

-p方式

-p <hostPort>:<containerPort>

将容器端口<containerPort>映射至指定的主机端口<hostPort>

端口转发

连接 bridge 网络的容器只能与连接在当前网络中的容器进行通信。如果一个容器想要对外提供一些网络服务的话,需要进行端口转发才可以实现。端口转发将 Docker 容器的端口映射到宿主机的端口上,那么任何发送到宿主机该端口的流量,都会被转发到容器的端口中。

如下图所示,两个容器内部均开放 80 端口,它们分别映射到宿主机的 8088 和 8089 端口, 即表示任何发送到 8088 端口的流量都会转发到 Container 1 容器的 80 端口, 发送到 8089 端口的流程都会转发到Container 2 容器的 80 端口。


docker Host 网络

网络介绍

Docker 容器运行默认都会分配独立的 Network Namespace 隔离子系统, 但是如果基于 host 网络模式,容器将不会获得一个独立的 Network Namespace,而是和宿主机共用同一个 Network Namespace,容器将不会虚拟出自己的网卡,IP 等,而是直接使用宿主机的 IP 和端口。

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

我们可以举例来看一下是不是我们所说的这样:

宿主机的ifconfig配置:

创建的b5容器的ifconfig配置:

二者几乎是一模一样的,所有我们的host网络,就是利用的宿主机的ip和端口等网络信息,但是其他资源还是隔离的

使用场景

bridge 网络在通信的时候需要进行端口转发以及 NAT 地址转换,这势必会消耗掉一些资源以及性能。 那么直接使用 host 网络最大的好处就是性能好,如果容器对网络传输效率有较高的要求,建议选择 host 网络。当然也会牺牲一些东西,比如要考虑端口冲突问题,其他服务已经被占用的端口就不能再使用了。

docker Container 网络

网络介绍

Docker Container 是 Docker 中一种较为特别的网络的模式。所以称为"other container 模式",是因为这个模式下的 Docker Container,会使用其他容器的网络环境。之所以称为"特别",是因为这个模式下容器的网络隔离性会处于 bridge 桥接模式与 host 模式之间。Docker Container 共享其他容器的网络环境,则至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。
Docker Container 网络模式可以参考下图:

Docker Container 的 other container 网络模式实现逻辑如下:

  1. 查找 other container(即需要被共享网络环境的容器)的网络 namespace;

  2. 将新创建的 Docker Container(也是需要共享其他网络的容器)的 namespace,使用 other container 的 namespace

我们举一个例子来详细看一下:

创建一个容器b6, 让容器b7利用b6的ip

容器b6的ifconfig配置:

容器b7的ifconfig配置:


可以发现这俩个容器的网络配置一模一样,这就是我们的contanier网络的特点,我们如果关闭掉b6,b7的网络也就自动的断开了,重新启动b6之后,b7也需要重启,才能恢复正常

使用场景

在这种模式下的 Docker Container 可以通过 localhost 来访问 namespace 下的其他容器,传输效率较高。但是两个容器之间存在依赖,如果依赖容器重启了,会导致另一个服务的网络不可用。

docker none****网络

网络介绍

none 网络就是指没有网络。挂在这个网络下的容器除了 lo(本地回环),没有其他任何网卡。

使用场景

针对一些对安全性要求比较高并且不需要联网的应用, 可以使用 none 网络, 比如生成随机密码, 避免生成密码被第三方获取。

一些第三方的应用可能需要 docker 帮忙创建一个没有网络的容器, 网络由第三方自己来配置

相关推荐
hz567891 小时前
音视频SDK核心能力分析:低延迟传输与高并发接入方案
网络·安全·音视频·实时音视频·信息与通信
q567315231 小时前
企业级 HTTP 代理采购选型:技术评估清单 15 项
开发语言·网络·爬虫·网络协议·http·隧道ip·代理ip
白嫖一茶2 小时前
HTTP 状态码详解:五大类与常见状态码解析
网络·网络协议·http
高磊20052 小时前
LVS(Linux virual server)
linux·服务器·lvs
LedgerNinja3 小时前
WEEX API 自动化交易实践:下单、撤单、订单查询与状态闭环
运维·自动化
shwill1233 小时前
PID 算法(三)--- 增量 PID ↔ 单神经元 PID 等价映射
linux·算法
执笔画流年呀3 小时前
Linux搭建Java项目部署环境
java·linux·运维
Dory_Youth4 小时前
联想笔记本电脑失灵
运维·笔记·电脑
Sisphusssss4 小时前
香橙派5plus GPIO
linux·python·ubuntu