首页 > 其他分享 >支持Docker的底层技术(Namespaces?CGroups?UnionFS?Docker 架构?)(二)

支持Docker的底层技术(Namespaces?CGroups?UnionFS?Docker 架构?)(二)

时间:2022-12-27 09:45:20浏览次数:67  
标签:容器 CGroups Namespaces 隔离 CGroup 进程 Docker 客户端

上一篇介绍了Docker基本概念,这一篇介绍下支持Docker的底层技术

Docker 本质就是宿主机的一个特殊进程,Docker 是通过 namespace 实现资源隔离,通过cgroup 实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配 500g 并不是实际占用物理磁盘 500g)

一、Namespaces

命名空间 (namespaces) 是 Linux 为我们提供的用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法。在日常使用个人 PC 时,我们并没有运行多个完全分离的服务器的需求,但是如果我们在服务器上启动了多个服务,这些服务其实会相互影响的,每一个服务都能看到其他服务的进程,也可以访问宿主机器上的任意文件,一旦服务器上的某一个服务被入侵,那么入侵者就能够访问当前机器上的所有服务和文件,这是我们不愿意看到的,我们更希望运行在同一台机器上的不同服务能做到完全隔离,就像运行在多台不同的机器上一样。而 Docker 其实就通过 Linux 的 Namespaces 技术来实现的对不同的容器进行隔离。

当我们运行(docker run 或者 docker start)一个 Docker 容器时,Docker 会为该容器设置一系列的 namespaces,这些 namespaces 提供了一层隔离,容器的各个方面都在单独的 namespace 中运行,并且对其的访问仅限于该 namespace。
Docker 在 Linux 上使用以下几个命名空间(上面说的各个方面):

pid namespace:用于进程隔离(PID:进程ID)
net namespace:管理网络接口(NET:网络)
ipc namespace:管理对 IPC 资源的访问(IPC:进程间通信(信号量、消息队列和共享内存))
mnt namespace:管理文件系统挂载点(MNT:挂载)
uts namespace:隔离主机名和域名
user namespace:隔离用户和用户组(3.8以后的内核才支持)

二、CGroups

我们通过 Linux 的 namespaces 技术为新创建的进程隔离了文件系统、网络、进程等资源,但是 namespaces 并不能够为我们提供物理资源上的隔离,比如 CPU、内存、IO 或者网络带宽等,所以如果我们运行多个容器的话,则容器之间就会抢占资源互相影响了,所以对容器资源的使用进行限制就非常重要了,而 Control Groups(CGroups)技术就能够隔离宿主机上的物理资源。CGroups 由 7 个主要的子系统组成:分别是 cpuset、cpu、cpuacct、blkio、devices、freezer、memory,不同类型资源的分配和管理是由各个 CGroup 子系统负责完成的。

CGroup 简介
在 CGroup 中,所有的任务就是一个系统的一个进程,而 CGroup 就是一组按照某种标准划分的进程,在 CGroup 这种机制中,所有的资源控制都是以 CGroup 作为单位实现的,每一个进程都可以随时加入一个 CGroup 也可以随时退出一个 CGroup。

CGroup 具有以下几个特点:       

  • CGroup 的 API 以一个伪文件系统(/sys/fs/cgroup/)的实现方式,用户的程序可以通过文件系统实现 CGroup 的组件管理
  • CGroup 的组件管理操作单元可以细粒度到线程级别,用户可以创建和销毁 CGroup,从而实现资源载分配和再利用
  • 所有资源管理的功能都以子系统(cpu、cpuset 这些)的方式实现,接口统一子任务创建之初与其父任务处于同一个 CGroup 的控制组

另外 CGroup 具有四大功能:        

  • 资源限制:可以对任务使用的资源总额进行限制
  • 优先级分配:通过分配的 cpu 时间片数量以及磁盘 IO 带宽大小等,实际上相当于控制了任务运行优先级
  • 资源统计:可以统计系统的资源使用量,如 cpu 时长,内存用量等
  • 任务控制:cgroup 可以对任务执行挂起、恢复等操作

三、UnionFS

Linux 的命名空间和控制组分别解决了不同资源隔离的问题,前者解决了进程、网络以及文件系统的隔离,后者实现了 CPU、内存等资源的隔离,但是在 Docker 中还有另一个非常重要的问题需要解决 - 也就是镜像。
镜像到底是什么,它又是如何组成和组织的呢?而这其中最重要的概念就是镜像层(Layers)(如下图)的概念,而镜像层依赖于一系列的底层技术,比如文件系统(filesystems)、写时复制(copy-on-write)、联合挂载(union mounts)等。

Docker 镜像是由一系列的层组成的,每层代表 Dockerfile 中的一条指令,比如下面的 Dockerfile 文件:

FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py

Dockerfile 介绍
Dockerfile 是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。Dockerfile 是我们用来构建 Docker 镜像的一个说明文档,也是我们学习的重点,必须要要掌握如何编写 Dockerfile。

这里的 Dockerfile 包含4条命令,其中每一行就创建了一层,FROM 语句从 ubuntu:18.04 这个基础镜像创建一个层开始,COPY 命令从 Docker 客户端的当前目录添加一些新的文件,RUN 指令使用 make 命令构建应用,最后一层指定在容器中运行什么命令。

镜像就是由这些层一层一层堆叠起来的,镜像中的这些层都是只读的,当我们运行容器的时候,就可以在这些基础层之上添加新的可写层,也就是我们通常说的容器层,对于运行中的容器所做的所有更改(比如写入新文件、修改现有文件、删除文件)都将写入这个容器层。

四、Docker架构

Docker 使用 C/S (客户端/服务器)体系的架构,Docker 客户端与 Docker 守护进程(Dockerd)通信,Docker 守护进程负责构建,运行和分发 Docker 容器。Docker 客户端和守护进程可以在同一个系统上运行,也可以将 Docker 客户端连接到远程 Docker 守护进程。Docker 客户端和守护进程使用 REST API 通过 UNIX 套接字或网络接口进行通信。

图片来自https://docs.docker.com/get-started/overview/

  • Docker 守护进程
    Docker 守护进程 ( dockerd) 侦听 Docker API 请求并管理 Docker 对象,例如图像、容器、网络和卷。守护进程还可以与其他守护进程通信以管理 Docker 服务。

  • Docker 客户端
    Docker 客户端 ( docker) 是许多 Docker 用户与 Docker 交互的主要方式。当您使用诸如docker run之类的命令时,客户端会将这些命令发送到dockerd,由后者执行。该docker命令使用 Docker API。Docker 客户端可以与多个守护进程通信。

  • Docker 桌面
    Docker Desktop 是一个易于安装的应用程序,适用于 Mac、Windows 或 Linux 环境,使您能够构建和共享容器化应用程序和微服务。Docker Desktop 包括 Docker 守护程序 ( dockerd)、Docker 客户端 ( docker)、Docker Compose、Docker Content Trust、Kubernetes 和 Credential Helper。有关详细信息,请参阅Docker 桌面。

  • Docker 注册表
    Docker注册表存储 Docker 映像。Docker Hub 是一个任何人都可以使用的公共注册表,Docker 默认配置为在 Docker Hub 上查找图像。您甚至可以运行自己的私有注册表。

当您使用docker pull或docker run命令时,所需的图像将从您配置的注册表中提取。当您使用该docker push命令时,您的图像将被推送到您配置的注册表。

  • Docker 对象
    当您使用 Docker 时,您正在创建和使用图像、容器、网络、卷、插件和其他对象。本节是对其中一些对象的简要概述。

五、Docker底层技术

Docker 是用Go编程语言编写的,并利用 Linux 内核的几个特性来提供其功能。Docker 使用一种称为容器namespaces的技术来提供隔离的工作空间。当您运行容器时,Docker 会为该容器创建一组名称空间。
这些命名空间提供了一层隔离。容器的每个方面都在单独的命名空间中运行,并且其访问仅限于该命名空间。

下一篇将介绍支持Docker安装
(转发请注明出处:http://www.cnblogs.com/zhangyongli2011/ 如发现有错,请留言,谢谢)

标签:容器,CGroups,Namespaces,隔离,CGroup,进程,Docker,客户端
From: https://www.cnblogs.com/zhangyongli2011/p/17007349.html

相关文章

  • Docker基本概念(LXC?镜像、容器、仓库是什么?容器和虚拟机又是什么?)(一)
    学习Docker前,我们有必要了解下Docker的前生LXC(LinuxContainer)。一、LXC介绍LXC可以提供轻量级的虚拟化,用来隔离进程和资源,和我们传统观念中的全虚拟化完全不一样,非常轻......
  • docker 常用命令大全
    参考地址:https://blog.csdn.net/leilei1366615/article/details/106267225文章目录(一)docker基础命令(二)docker镜像命令(三)docker容器命令(四)自己提交一个镜像(五)docker运......
  • Docker容器与Docker网络模式
    一、Docker容器操作1、容器创建将镜像加载到容器的过程。新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器1234567格式......
  • Docker资源控制及数据管理
    一、CPU资源控制1、cgroups概述是一个非常强大的linux内核工具,他不仅可以限制被namespace隔离起来的资源,还可以为资源设置权重、计算使用量、操控进程启停等等,所以cgrou......
  • ubuntu 22.04安装docker后无法启动的问题
    在安装Docker后无法启动,查看Docker的日志vim/var/log/docker.log显示如下的错误time="2022-12-27T00:36:54.741331300+08:00"level=infomsg="stoppingeventstreamfo......
  • mongo docker compose
     49dSsULIAv6NiP8hdqqbapRTHVx9BRYU4VVakN9A4FJWV0KufqEm/UoTUvn9Z4egFRP7iHXF6Qiou5MK2Ak76zRBU7MOIVCl0DIhrPoQN/mJFW4XaP/N1m6ElblMuqqik4jUWWXxXiCZFlaxJHPEyH1oi......
  • 详解如何进入、退出docker容器的方法
    参考地址:https://blog.csdn.net/qq_46416934/article/details/1244909781启动docker服务首先需要知道启动docker服务是:servicedockerstart或者:systemctlstartdoc......
  • docker高级篇:实战-自己开发的微服务怎么在docker上面运行?
    通过前面的一系列学习,我们已经知道怎么制作dockerfile了。那么,本篇文章,咱们就把自己写的springboot的demo项目,部署在docker上面。案例目标:我们自己开发的微服务怎么在do......
  • Docker操作镜像、容器
                                                         ......
  • 使用docker-compose配置两个wordpress网站时遇到的问题
    考试前两天想给女票也搞个博客,单独测试好好的,一起部署怎么都上不去,关键是理论上完全没问题。。最后调了半天(真·半天)发现是天杀的docker-compose必须mount与nginx一样的路......