“Docker网络模式详解与应用“

目录

前言

Docker内置网络

bridge

基本概念

案例

工作原理

使用场景

host

基本概念

案例

工作原理

使用场景

none

基本概念

案例

!!!大佬救命

container

基本概念

案例

自定义网络

自定义bridge

基本概念

案例

Docker网络允许您将容器附加到任意数量的网络

使用方法

overlay

基本概念

工作原理

使用场景

使用方法

注意事项

macvlan

基本概念

工作原理

使用场景

使用方法

注意事项

总结


前言

Docker作为一个革命性的技术平台,极大地简化了应用程序的部署、管理和扩展过程,其中容器网络是其核心组件之一,对于充分挖掘Docker潜力至关重要。虽然不少开发者和IT专业人员可能已经接触或应用过Docker,但深入理解其网络机制仍然是提升容器化技能的关键步骤。本文旨在提供一个全面而深入的指南,帮助您不仅了解Docker网络的基础,还能掌握其高级特性和最佳实践。


Docker内置网络

当我们完成docker engine的安装以后,docker会在每一个engine上面生成一个3种网络,他们是:bridge, none还有host


 

bridge

基本概念

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

如下图所示,当Docker1需要访问外网时,请求先到达Docker0虚拟网卡,然后在到达物理网卡,请求就发送出去了。

案例

( 1 ) 客 户 端 执 行 "docker run ” 命 令 创 建 并 启 动 容 器 。

查看容器信息

docker inspect nginx

( 2 ) Docker 引 擎 创 建 一 对 虚 拟 接 囗 veth pair; 并 把 它 们 分 别 放 到 宿 主 机 和 新 容 器 的 网 络 命 名 空 间 中 。

( 3 ) Docker 引 擎 将 宿 主 机 上 的 veth 接 囗 连 接 到 宿 主 机 的 dockerO 网 桥 上 , 并 且 给 它 分 配 一 个 以 "veth ” 开 头 的 名 字, 如 veth8ead84e@if117 。

( 4 ) Docker 引 擎 将 容 器 上 的 veth 接 囗 改 名 为 "ethO ” , 并 且 该 接 囗 只 有 在 容 器 内 网 络 命 名 空 间 中 是 可 见 的 。

( 5 ) Docker 引 擎 从 宿 主 机 的 dockerO 网 桥 上 分 配 一 个 空 闲 的 ip 地 址 给 容 器 内 的 eth0 , 例 如 : 172 .17.0.2 。 并 将 容 器 内 eth0 的 路 由 网 关 设 置 为 docker0 的 内 部 IP 地 址 , 例 如 : 172 .17.0.1 。 完 成 以 上 的 这 些 步 骤 后 , 容 器 就 可 以 使 用 其 内 部 的 虚 拟 接 囗 "eth0 ” 来 连 接 到 其 他 的 容 器 和 访 问 外 部 的 网 络 了 。

由于上面启动nginx容器的时候使用的是默认的bridge网络,并且也没有添加端口映射,所以iptables不会做DNAT规则

如果启动容器的时候做了端口映射,则iptables会做DNAT规则,实现端口转发功能,可以使用iptables -t nat -nL查看

工作原理

Docker 中启动容器时,如果没有指定网络模式,它默认连接到 Docker 主机上的一个桥接网络。这个桥接网络起初是空的,当容器连接到它时,Docker 会为每个容器分配一个 IP 地址和一个网络接口,并将这个接口连接到虚拟桥接上。

Docker 的桥接网络通常使用 NAT(网络地址转换)来连接到物理网络,使得容器能够通过宿主机的 IP 地址访问外部网络。

使用场景

  • 隔离容器网络环境:当你希望运行的每个容器都有独立的网络堆栈时,Bridge网络非常有用。每个使用Bridge网络的容器都会获得自己的IP地址,并且容器之间的网络通信需要通过端口映射来进行,这提供了基本的网络隔离。
  • 快速部署和测试:在开发和测试环境中,Bridge网络可以让开发者快速搭建一个与外部网络隔离的环境来部署和测试应用,而不会影响到主机或其他网络环境。
  • 服务发现:虽然基础的Bridge网络不直接支持服务发现,但通过结合DNS解析(如使用docker-compose或Kubernetes中的服务发现机制)可以在一定程度上实现容器间的服务发现和通信。
  • 端口映射:当需要从宿主机或其他网络访问容器内的服务时,可以使用Bridge网络并通过端口映射功能将容器的内部端口映射到宿主机的一个端口上,便于外部访问。
  • 多主机通信需求不高场景:对于一些简单的多容器应用,如果不需要跨主机的容器网络通信,或者可以通过其他手段(如使用外部负载均衡器)来实现跨主机通信,使用Bridge网络就足够了。
  • 轻量级解决方案:相比于更复杂的网络解决方案如overlay网络(用于跨多个Docker主机的容器通信)或macvlan网络,Bridge网络更简单、轻量,适合对网络需求不复杂的场景。

 

host

基本概念

host 模式 : 使用 --net=host 指定

相当于VMware 中的桥接模式,与宿主机在同一个网络中,但是没有独立IP地址

Docker 使用了Linux 的Namespace 技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace 隔离网络等。一个Network Namespace 提供了一份独立的网络环境,包括网卡,路由,iptable 规则等都与其他Network Namespace 隔离。一个Docker 容器一般会分配一个独立的Network Namespace

但是如果启动容器的时候使用host 模式,那么这个容器将不会获得一个独立的Network Namespace ,而是和宿主机共用一个Network Namespace 。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口范围.此时容器不再拥有隔离的、独立的网络栈。不拥有所有端口资源

案例

我们拉起一个host网络的centos容器,查看容器信息,如下图所示,并没有发现IP信息

docker run -itd --net=host --name centos7  eeb6ee3f44bd
docker inspect centos7

我们可以进入容器内部去查看下网络信息,通过下图发现,host网络模式下的容器的IP和宿主机IP一致

//进入容器
docker exec -it centos7 bash
//安装网络工具
yum install net-tools -y
//查看IP
ifconfig

工作原理

主机网络模式下,容器将不会获得独立的 IP 地址。容器的网络堆栈将直接映射到宿主机上,容器内的网络服务可以直接绑定到宿主机的 IP 地址和端口上。这种模式通常用于需要进行大量网络操作或需要提供高性能网络服务的场景。

使用场景

  • 性能敏感型应用:当容器化应用需要最大化网络性能时,使用主机网络是一个好选择。因为它消除了网络虚拟化带来的额外开销。
  • 端口冲突:在主机网络模式下,容器可以直接使用宿主机的端口,避免了端口映射可能带来的端口冲突问题。
  • 网络监控和管理:对于需要进行网络监控和管理的工具,主机网络模式能够提供更广泛的网络可视性和控制能力。

 

none

基本概念

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

案例

启动一个none网络的centos7的容器,查容器信息

docker run -itd --name centos7 --net=none eeb6ee3f44bd
docker inspect centos7

进入容器查看网络信息

//进入容器
docker exec -it centos7 bash
//安装网络工具
yum install net-tools -y
//查看IP
ifconfig

!!!大佬救命

这里可能处于none网络的原因,导致上面安装网络工具的时候失败

//安装网络工具

yum install net-tools -y

执行日志:

Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
http://mirrors.cloud.aliyuncs.com/centos/7/os/x86_64/repodata/repomd.xml: [Errno 14] curl#6 - "Could not resolve host: mirrors.cloud.aliyuncs.com; Unknown error"
Trying other mirror.

One of the configured repositories failed (CentOS-7),
and yum doesn't have enough cached data to continue. At this point the only
safe thing yum can do is fail. There are a few ways to work "fix" this:

1. Contact the upstream for the repository and get them to fix the problem.

2. Reconfigure the baseurl/etc. for the repository, to point to a working

upstream. This is most often useful if you are using a newer

distribution release than is supported by the repository (and the

packages for the previous distribution release still work).

3. Run the command with the repository temporarily disabled

yum --disablerepo=base ...

4. Disable the repository permanently, so yum won't use it by default. Yum

will then just ignore the repository until you permanently enable it

again or use --enablerepo for temporary usage:

yum-config-manager --disable base

or

subscription-manager repos --disable=base

5. Configure the failing repository to be skipped, if it is unavailable.

Note that yum will try to contact the repo. when it runs most commands,

so will have to try and fail each time (and thus. yum will be be much

slower). If it is a very temporary problem though, this is often a nice

compromise:

yum-config-manager --save --setopt=base.skip_if_unavailable=true

failure: repodata/repomd.xml from base: [Errno 256] No more mirrors to try.
http://mirrors.cloud.aliyuncs.com/centos/7/os/x86_64/repodata/repomd.xml: [Errno 14] curl#6 - "Could not resolve host: mirrors.cloud.aliyuncs.com; Unknown error"


container

基本概念

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。因此,在这种模式下,容器之间可以通过 localhost 或者 127.0.0.1 进行相互间的访问,从而提高了传输的效率。

案例

(1)首先创建个基础容器

docker run -itd --name centos7.A eeb6ee3f44bd

(2)然后基于刚才的容器创建新的容器

 docker run -itd --net=container:04dcd560b6ce --name centos7.B eeb6ee3f44bd

(3)对比上面创建的两个容器centos7.A和centos7.B发现使用了相同的网络命名空间,这是因为在创建容器B时使用了container模式,使得容器B不再创建自己的网络命名空间,而直接使用容器A的网络命名空间。


 

自定义网络

上面介绍的3种自带的网络模式有各自的局限性,因此,docker推荐大家自定义网络。通过自定义网络,我们可以实现“服务发现”与“DNS解析”。

docker 允许我们创建3种类型的自定义网络,bridgeoverlayMACVLAN

  1. bridge:Bridge模式是Docker默认的网络模式,当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,用来连接宿主机和容器,此主机上的Docker容器都会连接到这个虚拟网桥上
  2. overlay:当有多个docker主机时,跨主机的container通信
  3. macvlan:每个container都有一个虚拟的MAC地址

 

bridge

基本概念

虽然Docker提供的默认bridge网络能满足很多基本需求,但在某些场景下,你可能需要创建自定义的bridge网络以实现更灵活的网络配置,比如指定子网、IP范围、网桥名称等。

自定义bridge网络为Docker容器提供了更灵活和可控的网络配置方式,它不仅能够帮助用户更好地组织和隔离容器网络,还支持更复杂的网络架构设计,满足不同应用场景的需求。通过精细的网络配置,可以有效地提升容器化应用的部署效率和管理便利性。

案例

首先创建一个网络(这里创建的时候没有指定子网网段)

docker network create -d bridge test_bridge

看下内置网络bridge和我们创建的test_bridge网络有什么区别

docker inspect test_bridge
docker inspect bridge

自定义test_bridge网络

内置网络bridge

基于自定义网络test_bridge创建一个容器

docker run -itd --name centos7.test --net=test_bridge eeb6ee3f44b

进入容器查看网络信息,会发现分配的ip在172.18.0.0/16网段中

Docker网络允许您将容器附加到任意数量的网络

将我们之前创建的centos7.A容器加入到test_bridge网络中,先看下centos7.A容器最初的网络信息

docker network connect test_bridge centos7.A

断开centos7.A容器和test_bridge网络的连接

docker network disconnect test_bridge centos7.A

使用方法

docker network create --driver bridge --subnet=172.18.0.0/16 my-bridge-network--driver bridge 指定了网络类型为bridge。
--subnet=172.18.0.0/16 指定了网络的子网和CIDR,你可以根据需要选择合适的子网。
my-bridge-network 是自定义网络的名称。

 

overlay

基本概念

覆盖网络(Overlay Network)是 Docker 的一个高级网络类型,主要用于 Docker Swarm 集群环境中。它允许不同 Docker 主机上的容器相互通信,无论它们的物理位置如何。覆盖网络通过在宿主机之间创建一个虚拟网络层,来连接分布在不同节点上的容器。

工作原理

覆盖网络使用网络驱动(如 VXLAN)在宿主机之间建立一个虚拟网络。这个网络工作在现有的物理网络之上,容器之间的通信会被封装并通过这个虚拟网络传输。当数据包到达目的地后,它会被解封装并传递给目标容器。这种方式使得容器间能够透明地通信,就像它们在同一个网络中一样。

使用场景

  • 多主机容器部署:当你需要在多个 Docker 主机上部署容器,并且这些容器需要相互通信时,覆盖网络是理想的选择。
  • Docker Swarm 集群:在 Docker Swarm 环境中,覆盖网络允许不同节点上的服务实例之间进行通信,非常适合微服务架构。
  • 跨主机负载均衡:覆盖网络支持跨多个宿主机的负载均衡,使得服务可以更加灵活地扩展和管理。

使用方法

要在 Docker Swarm 环境中创建一个覆盖网络,首先确保你的 Docker 环境已经初始化为 Swarm 模式,然后使用以下命令创建覆盖网络:

docker network create -d overlay my_overlay_network

创建了覆盖网络后,你可以在部署服务时指定使用这个网络:

docker service create --name my_service --network my_overlay_network my_image

注意事项

  • 网络性能:由于覆盖网络中存在数据封装和解封装的过程,可能会对网络性能造成一定影响。
  • 安全性Docker 提供了网络加密选项来保护覆盖网络中的数据传输。
  • 网络管理:管理覆盖网络可能需要对 Docker Swarm 集群的管理和网络原理有一定的了解。

 

macvlan

基本概念

Macvlan 网络是 Docker 提供的另一种网络类型,允许容器直接连接到物理网络。每个使用 Macvlan 网络的容器都会被分配一个独立的 MAC 地址,使其在网络上表现得就像是一个物理设备一样。这种网络类型适用于需要容器直接参与物理网络的场景,例如,当容器需要有自己的 IP 地址、或需要绕过 Docker 网络堆栈的复杂性时。

工作原理

Macvlan 网络通过创建一个或多个虚拟网络接口(Macvlan 接口)来工作,这些接口附加到宿主机的物理网络接口上。每个接口都有自己的 MAC 地址,容器通过这些虚拟接口与外部网络进行通信。这样,容器可以直接出现在物理网络上,而不是通过 Docker 主机的网络堆栈。

使用场景

  • 需要直接网络访问:对于需要绕过 NAT、或需要与外部网络中的其他设备直接通信的容器,Macvlan 网络是一个理想的选择。
  • 遗留系统集成:在一些遗留系统或需要直接网络访问的环境中,Macvlan 网络可以帮助容器更好地集成进这些环境中。
  • 网络性能:由于容器直接连接到物理网络,Macvlan 可以提供更好的网络性能,减少虚拟化带来的开销。

使用方法

创建 Macvlan 网络的基本步骤如下:

  • 创建 Macvlan 网络
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 my_macvlan_net

这个命令会在宿主机的 eth0 网络接口上创建一个新的 Macvlan 网络,设置了子网和网关。

  • 运行容器并连接到 Macvlan 网络
docker run --network my_macvlan_net --name my_container my_image

这个命令启动一个容器,并将其连接到刚刚创建的 Macvlan 网络。

注意事项

  • 网络隔离:使用 Macvlan 网络时,容器的网络隔离级别较低,容器直接暴露在物理网络上
  • 路由和防火墙配置:可能需要在网络设备或宿主机上进行额外的路由和防火墙配置,以确保网络通信的正确性和安全性。
  • 宿主机通信:默认情况下,使用 Macvlan 的容器可能无法与其宿主机进行直接通信。这可能需要额外的网络配置来解决。

 

总结

Docker 网络是容器化技术中不可或缺的一部分,它不仅提供了容器之间以及容器与外部世界之间通信的能力,还支持了高度的网络隔离和安全性。通过不同的网络类型和配置,Docker 能够满足各种应用场景的需求,从简单的单机部署到复杂的多主机、跨主机的集群环境。

briadge网络作为默认的网络类型,适用于大多数标准部署场景,提供了容器与外部网络的连接以及容器之间的隔离。host网络模式提供了最高的网络性能,适用于性能敏感型应用。overlay网络支持跨主机的容器通信,是在 Docker Swarm 集群中运行分布式应用的理想选择。Macvlan 网络则允许容器直接连接到物理网络,适用于需要直接网络访问或遗留系统集成的场景。

每种网络类型都有其适用场景和注意事项。选择合适的网络类型和配置,可以帮助开发者和运维人员构建高效、安全且易于管理的容器化应用。同时,Docker 的网络配置和管理工具也提供了灵活性和便利性,使得网络管理变得更加简单。

Docker 网络提供了强大而灵活的网络功能,支持各种应用部署和运行模式。通过合理选择和配置网络类型,可以最大化地发挥 Docker 容器的潜力,构建出高性能、安全且易于管理的容器化应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/418551.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何操作可以有效的防止其他人修改Excel文件?

工作中,我们经常遇到同一份表格可能需要好多人共同去完成,但是当你整理好数据发给别的同事的时候,等表格再回来的时候,你可能发现你之前设置的资料格式内容等都被修改了,遇到这种情况时,如何操作可以有效的…

传统CV算法——基于Opencv的图像绘制

直线绘制 参数解析: (图像矩阵,直线起始坐标, 直线终止坐标、颜色、线条厚度) cv2.line()是OpenCV中用于绘制直线的函数。 参数说明:img:要绘制直线的图像矩阵。(100,30):直线的起…

第二十三篇——地形篇:将领的四条职业道德准则

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 这一篇讲将领应该如何做,以及正反方面也讲到了职场人应该如何…

STM32CUBEIDE FreeRTOS操作教程(四):timer软件定时器

STM32CUBEIDE FreeRTOS操作教程(四):timer软件定时器 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件,不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板为例&am…

oauth2 方式获取outlook邮箱收件箱(python)

1.在Azure 门户注册应用程序 微软文档地址 重定向的地址配置(微软地址): https://login.microsoftonline.com/common/oauth2/nativeclient 注册应用地址 2.程序代码 #安装包以及需要的驱动 pip3 install playwrightplaywright install import base64 import jso…

MAT:一款针对MSSQL服务器的安全检测与审计工具

关于MAT MAT是一款针对MSSQL服务器的安全检测与审计工具,该工具使用C#开发,可以帮助广大研究人员快速识别和发现MSSQL 服务器中的安全问题,并实现安全检测与审计目的。 功能介绍 1、执行自动检查并识别安全问题; 2、允许通过 Win…

暑期档总结:哪部国漫年番表现更优?

“暑期档”可能是所有档期中绵延时间最长的,作为该时间段主力的学生人群,在学业压力较小的假期中,需要更多娱乐方式来填充生活。除了电影之外,动画番剧越来越成为这一群体的不二选择,各个动画制作公司也会选择把精彩剧…

Datawhle X 李宏毅苹果书AI夏令营深度学习笔记之——卷积神经网络的前世今生

一、卷积神经网络简介 卷积神经网络(Convolutional Neural Network, CNN)是一种深度学习模型,尤其擅长处理图像和视频等高维度的数据。CNN 通过模仿人类视觉系统的工作方式,自动学习数据中的空间层次结构,使得它在计算…

GDB 查看汇编

查看汇编 x disassemble

24秋开学考

文件上传 上传一个.php的格式,上面说是非法的文件格式。 2.传了一个phpinfo.gif,说什么在目录里。 3.有两个页面一个labs1一个labs2 ,当在第一个页面上传1.jpg,在第二个页面上传1.jpg时,给了我们一个目录,在测试其他时…

Linux下的Makefile与进度条程序

目录 Linux下的Makefile与进度条程序 Makefile与make Makefile与make介绍 创建第一个Makefile并使用make Makefile文件基本格式介绍 Makefile依赖方法执行过程 Makefile通用写法 进度条程序 实现效果 前置知识 回车(\r)与换行(\n) 输出缓冲区 实现进度条 Linux下的…

15、Django Admin添加自定义字段功能

修改模型类HeroAdmin admin.register(Hero) class HeroAdmin(admin.ModelAdmin):change_list_template "entities/heroes_changelist.html"... # 此处原代码不动,只增加此前后代码def get_urls(self):urls super().get_urls()my_urls [path(immort…

溜狗牵绳行为检测-目标检测数据集(包括VOC格式、YOLO格式)

溜狗牵绳行为检测-目标检测数据集(包括VOC格式、YOLO格式) 数据集: 链接:https://pan.baidu.com/s/1CwLEAKcdlh9hbcBNh_Awdw?pwdiu6b 提取码:iu6b数据集信息介绍: 共有 1980 张图像和一一对应的标注文件…

7.统一网关-Gateway

文章目录 1.统一网关介绍2.网关开发3.predicate4.Route Predicate Factories(路由断言工厂)4.1Path 路由断言工厂4.2.Method 路由断言工厂4.3 Header 路由断言工厂4.4 Query 路由断言工厂4.5 Host 路由断言工厂4.6 After 路由断言工厂4.7 Before 路由断言工厂4.8 Between 路由断…

超声波测距模块HC-SR04(基于STM32F103C8T6HAL库)

超声波测距模块参考资料 1.电路连接及引脚配置 触发信号PA3只需要输出10us的高电平,所以直接设置成 普通的GPIO端口即可;回响信号使用外部中断,上升沿信号产生外部中断,打开定时器,下降沿再产生一次中断,读…

国内外大模型汇总(包括科大星火、文心一言、通义千问、智普清言、华为大模型)

国内外大模型汇总 1. 科大讯飞星火认知大模型 主要特点: 多语言能力:以中文为核心,同时支持多语言处理,能够进行跨语种的语言理解和生成。 广泛的任务能力:具备内容生成、语言理解、知识问答、推理、数学计算、代码…

强化网络安全:通过802.1X协议保障远程接入设备安全认证

随着远程办公和移动设备的普及,企业网络面临着前所未有的安全挑战。为了确保网络的安全性,同时提供无缝的用户体验,我们的 ASP 身份认证平台引入了先进的 802.1X 认证协议,确保只有经过认证的设备才能接入您的网络。本文档将详细介…

Kafka【六】Linux下安装Kafka(Zookeeper)集群

Kafka从早期的消息传输系统转型为开源分布式事件流处理平台系统,所以很多核心组件,核心操作都是基于分布式多节点的。本文这里采用三台虚拟机模拟真实物理主机搭建Zookeeper集群和kafka集群。 VMware可以使用户在一台计算机上同时运行多个操作系统&…

使用AI写WebSocket知识是一种怎么样的体验?

一、WebSocket基础知识 1. WebSocket概念 1.1 为什么会出现WebSocket 一般的Http请求我们只有主动去请求接口,才能获取到服务器的数据。例如前后端分离的开发场景,自嘲为切图仔的前端大佬找你要一个配置信息的接口,我们后端开发三下两下开…

Windows下的Redis启动报错Redis service failed to start

报错原因:Redis服务没有找到log文件 解决方案: 1、在Redis目录下打开redis.windows-service.conf文件 2、找到logfile存放目录,一般默认为Logs/redis_log.txt 3、在Redis目录创建Logs文件夹,在Logs文件夹下创建redis_log.txt文件…