目录
1. 镜像是什么
2. UnionFS 联合文件系统
3. Docker镜像加载原理
4. Docker 容器和镜像的底层关系
5. Docker 镜像 commit 操作案例
1. 镜像是什么
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数。镜像在构建之后其内容不会被改变。
2. UnionFS 联合文件系统
定义:UnionFS 是 Docker 镜像的基础,本质是一种分层、轻量级并且高性能的文件系统。
特点:
[1] 它支持对文件系统的修改作为一次提交来一层层的叠加。
[2] 可以将不同目录挂载到同一个虚拟文件系统下。
[3] 镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。分层存储使得镜像的复用、定制变的更为容易。
[4] 比如当用户想要将 tomcat 升级到新版本时,不用重新建立新镜像,只需要添加新层即可。还比如要删除前一层文件的操作,实际不是真的删除前一层的文件,而是将当前层标记为文件已删除。
3. Docker镜像加载原理
[1] Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统是 UnionFS。
[2] Docker的底层是bootfs,主要包含主要有含 bootloader 和 kernal。bootloader 主要是引导加载 kernel,Linux 刚启动时会加裁 bootfs 文件系统,在 Docker 镜像的最底层是引导文件系统bootfs。这一层与我们典型的 Linux/Unix 系统是一样的,包含 boot 加载器和内核。当 boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs。
[3] rootfs在bootfs之上。包含的就是典型Linux系统中的 /dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各利不同的操作系统发行版,比如Ubuntu,Centos等等。
[4] docker安装的centos仅包含几十兆是由于对于一个简易的os,底层直接用主机的kernel,自己只需要提供 rootfs 即可。因此对于不同linux的发行版,bootfs基本是一致的,只是rootfs会有差别。
4. Docker 容器和镜像的底层关系
[1] 当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作 “容器层”。
[2] 容器层之下都是镜像层,所有对容器的改动,无论是添加删除还是修改都只会发生在容器层里
[3] 只有容器层是可写的,容器层下面的镜像层都是可读的。
5. Docker 镜像 commit 操作案例
案例:如果我们要在原始镜像基础上修改镜像,修改之后如何提交?
语法:docker commit -m=“提交的描述信息” -a="作者" 容器id 要创建的目标镜像名称: [标签名]
具体实例:基于从远程仓库pull下来的ubuntu镜像,添加vim命令后,重新打一个新的镜像提交。
docker images # 查看当前镜像,其中ubuntu镜像只有77.8M
docker run -it ubuntu /bin/bash # 进入ubuntu镜像创建的容器
vim a.txt # 此时容器内找不到vim命令
apt-get update # 更新包管理工具
apt-get install vim # 安装vim
# 注意要先退出容器,然后执行该命令。其中 386525a77949 为容器id,非镜像id
docker commit -m="add vim" -a="wmq" 386525a77949 ubuntu_addvim:20230203
# 运行上述语句后,查看生成镜像,可看到增加了 ubuntu_addvim镜像
docker images
从上述图中可以看到原来ubuntu大小是77.8M。当我们添加了vim后的镜像是178M了。说明我们添加了vim的镜像制作成功。启动新镜像并进入容器,发现其可以支持vim命令。
注:该博客中部分图文内容来自于23_镜像的分层概念的学习笔记,仅供参考。如看其他Docker内容,可看我博客Docker系列aaron_neil_Dcoker系列,持续更新中。