07. Docker网络通信模式

目录

1、前言

2、基本原理

3、Docker网络配置

3.1、查看网络配置

3.2、4种网络模式

3.3、bridge模式

3.3.1、使用bridge网络

3.3.2、自定义bridge网络

3.4、host模式

3.5、container模式

3.6、none模式

4、小结


1、前言

前面我们介绍了Docker容器的相关内容,Docker 的容器运行在宿主机的虚拟机上。这些虚拟机彼此独立,彼此之间没有任何接口,即容器彼此之间是逻辑隔离的。那么,如何实现容器的相互通信?这个就是我们今天要讲的内容。

2、基本原理

Docker 容器中的网络接口默认都是虚拟接口。虚拟接口的最大优势是转发效率极高。这是因为,Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,即发送接口缓存中的数据包会被直接复制到接收接口的缓存中,而无须通过外部的物理网络设备进行交换。

Docker 的网络很好地利用了 Linux 虚拟网络技术,在宿主机的物理网卡和容器内分别创建-个虚拟接口(veth),并让它们通过宿主机的 docker0 网桥进行连接,我们把这样的一对 veth 叫作 veth pair。

3、Docker网络配置

3.1、查看网络配置

我们可以通过以下命令查看Docker的网络配置信息。

docker network

通过以下命令可以查看Docker的几种网络通信模式。

docker network ls

0

可以看到有3中模式:bridge,host,none。而默认情况下为bridge。

我们随便启一个docker容器,容器名称为myapp,且不指定任何网络模式:

docker run -d -p 18080:8899  myapp

0

启动成功后,我们查看网络Bridge的详情:

docker network inspect bridge

可以看到Container里面包含了我们的myapp容器,这说明我们刚启动的myapp容器默认使用的就是bridge网络模式。

0

而默认的子网地址是“172.17.0.0/16”。容器IP为172.17.0.2,是属于bridge网络的子网络。

3.2、4种网络模式

Docker一共提供了4种网络通信模式: bridge、container、host 和 none。通过上述的docker network ls看到的bridge,host,none以外,还有container模式。

模式

是否支持多主机

纵向通信机制

横向通信机制

bridge

绑定宿主机端口

通过 Linux 桥接进行通信

container

绑定宿主机端口

通过 Linux 连接进行通信

host

通过宿主机网络进行通信

通过宿主机网络进行通信

none

无法通信

只能通过 Linux 连接进行通信

由于 Docker 容器彼此之间是逻隔离的,所以,在安装 Docker 时会在容器中创建隔离的网络环境。在隔离的网络模式环境中,运行在宿主机上的各个容器具有完全独立的网络栈,并且Docker 容器的网络环境与宿主机相互隔离。通过使用 Docker 的不同网络模式,可以使 Docker容器共享宿主机的网络命名空间,也可以实现 Docker 容器间的相互访问。

3.3、bridge模式

前面提到了bridge模式是 Docker 默认的网络通信模式,也是开发者最常用的模式。在 bridge 模式下,Docker引擎会创建独立的网络命名空间。这样就可以保证运行在每一个命名空间中的容器具有独立的网卡等网络资源。

利用 bridge 模式,可以非常方便地实现容器与容器之间、容器与宿主机之间的网络隔离。通过使用宿主机上的 docker0 网桥,可以实现 Docker 容器与宿主机(乃至外部网络)的网络通信。

简单实验一下:

3.3.1、使用bridge网络

创建一个busybox镜像的容器。

BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。

docker run -it busybox /bin/sh

使用ifconfig查看网络信息:

可以看到容器的内网ip为172.17.0.3。

3.3.2、自定义bridge网络

默认情况下,docker引擎会自动创建一个bridge网络。但是通常生产环境种,我们都会自定义一个bridge网络,当然docker也是支持我们自定义的。

1)创建一个自定义的bridge网络。

创建一个名为mybridge的网络模式,网关ip为172.19.0.1,子网IP范围是172.19.0.0/24。

docker network create -d bridge  --ip-range=172.19.0.0/24 --gateway=172.19.0.1 --subnet=172.19.0.0/24 mybridge
  • -d:指定网络通信模式,默认是bridge。
  • --ip-range:子网IP地址范围。
  • --gateway:网关的IP地址。
  • --subnet:子网的IP地址。
  • mybridge:自定义bridge网络名称

2)查看Docker网络。

docker network ls

可以看到多了一个mybridge的网络通信模式。

3)使用mybridge创建容器。

docker run -it --network=mybridge --ip=172.19.0.33 busybox

  • --ip:指定容器的IP地址。
  • --network:使用的网络通信模式,这里指定刚创建的mybridge。

4)查看容器IP。

5)删除自定义网络。

docker network rm mybridge

3.4、host模式

host模式,容器与宿主机共享同一个网络命名空间,容器的IP 地址与宿主机的IP地址相同。如果宿主机具有公网的IP 地址,则容器也拥有这个公网的IP地址。即这时容器可以直使用宿主机的IP地址与外界进行通信,且容器内服务的端口也可以直接使用宿主机的端口,无须行任何的转换。

由于在 host 模式下不再需要宿主机的转发,因此其性能得到了极大的提高。

1)使用host模式创建容器。

docker run -it --net=host busybox /bin/sh

2)使用ifconfig看下网络信息。

容器内:

宿主机:

我们可以看到容器和宿主机的网络配置一摸一样,这就表示容器与宿主机共享了同一个网络命名空间。

如果使用host模式,我们在创建容器的时候就不需要-p 映射端口了,如果有映射端口,创建的时候会有警告提示。因为这个时候的IP和端口都是与宿主机共享的。

使用host模式的时候存在以下两个问题:

  1. 由于容器使用了宿主机的网络环境,因此网络环境的隔离性功能被减弱,从而造成宿主机和容器争用网络资源。容器本身也不再拥有所有的网络资源,而是与宿主机共享网络资源。
  2. 宿主机和容器使用了相同的 IP 地址,这不利于网络的配置和管理。

3.5、container模式

在 container 模式下,容器之间会共享网络环境。即一个容器会使用另一个容器的网络命名空间。因此,在这种模式下,容器之间可以通过 localhost 或者 127.0.0.1 进行相互间的访问,从而提高了传输的效率。

container 模式节约了网络资源,但是运行在这种模式下的容器不存在网络隔离。Container 网络的隔离性处于 bridge 网络与 host 网络之间。

container 模式在一些特殊场景中非常有用。例如:在 Kubernetes 中创建 Pod 时,会首先创建 Pod的基础容器;而 Pod 中的其他容器则采用 container 模式与基础容器进行通信。Pod中的各个容器采用localhost 或者 127.0.0. 进行通信,从而将 Pod 中的所有容器形成一个逻辑整体。

1)创建一个容器A,使用默认网络模式。

docker run -it busybox /bin/sh

查看网络信息:

2)创建一个容器B,使用container模式,并指向刚创建的容器A。

查看容器A的containerId为:0783212a7f4c。

开启容器B。

docker run -it --net=container:0783212a7f4c busybox /bin/sh

查看ifconfig:

可以看到容器A和B的IP信息相同,表示容器A和容器B使用了相同的网络命名空间。

因为容器B创建的时候,使用了container模式,这样容器B就不用创建自己的网络命名空间,而直接使用容器A的。

3.6、none模式

none模式下容器具有独立的网络命名空间,但不包含任何的网络配置,只能通过localhost或127.0.0.1访问容器。

docker run -it --net=none busybox /bin/sh

一般来说none模式用于一些对安全性要求高但是不需要联网的情况下。让自己的网络处于一个封闭的空间,可以排除外界其他网络的干扰。

4、小结

一般来讲,生产中用到最多的还是bridge模式,container和host模式也有自己相应的使用场景,可以根据实际情况选择。了解几种不同的网络通信模式,可以帮助我们更容易学习后续关于不同容器或者容器和宿主机间通信。一起学习吧~

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

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

相关文章

GaussDB数据库的元数据及其管理简介

目录 一、前言 二、元数据简介 1、元数据定义 2、元数据分类 3、数据库元数据管理 三、GaussDB数据库的元数据管理 1、GaussDB数据库的元数据管理 2、通过“SQL 系统表/系统视图/系统函数”的方式管理(采集)元数据 1)获取表、视图及…

【雷达通信】非相干多视处理(CSA)(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Kubernetes高可用集群二进制部署(三)部署api-server

Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署(二)ETCD集群部署 Kubernetes高可用集群二进制部署(三)部署…

vue2-v-if和v-for的优先级是什么?

1、v-if和v-for的区别 作用: v-if指令用于条件性地渲染一块内容,这块内容只会在指令的表达式返回true值的时候被渲染。 v-for指令基于一个数组来渲染一个列表,v-for指令需要使用item in items 形式的特殊语法,其中,it…

性能测试怎么做?测试工具怎么选择?

在当前软件测试行业,熟练掌握性能测试已经是测试工程师们面试的敲门砖了,当然还有很多测试朋友们每天的工作更多的是点点点,性能方面可能也只是做过简单的并发测试,对于编写脚本,搭建环境方面也比较陌生。今天这篇文章…

vue3搭建(vite+create-vue)

目录 前提条件 输入命令 对于Add an End-to-End Testing Solution nightwatch和Cypress 和 Playwright 运行 前提条件 熟悉命令行已安装 16.0 或更高版本的 Node.js (node -v查看版本) 输入命令 npm init vuelatest 这一指令将会安装并执行 create-…

NVIDIA 535.86.05 Linux 图形驱动程序改进 Wayland 支持

导读NVIDIA公司近日发布了适用于 Linux、FreeBSD 和 Solaris 系统的 NVIDIA 535.86.05 图形驱动程序,作为其生产分支的维护更新,解决了各种错误和问题。 NVIDIA 535.86.05 是在 NVIDIA 535.54.03 发布一个多月之后发布的,它通过解决在使用某…

PSO粒子群优化算法

PSO粒子群优化算法 算法思想matlab代码python代码 算法思想 粒子群算法(Particle Swarm Optimization) 优点: 1)原理比较简单,实现容易,参数少。 缺点: 1)易早熟收敛至局部最优、迭代后期收敛速度慢的…

linux 文件的权限

修改文件的权限 我这里有一个test.txt 文件,我们ll 查看一下该文件相应的属性信息 其中,权限的位置是相对固定的即: 第一个位置是r 权限,代表可读权限。 第二个位置是w权限,代表可修改权限。 第三个位置是x权限&…

SSL 证书过期巡检脚本 (Python 版)

哈喽大家好,我是咸鱼 之前写了个 shell 版本的 SSL 证书过期巡检脚本 (文章:《SSL 证书过期巡检脚本》),后台反响还是很不错的 那么今天咸鱼给大家介绍一下 python 版本的 SSL 证书过期巡检脚本 (完整代码…

本地mvn仓库清理无用jar包

背景 开发java时间久了,本地的m2仓库就会产生很多过期的jar包,不清理的话比较占空间。 原理 是通过比较同一目录下,对应jar包的版本号的大小,保留最大版本号那个,删除其他的。 脚本 执行脚本见文章顶部 执行方式 …

mac使用mvn下载node-sass 会Binary download failed, trying source

m1 上使用nvm 以下node的版本可以直接下载(Binary download,而不是 trying source)而不用切换mac cpu架构 zhiwenwenzhiwenwendeMBP cockpit % nvm install 14.15.5 Downloading and installing node v14.15.5... Downloading https://node…

华为云hcip核心知识笔记(存储服务规划)

云上存储 : 云硬盘:基于分布式架构,可弹性扩展的虚拟块存储服务 注意事项 挂载云硬盘实例和云硬盘必须在同一区域,否则挂载失败文件存储服务:完全托管的共享文件存储 可以为多个实例实现共享访问,不同vpc中可以进行对…

网络工程师 快速入门

需要掌握 以下技术 1.网络 基础 知识 TCP/IP 、OSI 7层协议、IP地址、ARP地址解析协议、ICMP(英特网控制报文协议,ping)等 入门面试常问问题。 2.路由 路由匹配 三原则、静态路由、OSPF路由协议。 2.交换 如何放数据? VLAN TRU…

【《快速构建AI应用——AWS无服务器AI应用实战》——基于云的解决方案快速完成人工智能项目的指南】

基于云的人工智能服务可以自动完成客户服务、数据分析和财务报告等领域的各种劳动密集型任务。其秘诀在于运用预先构建的工具,例如用于图像分析的Amazon Rekognition或用于自然语言处理的AWS Comprehend。这样,就无须创建昂贵的定制软件系统。 《快速构…

Windows搭建Snort环境及使用方式

目录 0x01 前置环境0x02修改配置文件0x03 自测0x04 使用0x05 感言 0x01 前置环境 环境描述windows10snort2.9.2https://www.snort.org/downloads 先把上面环境下载好! 需要注意的是安装npcap这个软件 0x02修改配置文件 软件安装目录:C:/Snort/ 配置文…

Mac电脑怎么使用“磁盘工具”修复磁盘

我们可以使用“磁盘工具”的“急救”功能来查找和修复磁盘错误。 “磁盘工具”可以查找和修复与 Mac 磁盘的格式及目录结构有关的错误。使用 Mac 时,错误可能会导致意外行为,而重大错误甚至可能会导致 Mac 彻底无法启动。 继续之前,请确保您…

SpringBoot3---核心特性---2、Web开发I

星光下的赶路人star的个人主页 如果我们总是等待绝对的一切就绪,那我们将永远无法开始 文章目录 1、WebMvcAutoConfiguration1.1 生效条件1.2 效果1.3 WebMvcConfigure接口1.4 静态资源规则代码1.5 EnableWebMvcConfiguration源码1.6 为什么容器中放一个WebMvcConfi…

Go 微服务开发框架 DMicro 的设计思路

Go 微服务开发框架 DMicro 的设计思路 DMicro 源码地址: Gitee:dmicro: dmicro是一个高效、可扩展且简单易用的微服务框架。包含drpc,dserver等 背景 DMicro 诞生的背景,是因为我写了 10 来年的 PHP,想在公司内部推广 Go, 公司内部的组件及 rpc 协议…

Ubuntu服务器ELK部署与实践

文章目录 1. Docker安装2. 拉镜象2.1 ElastciSearch2.2 Kibana2.3 logstash 3. 数据展示 1. Docker安装 看之前的文章 docker ubuntu完全卸载docker及再次安装 Ubuntu安装 Docker 此外,Docker偶尔会出现这种问题dial tcp: lookup registry-1.docker.io on 192.168.1…