Docker网络介绍

网络是虚拟化技术中最复杂的部分,也是Docker应用中的一个重要环节。

Docker中的网络主要解决容器与容器、容器与外部网络、外部网络与容器之间的互相通信的问题。

这些复杂情况的存在要求Docker有一个强大的网络功能去保障其网络的稳健性。因此,Docker的网络功能是它的关键技术之一。

Docker基于Network Namespace提供隔离的网络环境,容器拥有独立的网络栈。

Docker官方提供了五种网络模式:

  1. Bridge(默认模式):每个容器分配IP,并连接到docker0虚拟网桥,通过Iptables nat表与宿主机通信。

  2. Host:容器不配置虚拟网卡,使用宿主机的IP和端口。

  3. Container:新容器不创建自己的网络配置,与指定容器共享IP、端口。

  4. None:关闭容器网络功能,不与其他容器或宿主机连通。

  5. Overlay:这种模式用于在多个Docker主机之间创建一个虚拟网络,允许容器跨主机进行通信。

本文主要介绍前面四种,Overlay 参考:docker overlay网络原理详解-CSDN博客

网络模式配置说明
bridge--networkbridge 默认模式
host--network host容器和宿主机共享 Network namespace
container--network container:NAME_OR_ID容器和另外一个容器共享 Network namespace
none--network none容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,配置 IP 等

默认网络

Docker安装后自动创建bridge、host、none三个网络。使用docker network ls命令可以列出这些网络。

 docker network ls

图片

使用docker run命令创建Docker容器时,可以用--net命令指定容器的网络模式。

Docker的4种网络模式分别由如下命令指定:

  • Bridge模式:使用--net=bridge指定,默认设置。
  • Host模式:使用--net=host指定。
  • Container模式:使用--net=container:NAME_or_ID指定。
  • None模式:使用--net=none指定。

Bridge模式(默认方式)

Docker的Bridge模式是Docker容器的默认网络模式,它为每个容器提供了一个隔离的网络环境,同时允许容器与宿主机以及其他容器进行通信。以下是Bridge模式的详细特点和工作原理:

主要特点
  1. 独立的网络栈:每个容器都在自己的Network Namespace中运行,拥有独立的网络栈。

  2. 虚拟网桥:Docker使用一个虚拟网桥(默认为docker0),类似于物理交换机,连接所有容器。

  3. 自动IP分配:Docker为连接到Bridge网桥的每个容器自动分配一个唯一的IP地址。

  4. 容器间通信:容器可以通过它们各自的虚拟接口和网桥相互通信,就像它们处于同一局域网中一样。

  5. 与宿主机通信:容器可以通过NAT(网络地址转换)规则与宿主机通信,宿主机也可以访问容器。

  6. 端口映射:可以通过-p参数将容器内部端口映射到宿主机的端口,从而使外部网络能够访问容器中的服务。

工作原理
  1. 网桥创建:当Docker守护进程启动时,它会自动创建一个虚拟网桥(如docker0)。

  2. veth pair接口:为每个容器创建一对虚拟网络接口(veth pair),一端连接容器内部的eth0,另一端连接到网桥。

  3. IP地址分配:Docker使用内置的IP地址管理(IPAM)为每个容器分配一个IP地址,通常处于172.17.0.0/16网段。

  4. NAT规则:Iptables规则被配置以允许容器通过宿主机的IP地址与外部网络通信。

  5. 容器连接:当容器被创建时,它的网络接口会被连接到docker0网桥上,使其能够与网络中的其他容器通信。

示例命令

使用Bridge模式启动一个Docker容器通常不需要显式指定网络模式,因为Bridge是默认设置。但可以通过以下命令明确指定:

docker run -it --net=bridge ubuntu bash

这条命令会启动一个基于Ubuntu镜像的容器,并提供一个bash shell。容器将连接到默认的Bridge网络。

注意事项
  • 默认网桥:docker0是Docker自动创建的默认网桥,通常不需要手动配置。

  • 网络隔离:尽管容器在网络层面上是隔离的,但它们仍然可以通过网桥进行通信。

  • 端口映射:使用端口映射时,需要确保宿主机上映射的端口没有被其他服务使用。

  • 网络安全:由于容器共享宿主机的网络,因此需要考虑网络安全策略,如使用防火墙规则来限制访问。

查看某网络的详细信息
[root@yeweijie-cvm-71 ~]# docker network ls 
NETWORK ID     NAME            DRIVER    SCOPE
2a6943137141   bridge          bridge    local
78e82590f37e   harbor_harbor   bridge    local
6106e5ad9c03   host            host      local
2b10648fd424   none            null      local
[root@yeweijie-cvm-71 ~]# 
[root@yeweijie-cvm-71 ~]# docker network inspect 2a6943137141

图片

如上图,可以看到默认的bridge模式,网关为:172.17.0.1; 网段为:172.17.0.3/16,目前已分配四个容器,分配的IP地址为172.17.0.2到172.17.0.5

图片

查看docker 的IP
# docker inspect   --format '{{json .NetworkSettings.IPAddress}}' ${docker_id}
docker inspect   --format '{{json .NetworkSettings.IPAddress}}' aee012a7b0e1
查看对应容器的 iptables 规则
iptables -t nat -vnL 
iptables -t nat -vnL |grep  172.17.0.5 
 

Host模式

容器与宿主机共用Network Namespace,不分配独立IP。容器使用宿主机的IP和端口。

Docker的Host模式提供了一种网络配置选项,允许容器直接使用宿主机的网络堆栈。这意味着容器不会获得自己的网络命名空间,而是与宿主机共享网络接口和配置。以下是Host模式的一些关键特点和使用场景:

主要特点
  1. 共享网络命名空间:容器与宿主机共享同一个网络命名空间,因此它们之间不会有网络隔离。

  2. 直接使用宿主机的IP:容器会直接使用宿主机的IP地址,不会分配独立的IP地址给容器。

  3. 端口映射:由于容器使用宿主机的端口,因此不需要进行端口映射(即不需要使用-p参数来映射端口)。容器内部服务的端口直接映射到宿主机的相应端口。

  4. 网络性能:由于避免了虚拟网络接口的开销,Host模式下容器的网络性能通常比使用桥接网络(Bridge模式)时更优。

  5. 安全性:由于容器与宿主机共享网络,任何对容器的网络攻击都可能影响到宿主机。因此,Host模式在安全性方面需要谨慎使用。

使用场景
  • 性能敏感型应用:当运行对网络性能要求极高的应用时,Host模式可以减少网络通信的延迟和开销。

  • 宿主机网络调试:在需要调试宿主机网络配置或直接与宿主机网络服务交互的场景下,Host模式非常有用。

  • 特定网络服务:当容器需要作为宿主机上的特定网络服务运行时,例如,作为网络代理或负载均衡器,Host模式可以简化配置。

示例命令

要使用Host模式启动一个Docker容器,可以使用--net=host标志:

docker run -it --net=host ubuntu bash

这条命令会启动一个基于Ubuntu镜像的容器,并提供一个bash shell。由于使用了Host模式,这个容器将直接使用宿主机的网络。

注意事项
  • 使用Host模式时,容器内的网络配置(如/etc/hosts/etc/resolv.conf等)将与宿主机保持一致。

  • 在Host模式下,容器内的网络服务可能会与宿主机上的服务冲突,因此需要仔细规划端口和服务的使用。

  • Host模式可能会增加安全风险,因为它减少了容器与宿主机之间的隔离。因此,除非必要,通常不建议在生产环境中使用Host模式。

Container模式

新容器与已存在容器共享Network Namespace,共享网卡、主机名、IP地址,通过本地回环接口通讯。

Docker的Container模式(也称为Container网络模式)允许一个新创建的容器与一个已经存在的容器共享同一个网络命名空间。这意味着两个容器将共享相同的网络接口、IP地址和端口号,它们之间可以直接通过回环接口(lo)进行通信,而不需要通过网络。以下是Container模式的一些关键特点和使用场景:

主要特点
  1. 共享网络命名空间:新容器与指定的容器共享网络命名空间,它们具有相同的网络配置。

  2. 共享IP地址:两个容器共享同一个IP地址,因此从外部网络来看,它们是不可区分的。

  3. 直接通信:由于共享网络命名空间,两个容器可以直接通过回环接口进行通信,无需通过网络。

  4. 端口共享:共享网络命名空间的容器可以访问和使用相同的端口。

  5. 资源隔离:尽管网络命名空间被共享,但容器的文件系统、进程列表等其他资源仍然是隔离的。

使用场景
  • 服务发现:在微服务架构中,服务实例可能需要共享网络以便更容易地发现和通信。

  • 容器间紧密耦合:当两个容器需要紧密协作,共享网络可以简化它们的通信机制。

  • 网络配置简化:在某些情况下,共享网络可以减少网络配置的复杂性。

示例命令

要使用Container模式启动一个Docker容器,并与已存在的容器existing_container共享网络命名空间,可以使用以下命令:

docker run -it --net=container:existing_container new_container_image bash

这条命令会启动一个新的容器,并使其与名为existing_container的已存在容器共享网络命名空间。new_container_image是你想要运行的新容器的镜像名称。

注意事项
  • 使用Container模式时,新容器将无法拥有独立的网络接口或IP地址。

  • 由于共享了网络命名空间,新容器的网络配置将受到现有容器网络状态的影响。

  • 如果现有容器的网络配置发生变化,如IP地址变更,新容器的网络配置也会相应变化。

  • 在Container模式下,两个容器之间的网络通信不会经过任何网络地址转换(NAT),因此它们可以直接通过回环接口通信。

None模式

一句话:就是不配置任何网络,与宿主机和其他容器都不连通。

Docker的None网络模式是一种特殊的网络配置,它创建了一个具有网络命名空间但没有任何网络配置的容器。这意味着容器将不会有任何网络接口,无法进行任何网络通信。以下是None模式的一些关键特点和使用场景:

主要特点
  1. 独立的网络命名空间:容器拥有自己的网络命名空间,但是不分配任何网络接口。

  2. 无网络接口:在None模式下,容器内不会有任何网络接口,如eth0

  3. 无IP地址:由于没有网络接口,容器也不会有分配的IP地址。

  4. 无法进行网络通信:容器无法访问外部网络,也无法被外部网络访问。

  5. 完全隔离:容器的网络环境与宿主机和其他容器完全隔离。

使用场景
  • 测试和隔离:在需要完全隔离网络环境进行测试的场景下,None模式非常有用。

  • 依赖网络服务的容器:当容器需要依赖于宿主机或其他容器提供的网络服务,但本身不需要直接访问网络时,可以使用None模式。

  • 简化网络配置:在某些情况下,为了简化网络配置和管理,可能会选择None模式。

示例命令

要使用None模式启动一个Docker容器,可以使用以下命令:

docker run -it --net=none ubuntu bash

 这条命令会启动一个基于Ubuntu镜像的容器,并提供一个bash shell。由于使用了None模式,这个容器将不会有任何网络接口。

注意事项
  • 使用None模式时,容器将完全与网络隔离,因此不适合需要网络通信的应用。

  • 如果容器需要在后期配置网络,None模式提供了一个干净的起点,但需要手动添加网络接口和配置。

  • None模式下的容器仍然可以通过Docker的高级网络功能(如端口映射)来访问外部服务,但这需要额外的配置。

  • 在None模式下,容器的网络环境可以被完全控制,适合于需要精细网络管理的场景。

总结

  • 默认网络: Docker安装后自动创建bridge、host、none三个网络,可通过 docker network ls 命令列出。

  • 网络模式指定: 在使用 docker run 创建容器时,可通过 --net 选项指定网络模式。

  • 网络隔离: Host模式和Container模式减少了容器与宿主机之间的网络隔离,因此在安全性方面需要特别注意。

  • 网络性能: Host模式由于避免了虚拟网络接口的开销,通常提供比Bridge模式更优的网络性能。

  • 使用场景: 根据不同的应用场景和需求,选择合适的网络模式,例如性能敏感型应用可能更适合Host模式,而需要网络隔离的场景则可能需要Bridge或None模式。

没展开讲的Overlay网络是一种用于在多个Docker主机之间创建虚拟网络的模式,允许容器跨主机进行通信,此部分将单独讲解。

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

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

相关文章

【Linux】了解冯诺伊曼体系结构

文章目录 冯诺依曼体系结构概念冯诺依曼体系结构的推导过程理解冯诺依曼体系 冯诺依曼体系结构概念 冯诺依曼结构是现代计算机发展所遵循的基本结构形式之一,其特点是“程序存储,共享数据,顺序执行”。冯诺依曼结构消除了原始计算机体系中&a…

音乐圈的颠覆与挑战讨论

最近的一个月,音乐界经历了一场前所未有的变革。一系列音乐大模型轮番上线,它们以惊人的能力,将素人生产音乐的门槛降到了最低。这一系列事件引发了关于音乐圈是否会被AI彻底颠覆的热烈讨论。然而,短暂的兴奋过后,我们…

AOP切面不起作用?一文教你排查与修复Spring代理问题

问题背景:在构建一个在线编程平台的过程中,我使用了Spring AOP来增强代码沙箱(CodeSandBox)的功能。通过定义一个切面,我希望在执行代码沙箱的相关方法前后添加日志记录和其他业务逻辑。 在编写单元测试时&#xff0c…

【线性代数】实对称

对称矩阵是在线性代数中非常重要的一类矩阵。一个矩阵 \( A \) 被称为对称矩阵,如果它等于其转置矩阵,即 \( A A^T \)。对称矩阵具有以下几个重要性质: ### 1. 特征值和特征向量 - **实特征值**:对称矩阵的所有特征值都是实数。…

PCDViewer-5.0.0——开启漫游的世界

在点云相关的研发和生产中,按Pose进行场景漫游是一个十分有用的功能,它可以快速地检查SLAM建图质量或点云编辑效果。用 ros rviz进行点云漫游是一项不错的选择,但它存在的一定的开发门槛,而且需要安装额外的资源。 PCDViewer-5.0.…

[Vite+Vue3+TS] Router的使用

1. 安装Vue Router npm install vue-router4 --save这会安装Vue Router的最新4.x版本,并将其添加到你的package.json依赖中。 2. 创建路由配置文件 在src目录下创建一个名为router的文件夹(如果尚未存在),并在该文件夹内创建一…

vue引入eachrts

1. 安装Echarts 使用npm npm install echarts --save 导入Echarts插件 import echarts from echarts Vue.prototype.$echarts echarts import echarts from echarts 我们来做个简单的实例首先需要一个容器装下Echarts <template><div id"list"…

物理隔离状态下,如何保障数据单向导入的安全性?

为了保护企业的核心数据&#xff0c;像一些涉密行业会通过物理隔离方式&#xff0c;将网络隔离成内网和外网&#xff0c;比如军工、党政、生物医药、金融等行业&#xff0c;网络隔离后会存在外网数据单向导入内网&#xff0c;内网数据单向导出外网等交互需求。在实施数据单向导…

Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!

代码仓库 会同步代码到 GitHub https://github.com/turbo-duck/flink-demo 当前章节 继续上一节的内容&#xff1a;https://blog.csdn.net/w776341482/article/details/139875037 上一节中&#xff0c;我们需要使用 nc 或者 telnet 等工具来模拟 Socket 流。这节我们写一个 …

36.Http协议的设计与解析

Http协议比Redis协议复杂的多,如果程序员自己去实现,工作量大。 Netty已经把Http协议的编解码器实现好了,只需要简单的配置就可以使用。 做一个http的服务端需要HttpServerCodec。 看它继承的父类: 结合了两个类: HttpRequestDecoder(入站处理器extends Channelnbound…

【网络安全常用术语解读 :什么是0day、1day、nday漏洞】

脆弱性攻击的时间窗被称作脆弱性窗口。通常情况下&#xff0c;一个安全漏洞的时间越久&#xff0c;攻击者就会有更多的机会去攻击它。 2. 0day 漏洞 0天漏洞&#xff0c;也被称作"零日漏洞"&#xff0c;是指尚未由供应商公布的缺陷&#xff0c;表示攻击者已知晓该缺…

力扣练习题 (2024.6.23)

//我们定义&#xff0c;在以下情况时&#xff0c;单词的大写用法是正确的&#xff1a; //全部字母都是大写&#xff0c;比如 "USA" 。 //单词中所有字母都不是大写&#xff0c;比如 "leetcode" 。 //如果单词不只含有一个字母&#xff0c;只有首字母大写&a…

Java线程基础知识汇总

进程与线程 什么是进程&#xff1f; 进程是指在计算机中运行的程序的实例。它是操作系统进行资源分配和调度的基本单位。一个进程可以包含多个线程&#xff0c;每个线程都共享该进程的资源&#xff0c;如内存、文件和打开的网络连接等。每个进程都有自己的地址空间&#xff0…

FlowUs2024重磅革新预告:RAG技术赋能『问问AI』,笔记变现新纪元等你开启!

&#x1f389; 在FlowUs的广阔天地间&#xff0c;知识的边界被无限拓展&#xff0c;引领着一场场创新与收获的庆典&#xff01;&#x1f680; 随着一年间不断的精进与革新&#xff0c;FlowUs与众多用户并肩前行&#xff0c;在追求极致体验的道路上迈出坚实步伐。步入2024年&am…

WordPress项目教程:自动采集并发布,让你轻松实现网站内容更新

随着互联网的发展&#xff0c;越来越多的人开始关注自己的个人网站&#xff0c;通过网站展示自己的才华、分享知识、推广产品等。然而&#xff0c;个人网站的运营并非易事&#xff0c;尤其是内容更新方面。为了解决这个问题&#xff0c;今天我们将为大家推荐一款WordPress插件主…

minio直接通过地址访问无需服务器转发

背景 做网站有些图片、视频、js等资源&#xff0c;没有什么变化&#xff0c;想在网站上直接使用&#xff0c;前端拿到地址可直接访问获得&#xff0c;而不是通过后台转一道再获得&#xff0c;折腾了半天访问不到&#xff0c;从网上找资料挨个试&#xff0c;也没完全解决&#…

云计算期末综合测试题

云计算综合测试题 单选题填空题判断题简答题 单选题 这里选择题&#xff0c;直接以填空题展示&#xff0c;并给出解析 Bigtable是&#xff08;Google&#xff09;开发的分布式存储系统 解析&#xff1a;分布式结构化数据表Bigtable是Google基于GFS和Chubby开发的分布式存储系统…

君子小人的格局、境界

子曰&#xff1a;君子怀德&#xff0c;小人怀土&#xff1b;君子怀刑&#xff0c;小人怀惠。 直译&#xff1a;君子怀念道德&#xff0c;小人怀念乡土&#xff1b;君子关心法度&#xff0c;小人关心恩惠。 这里的君子与小人只是体现格局、境界的不同&#xff1b; 君子怀的是德…

DVWA 靶场 SQL Injection (Blind) 通关解析

前言 DVWA代表Damn Vulnerable Web Application&#xff0c;是一个用于学习和练习Web应用程序漏洞的开源漏洞应用程序。它被设计成一个易于安装和配置的漏洞应用程序&#xff0c;旨在帮助安全专业人员和爱好者了解和熟悉不同类型的Web应用程序漏洞。 DVWA提供了一系列的漏洞场…

sklearn之各类朴素贝叶斯原理

sklearn之贝叶斯原理 前言1 高斯朴素贝叶斯1.1 对连续变量的处理1.2 高斯朴素贝叶斯算法原理 2 多项式朴素贝叶斯2.1 二项分布和多项分布2.2 详细原理2.3 如何判断是否符合多项式贝叶斯 3 伯努利朴素贝叶斯4 类别贝叶斯4 补充朴素贝叶斯4.1 核心原理4.2 算法流程 前言 如果想看…