《Docker极简教程》--Docker基础--基础知识(三)

一、Namespace和Cgroups

1.1 Namespace的作用和类型

Docker 的 Namespace 是 Linux 内核提供的一种机制,用于隔离系统资源,使得容器能够拥有自己独立的视图,从而实现更高程度的隔离和安全性。Namespace 在 Docker 中扮演着至关重要的角色,它允许容器内的进程以及其他系统资源(如网络、文件系统等)在一个独立的 Namespace 中运行,彼此之间相互隔离,不会相互干扰。

以下是 Docker 中常见的 Namespace 类型及其作用:

  1. PID Namespace(进程 ID Namespace):
    • 作用:为容器内的进程提供一个独立的进程 ID 空间,使得容器内的进程看到的进程 ID 从 1 开始,而不受宿主机或其他容器中进程 ID 的影响。这种隔离使得容器内的进程无法感知到宿主机或其他容器的进程。
  2. Network Namespace(网络 Namespace):
    • 作用:提供独立的网络栈,使得容器内的网络资源(如网络接口、IP 地址、路由表等)与宿主机及其他容器的网络资源相互隔离,每个容器都拥有自己独立的网络环境,从而实现网络隔离。
  3. Mount Namespace(挂载 Namespace):
    • 作用:使得容器拥有独立的文件系统视图,容器内的文件操作不会影响到宿主机或其他容器的文件系统。这种隔离保证了容器内文件系统的独立性。
  4. UTS Namespace(UTS Namespace):
    • 作用:提供容器内部的主机名和域名的隔离,使得容器内部可以拥有自己独立的主机名和域名信息,与宿主机及其他容器相互隔离。
  5. IPC Namespace(IPC Namespace):
    • 作用:隔离容器内部的进程间通信(Inter-Process Communication),使得容器内的进程无法直接与宿主机或其他容器中的进程进行通信。
  6. User Namespace(用户 Namespace):
    • 作用:允许容器内的进程拥有独立的用户和用户组标识,容器内的进程可以以不同于宿主机用户的身份运行,提供额外的安全性。

通过组合使用这些 Namespace 类型,Docker 实现了容器的隔离,使得容器内的进程和资源得以隔离运行,从而保证了容器的安全性、独立性和互不干扰性。

1.2 Cgroups的作用和管理资源

Cgroups(Control Groups)是 Linux 内核提供的一种机制,用于限制、跟踪和分配系统资源,如 CPU、内存、磁盘 I/O 等,以及控制进程组的资源使用情况。Cgroups 允许系统管理员将一组进程组织起来,并对它们的资源使用进行限制和管理,从而实现资源隔离、优先级调整、资源配额等功能。
Cgroups 的主要作用包括:

  1. 资源限制和管理:Cgroups 允许管理员为进程或进程组分配特定的资源限制,如 CPU 使用时间、内存量、磁盘 I/O 带宽等。这样可以确保系统中不同的进程或组之间不会互相干扰,从而提高系统的稳定性和可靠性。
  2. 优先级调整:通过 Cgroups,管理员可以为不同的进程或进程组分配不同的资源优先级,从而确保重要任务获得足够的资源,并且可以根据需求动态调整资源分配策略。
  3. 资源配额:Cgroups 允许管理员为不同的进程或进程组设置资源配额,确保系统中的资源分配合理,防止某些进程占用过多的资源导致其他进程无法正常运行。
  4. 资源统计和监控:Cgroups 可以跟踪和记录进程或进程组的资源使用情况,包括 CPU 使用时间、内存消耗、磁盘 I/O 等,管理员可以通过这些统计信息了解系统资源的使用情况,进行资源优化和调整。

Cgroups 可以通过在文件系统中的特定目录下创建和配置相应的控制组来进行资源管理。在使用 Docker 等容器技术时,Cgroups 也被广泛用于限制和管理容器的资源使用,确保容器之间资源的隔离和公平分配。

二、镜像的加载和运行过程

2.1 镜像的拉取和保存

镜像的拉取和保存是 Docker 中常见的操作,它们允许用户从远程仓库获取镜像以及将本地的镜像保存为一个文件。下面我将分别介绍镜像的拉取和保存过程:

  1. 镜像的拉取:

    • 从远程仓库拉取镜像

      • 使用 docker pull 命令从 Docker Hub 或其他注册表(Registry)拉取镜像。例如:
        docker pull ubuntu:latest
        
      • 这将从 Docker Hub 上获取名为 ubuntu 的镜像的最新版本。
    • 指定镜像标签

      • 可以通过指定镜像的标签来选择特定版本或者标记的镜像,例如 ubuntu:20.04 表示拉取 Ubuntu 20.04 版本的镜像。
    • 等待镜像拉取完成

      • Docker 将下载镜像的各个层(layers),然后组装为完整的镜像。等待过程取决于网络速度和镜像大小。
  2. 镜像的保存:

    • 保存本地镜像

      • 使用 docker save 命令保存本地镜像为一个文件。例如:
        docker save -o ubuntu_latest.tar ubuntu:latest
        
      • 这将保存名为 ubuntu:latest 的镜像为 ubuntu_latest.tar 文件。
    • 指定保存的镜像

      • 可以根据需要选择要保存的特定镜像,如果需要保存多个镜像,可以一次性指定多个镜像。例如:
        docker save -o images.tar ubuntu:latest nginx:latest
        
      • 这将同时保存 ubuntu:latestnginx:latest 两个镜像为 images.tar 文件。
    • 等待保存完成

      • Docker 将把指定的镜像保存为一个 tar 文件,该过程的时间取决于镜像的大小和系统性能。

以上是关于 Docker 镜像的拉取和保存的基本操作。拉取和保存镜像是日常 Docker 使用中常见的任务,它们可以帮助用户轻松地获取和管理镜像。

2.2 容器的启动和执行流程

容器的启动和执行流程包括以下几个关键步骤:

  1. 镜像拉取或加载
    • 如果容器所使用的镜像尚未在本地存在,Docker 会首先尝试从远程仓库(如 Docker Hub)拉取镜像。如果镜像已经在本地存在,则会直接使用本地的镜像。
  2. 创建容器
    • Docker 使用镜像创建一个新的容器实例。在创建容器时,Docker 将应用容器的配置,如网络设置、挂载点、环境变量等。
  3. 设置 Namespace 和 Cgroups
    • Docker 使用 Linux 的 Namespace 和 Cgroups 功能,为容器提供隔离的运行环境。这包括 PID Namespace、Network Namespace、Mount Namespace、UTS Namespace、IPC Namespace、以及针对资源限制的 Cgroups。
  4. 启动容器进程
    • Docker 在容器内启动主要进程。这通常是容器的主应用程序,它可能是一个命令行工具、一个服务、一个网站等。Docker 使用容器的启动命令来运行这个主要进程。
  5. 执行容器中的任务
    • 一旦容器启动并运行主要进程,它开始执行容器中的任务。这可能包括处理请求、执行作业、提供服务等。
  6. 监控和管理容器
    • Docker 守护进程会监控容器的运行状态,并根据需要采取措施。例如,如果容器进程异常退出,Docker 可以自动重启容器。
  7. 收集容器日志
    • Docker 收集容器的标准输出和标准错误输出,并将它们转发到 Docker 守护进程,然后可能进一步记录到日志文件中。
  8. 容器退出
    • 当容器的主要进程完成任务或者发生错误时,容器将退出。Docker 可以根据容器的退出状态进行适当的处理,如重新启动、删除等。

这些步骤构成了容器的启动和执行流程。Docker 提供了强大的管理工具和机制,使得容器的创建、运行和管理变得简单而灵活。

三、数据卷和网络

3.1 数据卷的定义和使用

在 Docker 中,数据卷(Data Volume)是一种用于持久化数据的特殊文件或目录,可以绕过容器的文件系统,使得数据可以在容器之间共享、传递,并且能够在容器生命周期内保持持久性。数据卷可以存储数据库文件、配置文件、日志文件等应用程序数据,而不受容器的生命周期限制。

  1. 定义数据卷:
    在 Docker 中,数据卷可以通过以下几种方式定义:

    • 命令行定义
      使用 -v--volume 参数在容器运行时指定数据卷,例如:
      docker run -v /host/path:/container/path ...
      
    • Dockerfile 定义
      在 Dockerfile 中使用 VOLUME 指令定义数据卷,例如:
      VOLUME /container/path
      
    • 匿名卷定义
      在容器启动时,可以使用 -v--volume 参数直接指定一个匿名卷,Docker 将自动生成一个随机的卷名称。
  2. 使用数据卷:
    一旦数据卷被定义,容器就可以通过挂载数据卷来使用它。常见的用法包括:

    • 挂载到容器中的路径
      使用 -v--volume 参数将数据卷挂载到容器中的指定路径,例如:

      docker run -v /host/path:/container/path ...
      
    • 挂载到容器中的命名卷
      如果已经在容器中定义了数据卷,可以直接通过卷的名称来挂载,例如:

      docker run --volume my_volume:/container/path ...
      
    • 多个数据卷挂载
      容器可以挂载多个数据卷,每个数据卷都可以挂载到容器中的不同路径,例如:

      docker run -v /host/path1:/container/path1 -v /host/path2:/container/path2 ...
      
    • 容器间数据共享
      多个容器可以共享同一个数据卷,从而实现数据的共享和传递。

通过使用数据卷,Docker 可以更加灵活地管理容器中的数据,并且使得数据在容器之间的共享和传递变得更加简单。数据卷的使用还可以提高容器的可移植性和可维护性,使得容器在不同的环境中更容易部署和运行。

3.2 网络的配置和通信

在 Docker 中,网络的配置和通信是容器化应用中至关重要的一部分。下面是关于 Docker 网络的配置和通信的基本概念和方法:

  1. 网络配置:

    • 默认网络
      • Docker 默认提供了三种网络驱动:bridge、host 和 none。其中,bridge 是默认的网络驱动,会为每个容器分配一个独立的 IP 地址,并且容器可以通过容器名称进行通信。
    • 自定义网络
      • Docker 允许创建自定义网络,用户可以使用自定义网络来隔离容器、控制容器的通信以及提供更高级的网络功能。用户可以使用 docker network create 命令创建自定义网络。
    • 连接到网络
      • 容器可以连接到一个或多个网络。在创建容器时,可以使用 --network 参数指定容器连接的网络。
  2. 网络通信:

    • 容器间通信
      • 连接到同一个网络的容器可以直接使用容器名称进行通信,无需知道对方的 IP 地址。
    • 主机和容器间通信
      • 如果容器连接到 bridge 网络,它可以通过主机的 IP 地址进行通信。如果容器连接到自定义网络,主机和容器可以使用容器的名称进行通信。
    • 跨主机通信
      • 如果容器连接到 overlay 网络(适用于 Swarm mode),容器可以在多个主机上进行通信。Swarm mode 提供了内置的 DNS 解析服务,使得容器可以通过服务名称进行通信。
    • 端口映射
      • 可以使用 -p--publish 参数将容器的端口映射到主机的端口,从而允许外部网络访问容器提供的服务。
    • 环回地址通信
      • 容器可以使用环回地址(127.0.0.1)与自身内部的服务进行通信。

通过合适的网络配置,容器可以在不同的环境中进行通信,提供服务,并与其他容器或主机进行交互。网络通信的灵活性和可配置性使得 Docker 在构建分布式系统和微服务架构时非常有用。

四、总结

本文介绍了 Docker 中的 Namespace 和 Cgroups,它们是 Linux 内核提供的机制,用于实现容器的隔离和资源管理。Namespace 提供了多种类型的隔离,如 PID、Network、Mount、UTS、IPC 和 User Namespace,使得容器能够拥有独立的运行环境。Cgroups 则用于管理容器的资源使用,包括 CPU、内存、磁盘等。此外,还介绍了镜像的拉取和保存过程,以及容器的启动和执行流程。最后,讨论了数据卷和网络的配置与使用,它们为容器提供了数据持久化和网络通信的功能。综合而言,Docker 提供了强大的功能和灵活的配置选项,使得容器化应用的开发、部署和管理变得更加简单和高效。

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

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

相关文章

初识C语言·编译与链接

1 翻译环境和运行环境 C语言标准ANSI C 实现C语言代码的时候 一般需要经过两种环境,一是翻译环境,二是运行环境,计算机能识别的是二进制的指令,人写完代码后通过翻译环境,使代码变成计算机能读懂的可执行的机器指令&a…

机器人工具箱学习(一)

一、机器人工具箱介绍 机器人工具箱是由来自昆士兰科技大学的教授Peter Corke开发的,被广泛用于机器人进行仿真(主要是串联机器人)。该工具箱支持机器人一些基本算法的功能,例如三维坐标中的方向表示,运动学、动力学模…

极限方法大总结【高数笔记】

【方法步骤】 分几步?又有几个小步骤? 【不同类型的极限】 不同类型极限的方法又有哪些步骤? 不同类型极限的方法有哪些前提条件? 个别类型极限方法的技巧有哪些?

『运维备忘录』之 Yum 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

Droppy教程 | 轻量文件共享

文件共享成为了日常工作的重要组成部分。特别是对于那些需要快速、高效分享大文件的人来说,拥有一个简单可靠,且易于管理的平台至关重要。 项目地址:https://github.com/droppyjs/droppy 一、测试环境 uname -i # x86_64 docker -v # Docke…

年底个人总结

年底个人总结 前言:又到了年底,在游戏行业工作了接近10年,想想也应该把自己做过的东西做一个总结。 从14年在北京毕业,懵懂的我在机缘巧合下遇到了陈g,我行业的领路人,在他的带领下我进入到了游戏行业。 当…

[office] 在往Excel中录入数据时 #微信#学习方法#职场发展

在往Excel中录入数据时 在往Excel中录入数据时,有时会遇到大量的重复数据,比如有这么一个工作表,第一列显示任务名,第二列显示任务执行者,第三列显示执行者的性别,其中任务执行者为固定的几个人交替执行&am…

Bootstrap5 导航组件和面包屑

Bootstrap5 导航组件和面包屑 Bootstrap5 提供了一种简单快捷的方法来创建基本导航,它提供了非常灵活和优雅的选项卡和Pills等组件。 Bootstrap5 的所有导航组件,包括选项卡和Pills,都通过基本的 .nav 类共享相同的基本标记和样式。 使用 B…

深入探究:JSONCPP库的使用与原理解析

君子不器 🚀JsonCPP开源项目直达链接 文章目录 简介Json示例小结 JsoncppJson::Value序列化Json::Writer 类Json::FastWriter 类Json::StyledWriter 类Json::StreamWriter 类Json::StreamWriterBuilder 类示例 反序列化Json::Reader 类Json::CharReader 类Json::Ch…

【计算机二级考试C语言】C可变参数

C 可变参数 有时,您可能会碰到这样的情况,您希望函数带有可变数量的参数,而不是预定义数量的参数。 C 语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体的需求接受可变数量的参数。 声明方式为: int func_name(int arg1, ...); 其中,省略号 ... …

linux一键换源

使用方法 - LinuxMirrors 使用方法 一键执行命令# 中国大陆&#xff08;默认&#xff09; 海外地区 bash <(curl -sSL https://linuxmirrors.cn/main.sh)-----------------------------------| ⡇ ⠄ ⣀⡀ ⡀⢀ ⡀⢀ ⡷⢾ ⠄ ⡀⣀ ⡀⣀ ⢀⡀ ⡀⣀ ⢀⣀ || ⠧⠤ ⠇ ⠇⠸ …

2024年考PMP还有什么用?

PMP 是项目管理专业人士资格认证的意思&#xff0c;也是项目管理领域通用的证书&#xff0c; 做项目的基本都会去考。 要说 PMP 有啥作用&#xff1f; 个人感觉 PMP 证书更多的是跳槽、转行的敲门砖的作用&#xff0c;因为现在很多公司都要 PMP 证书&#xff0c;有了可以加分…

containerd中文翻译系列(五)客户端选项

containerd 客户端的构建是为了方便用户进行扩展。 我们的目标是&#xff0c;调用的执行流程在不同的实现中保持不变&#xff0c;同时编写 Opts 来扩展功能。 为了实现这一目标&#xff0c;我们依赖于 Go 中的 Opts 模式。 方法调用 对于客户端软件包中的许多函数和方法&…

工厂方法模式(Factory Method Pattern)

原文地址:https://jaune162.blog/design-pattern/factory-method-pattern/ 概述 工厂方法模式(Factory Method Pattern)是一个对象创建型模式。 定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method使一个类的实例化延迟到其子类。 – 《设计模式:可复…

SpringBoot 拦截器Intercepto的创建与基本使用

介绍 拦截器和过滤器的功能都差不多&#xff0c;拦截器是SpringBoot的&#xff0c;而且过滤器是Servlet的 SpringBoot过滤器 拦截器-过滤器 执行顺序 发起请求-》过滤器-》拦截器-》接口 创建拦截器 实现HandlerInterceptor 的接口&#xff0c;并且实现他都三个方法 preHan…

Leetcode21:合并两个有序链表

一、题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[]输入&#…

【芯片设计- RTL 数字逻辑设计入门 8 -- 四选一多路器】

文章目录 四选一多路输出器verilog case 语句verilog 代码testbench 代码仿真波形 问题小结 四选一多路输出器 制作一个四选一的多路选择器&#xff0c;要求输出定义上为线网类型 状态转换&#xff1a; d0 00 d1 01 d2 10 d3 11verilog case 语句 case(express…

亚马逊认证考试系列 - 知识点 - 安全组介绍

第一部分&#xff1a;AWS简介 Amazon Web Services&#xff08;AWS&#xff09;是全球领先的云计算服务提供商&#xff0c;为个人、企业和政府机构提供广泛的云服务解决方案。AWS的服务包括计算、存储、数据库、分析、机器学习、人工智能、物联网、安全和企业应用等领域。AW…

每日一题 力扣LCP30.魔塔游戏

题目描述&#xff1a; 小扣当前位于魔塔游戏第一层&#xff0c;共有 N 个房间&#xff0c;编号为 0 ~ N-1。每个房间的补血道具/怪物对于血量影响记于数组 nums&#xff0c;其中正数表示道具补血数值&#xff0c;即血量增加对应数值&#xff1b;负数表示怪物造成伤害值&#x…

【Java 数据结构】反射

反射 1 定义2 用途(了解)3 反射基本信息4 反射相关的类&#xff08;重要&#xff09;4.1 Class类(反射机制的起源 )4.1.1 Class类中的相关方法(方法的使用方法在后边的示例当中) 4.2 反射示例4.2.1 获得Class对象的三种方式4.2.2 反射的使用 5、反射优点和缺点 1 定义 Java的反…