Docker网络介绍

news2024/11/29 12:35:27

网络是虚拟化技术中最复杂的部分,也是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.coloradmin.cn/o/1851046.html

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

相关文章

象战----第十二届中山市邀请赛正赛

本次的题解一定让大家享受脑细胞碰撞与再生死亡的感受!定然酣畅淋漓!请耐心的读完 简称:让脑袋死机。。。 象战 老规矩先分析在打码: 注意到题目告诉我们:四个角落是不能放的 那么 我们设象在(i,j).(注意&#xff1a…

120.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-邮件发送功能的封装

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了 内容…

遍历二叉树和线索二叉树

目录 一、*遍历二叉树 1.1遍历定义 1.2遍历目的 1.3遍历用途 1.4遍历方法 1.4.1先序遍历(DLR) 1.4.2中序遍历(LDR) 1.4.3后序遍历(LRD) 1.5根据遍历序列确定二叉树 1.6遍历算法的实现 1.6.1先序遍…

MySQL—索引—基础语法

目录 一、创建、查看以及删除索引的语法 (1)创建索引 1、1会用到一个关键字:CREATE。 1、2增加索引还可以用到另外一个关键字——ALTER TABLE 表名 ADD INDEX ... 。 2、解释。 (2)查看索引 1、查看索引需要用到…

PCL 三次样条插值(二维点)

一、简介 在插值计算中,最简单的分段多项式近似应该是分段线性插值,它由连接一组数据点组成,仅仅只需要将这些点一一用直线进行顺序相连即可。不过线性函数插值的缺点也很明显,就是在两个子区间变化的比较突兀,也就是没有可微性(不够光滑)。因此我们需要更为符合物理情况…

Day58 代码随想录打卡|二叉树篇---将有序数组转换为二叉搜索树

题目(leecode T108): 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 方法:用有序数组构造平衡二叉搜索树,和我们之前有一题的思路差不多&#xff0c…

计算机毕设JAVA——学习考试管理系统(基于SpringBoot+Vue前后端分离的项目)

学习考试管理系统 概要系统架构技术运行环境系统功能项目演示图片 概要 网络上许多计算机毕设项目开发前端界面设计复杂、不美观,而且功能结构十分单一,存在很多雷同的项目:页面基本上就是套用固定模板,换个颜色、改个文字&#…

如何使用gprof对程序进行性能分析

如何使用gprof对程序进行性能分析 目录 1 gprof概述 2 gprof原理简述 3 gprof使用 3.1 gprof使用简述 3.2 gprof使用示例 4 小结 1 gprof概述 gprof 是 一个 GNU 的程序性能分析工具,可以用于分析C\C程序的执行性能。gprof工具可以统计出各个函数的调用次数、执…

C语言小例程

题目&#xff1a;两个乒乓球队进行比赛&#xff0c;各出三人。甲队为a,b,c三人&#xff0c;乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比&#xff0c;c说他不和x,z比&#xff0c;请编程序找出三队赛手的名单。 #include <stdio.h> #in…

【职场人】职场进化记:我的“不惹人厌邀功精”之路

刚步入职场的我&#xff0c;就像一张白纸&#xff0c;什么都不懂&#xff0c;只知道埋头苦干。但渐渐地&#xff0c;我发现那些经常“冒泡”的同事似乎总能得到更多的关注和机会。我不禁想&#xff1a;“我是否也要成为那样一个‘邀功精’呢&#xff1f;” 不过&#xff0c;我…

BFS:解决最短路问题

文章目录 什么是最短路问题&#xff1f;1.迷宫中离入口最近的出口2.最小基因变化3.单词接龙4.为高尔夫比赛砍树总结 什么是最短路问题&#xff1f; 最短路问题是图论中的经典问题&#xff0c;旨在寻找图中两个节点之间的最短路径。常见的最短路算法有多种&#xff0c;这次我们…

MSPM0G3507——GPIO例程讲解1——input_capture

函数&#xff1a; 参数&#xff1a; 返回值&#xff1a; 主函数代码&#xff1a; #include "ti_msp_dl_config.h"extern volatile uint32_t interruptVectors[];int main(void) {SYSCFG_DL_init(); //把所有的LED灯和按键初始化了一…

idea导入文件里面的子模块maven未识别处理解决办法

1、File → Project Structure → 点击“Modules” → 点击“” → “Import Model” 2、可以看到很多子模块&#xff0c;选择子模块下的 pom.xml 文件导入一个一个点累死了&#xff0c;父目录下也没有pom文件 解决办法&#xff1a;找到子模块中有一个pom.xml文件&#xff0c;…

【CT】LeetCode手撕—42. 接雨水

目录 题目1- 思路2- 实现⭐42. 接雨水——题解思路 3- ACM实现 题目 原题连接&#xff1a;42. 接雨水 1- 思路 模式识别&#xff1a;求雨水的面积 ——> 不仅是只求一个比当前元素大的元素&#xff0c;还要求面积 单调栈 应用场景&#xff0c;需要找到左边比当前元素大的…

钓鱼隐藏--文件后缀压缩文件捆绑文件

免责声明:本文仅做技术交流与学习... 目录 文件后缀-钓鱼伪装-RLO 压缩文件-自解压-释放执行 捆绑文件-打包加载-释放执行 文件后缀-钓鱼伪装-RLO 改后缀--伪装 w.exe wgpj.exe (要改的后缀反写)(jpg--->gpj) | (光标移到要改的后缀的前边)(w和g中间) …

Sequelize入门及简单的增删改查

前言 学习一下NodeJS怎么使用Sequelize怎么查询数据库数据 一、Sequelize是什么&#xff1f; Sequelize 是一个基于 promise 的 Node.js ORM, 二、搭建项目 1.安装过程 npm i -g sequelize-cli //全局安装sequelize-clinpm i sequelize mysql2 //安装sequelize和mysql2…

基于YOLOv5的交通标志检测的设计与实现

简介 在智能交通系统中,交通标志的准确检测与识别对提高道路安全和交通效率至关重要。为了实现这一目标,我们开发了一种基于YOLOv5目标检测模型的交通标志检测系统。本报告将详细介绍该系统的实际应用与实现,包括系统架构、功能实现、使用说明、检测示例、数据集获取与介绍…

通信系统网络架构_1.局域网网络架构

当今&#xff0c;通信网络从大的方面主要包括局域网、广域网、移动通信网等网络形式。不同的网络会采用不同的技术进行网络构建。以下针对不同的网络给出各自的网络架构以及所采用的技术。 1.概述 局域网&#xff0c;即计算机局部区域网络&#xff0c;是一种为单一机构所拥有的…

运维.云技术学习.基于应用服务网格的灰度发布(上:理论基础篇)

运维专题 基于应用服务网格的灰度发布&#xff08;上&#xff1a;理论基础篇&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAdd…

CVPR‘24 最佳学生论文,从灵感到成稿仅用一个月,源自业余创意!

北京时间6月20日凌晨&#xff0c;CVPR 2024正式公布了最佳论文和最佳学生论文等奖项。 其中&#xff0c;最佳论文有两篇&#xff0c;分别是BioCLIP和Mip-Splatting。 据Mip-Splatting论文的第一作者Zehao Yu的导师、图宾根大学教授Andreas Geiger透露&#xff0c;这篇论文从想法…