【云原生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进入此目录。如果运行中的容器修改一个已经存在的文件,那么会将该文件从下面的只读层复制到读写层,只读层的这个文件就会覆盖,但还存在,这就实现了文件系统隔离,当删除容器后,读写层的数据就会删除,只读镜像不变。

目录
相关文章
|
13天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
55 2
|
19天前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
692 29
|
15天前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
21天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
100 2
|
22天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
46 1
|
23天前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
15天前
|
缓存 JavaScript 安全
深入理解Docker镜像构建过程
深入理解Docker镜像构建过程
51 0
|
10天前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
3天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
23 5
|
4天前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!

热门文章

最新文章

下一篇
无影云桌面