【云原生Docker系列第七篇】浅谈镜像的分层原理(几位?“两位”)

简介: 【云原生Docker系列第七篇】浅谈镜像的分层原理(几位?“两位”)

1. 什么是镜像


镜像是Docker容器的基石,容器时镜像的运行实例,有了镜像才能启动容器


简单来说,Docker镜像是一个不包含linux内核而又精简的linux操作系统。它就好比是一个只有可读权限的压缩包,我们只能查看不能写。


2. 镜像从哪里来


Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。公共镜像库,默认是国外的源,即使可能做了CDN,下载速度还是比较慢,可以使用国内的源例如阿里云来加速阿里云镜像加速


3. 镜像的内部结构


3.1 hello-world -----最小的镜像

hello-world是Docker官方提供的一个镜像,可以用来验证Docker是否安装成功。我们从Docker Hub上下载它,如下图所示:



用docker images命令查看镜像信息,如下图所示:



可以看到这个镜像只有13k左右,十分小


3.2 bash镜像

base镜像有两层含义:


不依赖其他镜像

其他镜像可以在这基础上进行扩展


能被称作bash镜像的通常是各种linux发行版的Docker镜像,例如Ubuntu、Debian、centos等


我们以centos镜像为例分析bash镜像



我们在自己的虚拟机上安装centos至少要几个G,而centos的镜像才200多M,这足以说明了镜像的精简。


linux操作系统由内核空间和用户空间组成,如图:


3.2.1 rootfs

内核空间是kernel,linux刚启动时会加载bootfs文件系统,之后bootfs就会被卸载。用户空间的文件系统是rootfs,包含我们熟悉的/dev、/proc、/bin等目录,对于base镜像来说,底层直接用host的kernel,自己只需要提供rootfs就行了。对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以。


3.2.2 base镜像提供的是最小安装

centos镜像的dockerfile文件内容如下:

FROM scratch
ADD centos-7-docker.tar.xz /
CMD ["/bin/bash"]


第二行ADD指令添加到镜像的tar包就是centos7的rootfs,在制作镜像时,这个tar包会自动解压到根目录下,生成/dev、/proc、/bin等目录


3.2.3 支持运行多种linux OS

不同linux发行版的区别主要就是rootfs,比如Ubuntu 14.04使用的upstart管理服务,apt管理软件包,而centos7使用systemd和yum。这些都是用户空间上的区别,内核空间区别不大。


Docker 可以同时支持多种Linux镜像,模拟出多种操作系统环境,如下图所示:


上图Debian和BusyBox(一种嵌入式Linux)上层提供各自的rootfs,底层共用Docker Host的kernel。


4.镜像的分层结构



dockerfile中的每一个run命令,都会生成一层镜像,新镜像是从base镜像上一层层叠加起来生成的,镜像的分层结构最大的好处就是共享资源。


多个容器共享一个基础镜像,当某个容器修改了基础镜像的内容,例如/etc下的文件,其他容器的/etc不会改变,因为只有当使用镜像运行一个容器实例时,才会在rootfs只读层上挂载一层可读可写层,下面的都是可读层,原来的镜像不会被修改。


5.工作过程


当我们启动一个新的容器时,Docker会只加载只读镜像,在最后添加一个读写层,并将镜像中的目录复制一份到/var/lib/docker/aufs/mnt/容器ID为目录的目录下,我们可以使用chroot进入此目录。如果运行中的容器修改一个已经存在的文件,那么会将该文件从下面的只读层复制到读写层,只读层的这个文件就会覆盖,但还存在,这就实现了文件系统隔离,当删除容器后,读写层的数据就会删除,只读镜像不变。

目录
打赏
0
0
0
0
14
分享
相关文章
docker load 后镜像名称为空的问题解决
Docker在容器化应用程序时提供了强大的镜像管理功能,但也可能在某些操作中遇到如镜像名称为空的问题。通过理解问题的成因并采取适当的解决方案,如正确保存和加载镜像、手动修复标签等,可以有效避免和解决这一问题。通过本文提供的指导,您可以确保在使用Docker进行镜像操作时更为顺利,并提高容器管理的效率。
115 82
YashanDB Docker镜像制作
本文介绍了使用Docker部署YashanDB数据库的方法及其优势。相比传统部署方式,Docker简化了环境配置,实现一键部署,确保软件在不同环境中一致运行。文章详细讲解了数据库镜像与容器的概念、Dockerfile的构建流程,以及如何通过Dockerfile定制YashanDB镜像。此外,还演示了镜像的发布过程,包括推送至阿里云容器镜像服务(ACR)。最后,探讨了容器启动时的初始化脚本设置和数据文件复用方法,满足客户对数据库自动化初始化和数据持久化的需求。
Docker Image即Docker镜像
Docker 镜像是 Docker 容器的基础,包含了运行应用程序所需的一切。通过 Dockerfile 可以方便地创建自定义镜像,并且利用 Docker 提供的命令可以轻松管理和使用这些镜像。掌握 Docker 镜像的创建、管理和使用,是进行容器化应用开发和部署的基础技能。希望本文能帮助读者更好地理解 Docker 镜像的概念和操作,提高开发和运维效率。
96 13
docker环境安装kafka/Flink/clickhouse镜像
通过上述步骤和示例,您可以系统地了解如何使用Docker Compose安装和配置Kafka、Flink和ClickHouse,并进行基本的验证操作。希望这些内容对您的学习和工作有所帮助。
220 28
|
29天前
|
多种脚本批量下载 Docker 镜像:Shell、PowerShell、Node.js 和 C#
本项目提供多种脚本(Shell、PowerShell、Node.js 和 C#)用于批量下载 Docker 镜像。配置文件 `docker-images.txt` 列出需要下载的镜像及其标签。各脚本首先检查 Docker 是否安装,接着读取配置文件并逐行处理,跳过空行和注释行,提取镜像名称和标签,调用 `docker pull` 命令下载镜像,并输出下载结果。使用时需创建配置文件并运行相应脚本。C# 版本需安装 .NET 8 runtime。
125 2
docker centos镜像 npm安装包时报错“npm ERR! code ECONNRESET”
通过上述步骤,您可以有效解决在 Docker 中使用 CentOS 镜像安装 npm 包时遇到的 "npm ERR! code ECONNRESET" 错误。希望这些方法能帮助您顺利进行 npm 包的安装。
173 26
Docker-基础(数据卷、自定义镜像、Compose)
通过数据卷实现持久化存储,通过自定义镜像满足特定需求,通过Docker Compose方便地管理多容器应用
111 27
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
92 30
揭秘 Microsoft.Docker.SDK:让容器开发更轻松的强大工具揭秘
随着云计算和容器技术的快速发展,`Docker` 已经成为容器化技术的事实标准。`Microsoft` 作为 `Docker` 的主要支持者和参与者,推出了 `Microsoft.Docker.SDK`,旨在帮助开发者更轻松地进行容器开发。本文将深入揭秘 Microsoft.Docker.SDK 的功能、使用方法以及它在容器开发中的应用。
41 12