Docker容器实战之镜像与容器的工作原理

目录
  • 一. bootfs和rootfs
  • 二. 镜像结构
  • 三. 容器层
  • 四. 联合文件系统​

一. bootfs和rootfs

通常而言,Linux的操作系统由两类文件系统组成:bootfs(boot file system)和rootfs(root file system),它们分别对应着系统内核与根目录文件。bootfs层主要为系统内核文件,这层的内容是无法修改的。当我们的系统在启动时会加载bootfs,当加载完成后整个内核都会存到内存中,然后系统会将bootfs卸载掉。而rootfs层则包含了系统中常见的目录和文件,如/bin,/etc,/proc等等。

Docker的镜像技术可以使用宿主机的bootfs层,这使得镜像本身只需要封装rootfs层所需要的文件和工具即可。因此,镜像可以根据需要进行定制化封装,减少占用的存储空间,如部分极精简的镜像只有几MB大小。

在不同Linux发行版本中,它们之间的主要区别在于rootfs层,比如ubuntu使用apt管理软件,而Centos使用yum方式。而在内核层面,两者的差别并不大。因此,我们可以在一台主机上同时支持不同Linux系统的镜像而不出现报错,如同时启动Centos和Ubuntu的容器。

但需要注意的是,不管容器使用什么系统的镜像,实际的内核版本都与镜像无关,都为宿主机的内核。如ubuntu16.04 的容器跑在Centos7.x的宿主机上,虽然ubuntu的内核版本是4.x.x,但我们在容器中会看到内核为centos 7.x 的内核,即 3.x.x。如果是对内核版本的要求的程序,可能会因此受到影响。

二. 镜像结构

Docker镜像采用分层的结构,由一些松耦合的只读层堆叠而成,并对外展示为一个统一的对象。所有的镜像都开始于一个基础的镜像层,当我们进行修改或内容添加时,会在镜像层上面创建新的一层。

最底层通常为基础层镜像,然后再层层叠加上来,比如安装一个Python软件,此时会在基础层上面添加一个新的层,上面包含了我们所安装的Python程序。

镜像做为所有镜像层的组合,如果镜像中有相同路径的文件,则上层镜像会覆盖下层镜像的内容,最终展示为所有层的数据汇总。

如下图所示,由于第二层的文件2与第一层具有相同的文件路径,则镜像将以第二层的文件2内容进行展示,第一层只有文件1会被显示。

我们再来回顾一下前面镜像拉取时的输出内容,Pull complete结尾的每一行代表镜像中某个被拉取的层,每个层级通过一个唯一的ID进行标识。

$ docker pull nginx:1.20
1.20: Pulling from library/nginx
5eb5b503b376: Pull complete
cdfeb356c029: Pull complete
d86da7454448: Pull complete
7976249980ef: Pull complete
8f66aa6726b2: Pull complete
c004cabebe76: Pull complete
Digest: sha256:02923d65cde08a49380ab3f3dd2f8f90aa51fa2bd358bd85f89345848f6e6623
Status: Downloaded newer image for nginx:1.20
docker.io/library/nginx:1.20

镜像层的松耦合代表着它不属于某个镜像独有,当不同镜像包含相同的层时,系统只会存储该层的一份内容,这是Docker镜像的重要特点,这样的好处有利于减少存储空间的占用。如下所示,当我们拉取另一个版本的Nginx镜像时,其中ID号为5eb5b503b376的层已经存在,则会显示为Already exists,直接使用此镜像层。

$ docker pull nginx:1.21
1.21: Pulling from library/nginx
5eb5b503b376: Already exists
1ae07ab881bd: Pull complete
78091884b7be: Pull complete
091c283c6a66: Pull complete
55de5851019b: Pull complete
b559bad762be: Pull complete
Digest: sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767
Status: Downloaded newer image for nginx:1.21
docker.io/library/nginx:1.21

三. 容器层

我们前面说到镜像层是只读模板,那么当我们使用镜像生成容器时,为什么又能写入数据呢?这个问题的答案涉及到一个概念:容器层。

当容器启动时,会有一个新的可写层被加载到镜像的顶部,这一层通常被称为容器层。所有对容器的修改都会发生在容器层,只有容器层是可写入的,容器层以下的镜像层都是只读的。

当我们对容器进行操作时,底层的工作原理如下:

读取文件:当容器需要读取文件时,会先在容器层寻找,如果没有发现,则会从最上层的镜像层往下寻找,当找到文件后读取到内存使用。

增加文件:当增加文件时,文件会直接写到最上面容器层,不会影响到镜像层内容。所以,当我们将容器删除时,容器中的文件也会随着消失。

修改文件:此时,如果该文件是在容器层的,则会直接修改。否则的话,Docker会从上往下依次在各层镜像中查找此文件 ,当找到后将其复制到容器层中,并进行修改。这被称为容器的写时复制特性(Copy-on-Write),这个技术保证了我们对容器的修改不会影响到底层的镜像,也实现了一个镜像可以被多个容器共用。

删除文件:当我们需要删除文件时,Docker也是由上往下寻找该文件 ,如果在容器层的文件会被直接删除,而在镜像层的文件则会被标记,此时在容器将不会再出现此文件,但镜像中的文件并不会做更改。

四. 联合文件系统​

关于镜像与容器功能的实现,依赖其使用了联合文件系统(UnionFS)技术,这是一种分层、轻量级并且高性能的文件系统。Docker 目前支持的联合文件系统包括 ​​OverlayFS​​​, ​​AUFS​​​, ​​VFS​​​ ​​Device Mapper等​​,而默认的存储驱动为Overlay2。

到此这篇关于Docker容器实战之镜像与容器的工作原理的文章就介绍到这了,更多相关Docker 镜像与容器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Docker通过容器生成镜像提交DockerCommit详解

    目录 在本地创建一个容器后,可以依据这个容器创建本地镜像,并可把这个镜像推送到Docker hub中. 根据镜像启动容器:docker run 根据启动的容器创建新的镜像:docker commit 将由容器生成的镜像push到镜像仓库docker hub push失败之后,需要根据镜像仓库的路径打tag,然后提交到镜像仓库: 在另一台服务器下载上图push到镜像仓库的新镜像 参考文章:通过容器提交镜像DockerCommit及推送镜像DockerPush 以上就是Docker通过容器生成镜像提

  • Docker配置本地镜像与容器的存储位置

    使用find命令找到大于指定大小的文件: find / -type f -size +10G 排除某个目录 find / -path "/media/xww" -type f -size +10G 修改Docker本地镜像与容器的存储位置的方法 方法一.软链接 默认情况下Docker的存放位置为:/var/lib/docker 可以通过下面命令查看具体位置: sudo docker info | grep "Docker Root Dir" 解决这个问题,最直接的方

  • docker容器详细讲解如何精简镜像减小体积

    目录 一.减少镜像层数 1.指令合并 2.多阶段构建 3.启用squash特性 二.缩减容量 1. 选择小的基础镜像 2.上下文管理 3.及时清理下载 精简镜像我们可以从两个方面切入: 减少镜像层数 缩减容量 一.减少镜像层数 1.指令合并 Dockerfile 中的每条指令都将创建一个层,不过查看官方文档中最佳实践有这样一句话: In older versions of Docker, it was important that you minimized the number of laye

  • Docker容器实战之镜像仓库

    目录 一.  镜像仓库 1. 账号注册 2. 创建仓库 二. 上传镜像 一.  镜像仓库 Registry是Docker公司的一项创新,它提供了存放镜像的仓库服务.在构建好镜像后,我们通常会将镜像上传到Registry服务器上进行保存.这样可以保证不会因本机故障而导致镜像丢失,同时,其他机器也能很方便地通过网络方式下载. Docker Hub即为Docker官方的Registry服务器,它的访问地址为 https://hub.docker.com .我们总是习惯将Registry称为仓库,但事实

  • IDEA远程管理docker镜像及容器服务的实现

    目录 一.开启docker远程访问服务 二.IDEA安装Dokcer插件 使用命令行的方式管理服务器镜像及容器是运维人员最常用的方式,但是有的时候我们不得不远程操作docker或者是面向对docker并不熟悉的技术人员提供能力(配置管理员.测试人员),这种情况下图形界面就有必要了.提供图形界面的方式来操作docker也的确是比使用命令行的方式更直接.更简单.所以很多的厂商基于docker RESTful API向用户提供了用于docker容器镜像管理的用户图形界面,Portainer.Docke

  • skywalking容器化部署docker镜像构建k8s从测试到可用

    目录 前言碎语 docker镜像构建 application.yml webapp.yml setApplicationEnv.sh setWebAppEnv.sh Kubernetes中部署 文末结语 前言碎语 skywalking是个非常不错的apm产品,但是在使用过程中有个非常蛋疼的问题,在基于es的存储情况下,es的数据一有问题,就会导致整个skywalking web ui服务不可用,然后需要agent端一个服务一个服务的停用,然后服务重新部署后好,全部走一遍.这种问题同样也会存在sk

  • Docker容器实战之镜像与容器的工作原理

    目录 一. bootfs和rootfs 二. 镜像结构 三. 容器层 四. 联合文件系统​ 一. bootfs和rootfs 通常而言,Linux的操作系统由两类文件系统组成:bootfs(boot file system)和rootfs(root file system),它们分别对应着系统内核与根目录文件.bootfs层主要为系统内核文件,这层的内容是无法修改的.当我们的系统在启动时会加载bootfs,当加载完成后整个内核都会存到内存中,然后系统会将bootfs卸载掉.而rootfs层则包含

  • docker实践之从新镜像启动容器报错解决

    按照书中所写,输入以下命令: $ sudo docker run -d -p 80 --name static_web yorkz0909/static_web \ nginx -g "daemon off;" 来启动新的容器,容器貌似启动了,但是会报以下错误: 35b5d1f047a51373ca71190b0eed504ba0540c32427f4637b967c7b4ad7fa217 docker: Error response from daemon: invalid head

  • 在Centos7 中更改Docker默认镜像和容器的位置

    一.Why? 通常,当你开始使用docker时,我们并不太关心Docker 用于存储镜像和容器的默认目录.当使用Docker进行更多实验时,Docker开始占用大量的空间时,你不得不按下紧急按钮.所以现在是时候把故障排除放在如何改变docker的默认存储位置了.费了很大力浏览了许多网站和论坛后,我无法确定在Centos7主机上更改Docker镜像和容器的默认目录的步骤.这篇文章提供了特定于Centos7的说明(它也适用于RHEL7).对于Debian,我可以找到很多文档和"如何"在互联

  • Docker 镜像和容器的区别详解

    最近学习Docker,被Docker 的镜像和容器搞的晕头转向,索性上网查找相关资料并整理下彻底的理解这块内容,有需要的小伙伴可以看下,少走点弯路. Docker的镜像和容器的区别 一.Docker镜像 要理解Docker镜像和Docker容器之间的区别,确实不容易. 假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的.这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态. 一个Docker镜像可以构建于另一个Docker镜像之上,这种层

  • 详解Docker 容器基础系统镜像打包

    因为容器本身是共享宿主操作系统内核,所以容器基础系统镜像包本身就是一个标准的 Linux rootfs + 用户自定义的工具.根据这个思路,我们就可以构建一个自己的容器基础系统镜像. 构建标准的 Linux rootfs 的方式有很多种方法,Redhat.Debian.SUSE等主流的发行版都有提供相应的工具支持. 大概的流程如下: 构建基础的 rootfs -> 配置基础系统参数 -> 部署用户自定义软件 -> 清理系统 -> 打包为容器镜像 -> 测试镜像 -> 发

  • docker 深入了解镜像、容器、仓库等概念

    docker镜像.容器.仓库的基本概念 镜像 1.Docker 镜像就是一个只读的模板. 例如:一个镜像可以包含一个完整的 CentOS 操作系统环境,里面仅安装了 httpd或用户需要的其它应用程序. 2.镜像可以用来创建 Docker 容器. 3.Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用. 容器 Docker 利用容器来运行应用. 容器是从镜像创建的运行实例.它可以被启动.开始.停止.删除.每个容器都是相互

  • Docker 教程之基本概念(镜像,容器,仓库)详解

    镜像 Docker 包括三个基本概念 镜像(Image) 容器(Container) 仓库(Repository) 理解了这三个概念,就理解了 Docker 的整个生命周期. Docker 镜像 Docker 镜像就是一个只读的模板. 例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序. 镜像可以用来创建 Docker 容器. Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经

  • 深入了解docker(docker镜像、容器、仓库的基本概念)

    本文重点给大家介绍docker镜像.容器.仓库的基本概念的知识. Docker概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 镜像 Docker 镜像就是一个只读的模板. 例如:一个镜像可以包含一个完整的 CentOS 操作系统环境,里面仅安装了 httpd或用户需要的其它应用程序. 镜像可以用来创建 Docker 容器. Dock

  • docker常用命令总结之安装、镜像、容器基本操作

    以下均在centos 7进行的操作 docker安装 yum install -y docker -y:表示在安装过程中按照默认配置进行安装,不需要进行逐步确认 查看已经安装的docker yum list installed | grep docker 删除已经安装的docker yum remove -y docker.x86_64 yum remove -y docker-client.x86_64 yum remove -y docker-common.x86_64 docker服务启动

随机推荐