Skip to main content

moregeek program

【docker 那些事儿】容器网络的 “梦华录”(上篇)_shiningstar的博客-多极客编程

@toc


🌟 前言



当企业开始大规模使用 Docker 时,工程师就需要掌握很多关于网络的知识。
 
Docker 作为目前流行的轻量级容器技术,有很多令人称道的功能,如前面介绍的 Docker 镜像管理。
 
然而,Docker 也有很多不完善的地方,网络方面就是 Docker 比较薄弱的部分。
 
作为初学者的我们来说很有必要深入了解 Docker 的网络知识,以适应更高的网络需求。



1. 容器网络概述


🍑 容器网络概述


容器网络主要用于容器与容器、容器与外网、容器与宿主机之间的通信及互联。


宿主机接通外网,再与容器之间搭建网桥,使容器与宿主机网络联通,以达到容器连接外网的目的,如图所示👇
在这里插入图片描述
用户可以创建一个或多个网络,一个容器可以加入一个或多个网络。


同一个网络中的容器可以相互通信,不同网络中的容器相互隔离。


在创建容器之前,用户可以先创建网络,然后再将容器添加到网络,即创建容器与创建网络是分开的。


Docker 的本地网络实现是利用了 LinuxNetwork Namespace 和虚拟网络设备(主要是 Virtual Ethernet Pair),在本地主机和容器内分别创建一个虚拟接口,并使它们彼此连通。


Docker 使用 LinuxNamespace 技术来进行资源隔离,例如,PID Namespace 隔离进程、Mount Namespace 隔离文件系统、Network Namespace 隔离网络等。


Network Namespace 为容器提供了独立的网络环境。


Virtual Ethernet Pair 简称 VETH Pair,是一对端口,所有从这对端口进入的数据包都将从另一端出来,反之也是一样。


🍑 查看容器网络


用户要对容器网络进行配置,首先要熟练掌握命令,下面详细介绍容器网络管理命令。


查看容器网络的命令格式为:
在这里插入图片描述
参数介绍如下👇




  • -f--filter filter



    过滤条件。





  • --format string



    格式化打印结果。





  • --no-trunc



    不缩略显示。




  • -q--quiet

    只显示网络对象的 ID




首先,查看所有容器网络,示例代码如下:
在这里插入图片描述
如以上示例所示,容器网络也有其固定的 ID 号,DRIVER 表示容器网络的驱动程序,SCOPE 表示容器网络的作用域。


默认情况下,容器创建完成后,会自动创建 bridgehostnone 三种网络模式。


接着,通过在命令中添加过滤条件查看容器网络,示例代码如下:
在这里插入图片描述
以上示例通过 -f 参数添加了 'driver=host' 过滤条件,成功过滤出了 host 网络。


通常 Docker 所显示的容器 ID 号、镜像 ID 号等都是通过缩略之后的结果,只要在命令中添加对应的参数即可显示完整 ID 号。


通过在命令中添加参数,以不缩略的形式列出所有容器网络,示例代码如下:
在这里插入图片描述
以上示例在命令中添加了 --no-trunc 参数,以不缩略的形式列出了所有容器网络。


最后,通过在命令中添加参数,列出所有网络的 ID 号,示例代码如下:
在这里插入图片描述
以上示例在命令中添加了 -q 参数,列出了所有容器网络的 ID 号。


🍑 创建容器网络


创建网络的命令格式为:
在这里插入图片描述
参数介绍如下👇




  • -d--driver string



    指定网络模式(默认为bridge)。





  • --subnet strings



    指定子网网段。





  • --ip-range strings



    指定容器的IP地址范围,格式同subnet参数。




  • --gateway strings
    子网的 IPV4IPV6 网关。

创建一个容器网络,并指定它的网络模式,示例代码如下:
在这里插入图片描述
以上示例创建了一个命名为 test-bridge 的新容器网络,并指定它的网络模式为 bridge 网络。


其余网络属性配置方式与之相同,这里不再赘述。


🍑 删除容器网络


下面将讲解删除容器网络的操作,在生产环境中建议再三确认之后再执行删除操作。


删除容器网络与删除容器同样都需要在命令中添加 rm 参数。


删除容器网络的命令格式为:
在这里插入图片描述
首先,查看是否有需要删除的容器网络,示例代码如下:
在这里插入图片描述
接着,将需要删除的容器网络进行删除,示例代码如下:
在这里插入图片描述
最后,查看容器网络是否被删除,示例代码如下:
在这里插入图片描述
从以上示例中,可以看到容器网络 test-bridge 已经成功删除。


🍑 容器网络详细信息


查看容器网络详细信息的命令格式为:
在这里插入图片描述
参数介绍如下👇



  • -f--format string

    使用给定的模板格式化输出。




示例代码如下:
在这里插入图片描述
以上示例查看了 none 网络的详细信息,包括容器网络名称、容器网络 ID 容器网络创建时间等。


🍑 配置容器网络


配置容器网络就是为用户创建的容器添加网络配置,只需要在运行容器的命令中添加指定的网络参数。


配置容器网络的命令格式为:
在这里插入图片描述
示例代码如下:
在这里插入图片描述
以上示例通过在运行容器中添加 --network 参数,指定了容器的 host 网络模式。


其中,反斜杠 "\" 表示命令没有输入完,上下两行为同一条命令,这种命令输入方式适合在输入长命令时使用。


下面查看容器信息,验证该容器网络是否为 host 模式,示例代码如下:
在这里插入图片描述
以上示例通过 docker inspect 命令中添加 grep 参数过滤出了该容器的网络模式为 host 的信息。


下面运行一个不指定网络模式的容器,并查看其网络模式信息,示例代码如下:
在这里插入图片描述
由以上示例可见,不指定网络模式,Docker 会默认使用 bridge 网络模式。


🍑 容器网络连接与断开


容器网络连接与断开的命令格式为:
在这里插入图片描述
下面通过示例讲解容器网络的连接与断开,首先创建一个容器,示例代码如下:
在这里插入图片描述
以上示例运行了一个连接 host 网络的容器。


然后将该容器与 host 网络断开,示例代码如下:
在这里插入图片描述
以上示例使该容器与 host 网络断开。


在命令中使用 ID 号即可,并且断开网络之前需要先关闭该容器。


下面再次执行断开网络命令,观察执行结果,示例代码如下:
在这里插入图片描述
以上示例中,再次执行断开命令时发生报错,提示网络已断开。


下面将该容器添加到 none 网络中,示例代码如下:
在这里插入图片描述
以上示例中,供执行了两次连接 none 网络的命令。


第一次执行命令使容器成功连接了 none 网络,再次执行命令连接时报错,提示容器已在 none 网络中。


2. none网络


顾名思义,none 网络就是什么都没有的网络。


在这种模式下,Docker 容器网络拥有自己的网络命名空间,但并不为 Docker 容器进行任何网络配置。


也就是说,这个模式下的容器除了本地环回接口,没有其他任何 网卡IP路由 等信息,如图所示👇
在这里插入图片描述
没有网络配置的情况下,Docker 开发者才能在此基础上做其他无限多可能的网络定制开发。


用户可以自己为 Docker 容器添加网卡、配置 IP 地址等。


这也正体现了 Docker 开放的设计理念。


下面使用默认网络模式创建一个 BusyBox 容器。示例代码如下:
在这里插入图片描述
以上示例运行了一个被命名为 test-defaultBusyBox 容器,并且此时已进入容器。


下面在容器终端中查看容器 IP 地址,示例代码如下:
在这里插入图片描述
从以上示例中可以看到,Docker 为容器分配了 IP 地址。


下面通过 ping 命令测试容器网络是否能够联通外网,示例代码如下:
在这里插入图片描述
以上示例中,通过 ping 协议连通了外网,说明容器能够正常上网,。


作为对比验证,再运行一个 BusyBox 容器,将网络设置为 none 模式,示例代码如下:
在这里插入图片描述
通过以上示例的对比验证,可以很清晰地理解 Docker 容器 none 网络就是没有网络。


没有网络意味着安全性非常高,这样的网络模式通常可以用在一些对安全性要求较高,并且不需要联网的应用中,如用来产生随机密码的应用。


3. host 网络


一个 Docker 容器一般会被分配一个独立的网络命名空间,但如果启动容器时选择了 host 模式,那么这个容器将不会分配一个独立的网络命名空间,而是和宿主机共享同一个网络命名空间。


容器将使用宿主机的 IP 地址和 端口号,如图所示👇
在这里插入图片描述
下面在宿主机上运行一个网络模式为 hostWeb 应用容器,示例代码如下:
在这里插入图片描述
上述示例运行了一个命名为 test-hostNginx 容器,并指定网络模式为 host,使其在后台运行。


下面查看容器信息,示例代码如下:
在这里插入图片描述
从以上示例中,可以看出网络模式为 host


下面再查看宿主机的 80 端口状态,示例代码如下:
在这里插入图片描述
从以上示例中可以看出 80 端口被 Nginx 进程占用。


创建容器时并没有指定端口映射,容器默认使用了宿主机的 80 端口,证明在 host 模式下宿主机与容器共用端口。


下面通过 curl 工具测试容器网站是否能够被访问,示例代码如下:
在这里插入图片描述
下面是浏览器的访问测试结果,如图所示👇
在这里插入图片描述


4. bridge网络


bridge 模式下,Docker 守护进程创建了一个虚拟以太网桥 Docker0,附加在其上的网卡之间能自动转发数据包。


默认情况下,守护进程会创建一对对等接口,将其中一个接口设置为容器的 eth0 接口,另一个接口 veth 放置在宿主机的命名空间中,从而将宿主机上的所有容器都连接到这个内部网络上。


同时,守护进程还会从网桥的私有地址空间中分配一个IP地址和子网给该容器。如图所示👇
在这里插入图片描述
下面通过 brctl show 命令可以查看容器网桥信息,在这之前需要安装网桥工具管理包,否则命令不生效,示例代码如下:
在这里插入图片描述
安装完成之后,即可查看容器网桥信息,示例代码如下:
在这里插入图片描述
下面运行一个网络模式为 bridge 的容器,示例代码如下:
在这里插入图片描述
以上示例在后台运行了一个命名为 test-nginxNginx 容器,并指定它的网络模式为 bridge,将宿主机的 8000 端口映射到了容器的 80 端口。


下面接着查看容器网桥信息,示例代码如下:
在这里插入图片描述从以上示例中可以看到,网桥 Docker0 上挂载了网络接口,vethaaf8a5e 就是新创建的 Nginx 容器的虚拟网卡,名称以 veth 开头。


下面运行一个 BusyBox 容器,并设置网络模式为 bridge,查看其网卡信息,示例代码如下:
在这里插入图片描述
上述示例中,veth70a4bee 就是 BusyBox 容器的虚拟网卡,名称同样以 veth 开头。


Docker 采用 NATNetwork Address Translation,网络地址转换)方式,将容器内部服务监听的端口与宿主机的某一个端口进行映射,使宿主机以外的网络可以将网络报文发送至容器内部。


访问容器时,需要访问宿主机的 IP 及端口。


因为增加了网络层,所以会影响网络的传输效率,如图所示👇
在这里插入图片描述
在同一个服务器中,可能运行着多个业务,若这些业务都使用默认端口将会产生冲突,这时就需要容器映射不同的端口。


下面在宿主机中安装 Apache 服务,示例代码如下:
在这里插入图片描述
安装完成之后,启动 Apache 服务,示例代码如下:
在这里插入图片描述
以上示例在宿主机中启动了一个 Apache 服务。


下面通过查看端口的形式验证 Apache 是否正常运行,示例代码如下:
在这里插入图片描述
以上示例查看宿主机 80 端口,可以看到 80 端口被 Apache 占用,服务正常运行。


下面创建一个 Nginx 容器,并配置端口映射,示例代码如下:
在这里插入图片描述
以上示例在后台运行了一个命名为 test-nginxNginx 容器,并将容器 80 端口映射到宿主机的 8000 端口。


下面测试用户通过宿主机的 8000 端口是否能够访问容器中的 Nginx 服务,示例代码如下:
在这里插入图片描述
从以上示例可以看出,通过宿主机的 8000 端口可以正常访问 Nginx 容器。


下面再访问宿主机的 Apache 服务,示例代码如下:
在这里插入图片描述
从以上示例可以看出,通过宿主机 80 端口可以正常访问 Apache 服务。


有了端口映射,容器与容器、容器与宿主机的业务就不会出现冲突,保证了业务都能够被正常访问。

©著作权归作者所有:来自51CTO博客作者飞向星的客机的原创作品,如需转载,请与作者联系,否则将追究法律责任
【Docker 那些事儿】容器网络的 “梦华录”(上篇)
https://blog.51cto.com/CS50/5587850

如何获取 harbor 中所有镜像 tag 标签_余生的博客-多极客编程

整理缘由因自身在处于一个重交付的行业中,镜像的交付显得尤为重要,这样对于版本镜像的交付,因为 Harbor 的原因,需要点击到发版仓库中,然后选择发版镜像,在寻找发版tag,这样一级一级的整理,每次发版都需要耗费大量的时间整理100多个发版镜像,特此整理两个脚本进行批量获取,仅供参考。也曾参考网上的文章,但脚本写的基本没有上来就能顺利执行的,而且也没有考虑 Harbor API 中给的默认 pag

【云驻共创】分布式技术之华为云全域调度技术与实践_宇宙之一粟的漂泊之旅的博客-多极客编程

题记:分布式云原生都涉及哪些核心技术?会涉及到哪些场景的应用?怎么通过分布式云原生为企业加速?分布式云原生,是一个新的概念。使用分布式技术,将云原生实践进行整合、提供应用算力、集中供给、流量治理、和数据协同的能力,从而打造无处不在的云原生使用体验。1 华为云分布式云原生——全域调度技术与实践分享人:华为云分布式云架构师王楠楠分享目录:华为云分布式云原生技术整体介绍全域调度架构与技术分享实践案例1.

centos mysql存储引擎_白菜的博客-多极客编程

MySQL的存储引擎 存储引擎简介 1、文件系统 操作系统组织和存取数据的一种机制 文件系统是一种软件 2、文件系统类型:ext2 3 4 ,xfs 数据 不管使用什么文件系统,数据内容不会变化 不同的是,存储空间、大小、速度 3、MySQL引擎: 可以理解为,MySQL的“文件系统”,只不过功能更加强大 4、MySQL引擎功能: 除了可以提供基本的存取功能,还有更多功能事务功能

prometheus 2.37.0 新特性_耳东-erdong的博客-多极客编程

Prometheus ​​2.37.0​​​ 现在(2022.07.14)已经发布,在上个月的 ​​2.36.0​​ 之后又进行了很多的修复和改进。这次发布的版本是一个 LTS 长期支持的版本,预计会支持到 2023.01.31,详细更多的信息可以查看 ​​https://xie.infoq.cn/article/1cca0d4d5f40b31ce78352aee​​由于 OpenBSD 中缺乏统

harbor v2.0 api 无法获取projects全部数量bug复现_键客李大白的博客-多极客编程

👨🏻‍🎓博主介绍:大家好!我是李大白,一名运维容器运维工程师,热爱分享知识🌟 🌈擅长领域:云原生、数据库、自动化运维🙏🏻如果本文章对小伙伴们有帮助的话,🍭关注+👍🏻点赞+🗣评论+📦收藏!🤝如果在文章描述时如有错,恳请各位大佬指正,在此感谢!!!🍂 落叶而知秋,博闻而强识!📕 精品专栏:​​Harbor进阶实战(企业级)​​ 文章来源:《Harbor进阶实战》公众 BUG描述 在使用curl命

对docker基础镜像的思考,该不该选择alpine_微言码道的博客-多极客编程

现在,相信主流的架构都是会选择容器来进行部署,这应该当没有疑问的。 我负责的所有项目,也都会使用容器来再结合容器编排工具(Docker Swarm或K8S,依据大小而定)进行声明式部署,非常方便高效。但在这其中,我也遇到一个问题并一直再思考怎么样才是更好的。 这个问题就是: 对于容器镜像来说,究竟该不该选择alpine镜像做为基础镜像? 一) 首先,要了解这个问题的来源,为什么纠结这种事呢。 当然

数据库真的可以运行在容器里面吗?_沃趣qfusion的博客-多极客编程

作为DBA运维人员,数据库真的可以运行在容器里面吗?容器本身会不会存在安全隐患?会不会丢失数据?那就是丢了饭碗了啊!!!但是公司业务发展的速度实在太快,来了一个厂商或者应用就要求我们上线一个RDS实例,并且要求实例具备高可用、可扩展能力,随时上线或者下线,领导又要求提高物理硬件资源利用率。业务部门整天催着我们快速提供数据库服务,数据库实例多了后,运维难度和复杂度直线上升。公司IT发展战略朝着微服务

微服务性能分析|pyroscope 在 rainbond 上的实践分享_rainbond的博客-多极客编程

随着微服务体系在生产环境落地,也会伴随着一些问题出现,比如流量过大造成某个微服务应用程序的性能瓶颈、CPU利用率高、或内存泄漏等问题。要找到问题的根本原因,我们通常都会通过日志、进程再结合代码去判断根本原因。对于微服务庞大的业务,这必定会很耗时,而且也很难及时找到关键问题点。 本文将介绍一个 持续性能分析平台 Pyroscope,它能够帮助我们快速找到内存泄漏、CPU利用率高的代码。 什么是 Py

【docker 那些事儿】容器数据卷的本手_shiningstar的博客-多极客编程

@toc 🌟 前言 在生产环境中使用 Docker 容器,往往需要对数据进行持久化保存,或者多个容器需要共享数据。 这时就会使用到容器数据卷,通过容器数据卷管理容器数据是一项使用容器的基本技能。 我将会用两篇文章,来详细介绍容器数据卷的使用及其相关内容。 1. 容器数据卷概念 容器技术使用 rootfs 机制与 Namespace,构建出与宿主机隔离开的文件系统。在用户使用 Docker 容

harbor v2.0 api 无法获取projects全部数量bug复现_键客李大白的博客-多极客编程

👨🏻‍🎓博主介绍:大家好!我是李大白,一名运维容器运维工程师,热爱分享知识🌟 🌈擅长领域:云原生、数据库、自动化运维🙏🏻如果本文章对小伙伴们有帮助的话,🍭关注+👍🏻点赞+🗣评论+📦收藏!🤝如果在文章描述时如有错,恳请各位大佬指正,在此感谢!!!🍂 落叶而知秋,博闻而强识!📕 精品专栏:​​Harbor进阶实战(企业级)​​ 文章来源:《Harbor进阶实战》公众 BUG描述 在使用curl命

深度吐槽阿里云ack服务_对你无可奈何的博客-多极客编程

背景: 算是一个腾讯云深度用户,用了78年左右,由于业务需求,今年五月份开始逐步在阿里云跑了一些服务。不吹不黑。发自内心的吐槽一下阿里云的ack服务。其他服务没有多大发言权。都差不多。但是作为一个算是比较早期的kubernetes用户有必要吐槽一下阿里云的ack服务,没有办法。圈子里面没有阿里云容器组的人,像是腾讯云的tke的服务有问题可以直接找到相关人员反映,提交一下个人意见了。 深度吐槽阿里云

kubernetes部署jenkins_feyncode的博客-多极客编程

一、动态生成Slave 1.1、简介 之前我们都是在物理机或者虚拟机上部署jenkins,但是这种部署方式会有一些难点,如下: 主 Master 发生单点故障时,整个流程都不可用了 每个 Slave 的配置环境不一样,来完成不同语言的编译打包等操作,但是这些差异化的配置导致管理起来非常不方便,维护起来也是比较费劲 资源分配不均衡,有的 Slave 要运行的 job 出现排队等待,而有的 Slav