【Docker 系列】docker 学习 四,一起学习镜像相关原理

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Docker 系列】docker 学习 四,一起学习镜像相关原理

【Docker 系列】docker 学习 四,镜像相关原理

镜像是什么?

镜像是一种轻量级的,可执行的独立的软件包。

镜像用来打包软件的运行环境和基于运行环境开发的软件,它包含运行某些软件所需要的所有内容,例如:代码,运行时库,环境变量和配置文件等等

所有的应用,可以直接打包 docker 镜像,一键部署,一键运行

得到镜像方式有哪些?

  • 直接拷贝其他 docker 镜像
  • 自己制作一个镜像 DockerFile
  • 从远程仓库下载,如 dockerhub

Docker 镜像的加载原理

UnionFS

UnionFS,是联合文件系统,还记的我们 docker 学习二 里面安装 redis 的时候,出现的分层下载吗

image.png

这就是联合文件系统

UnionFS 联合文件系统,是一种分层,轻量级并且高性能的文件系统

它支持对文件系统的修改作为一次提交来一层一层的叠加,同时可以将不同目录挂载到一个虚拟文件系统下

UnionFS 联合文件系统是 Docker 镜像的基础,镜像还可以通过分层来继承,基于基础的镜像,我们可以制作成各种应用镜像

特性:

联合文件系统一次同时加载多个文件系统,联合加载会把各层的文件系统叠加起来,最终的文件系统会包含所有底层的文件和目录

Docker 的镜像加载原理是什么呢?

图片来源于网络

image.png

Docker 的镜像是有一层一层的文件系统组成的,这个层级的文件系统就叫做联合文件系统,一般底下的层都是共用的

一般系统启动,是一个加载的过程,这个过程是 bootloader 引导加载 kernel,linux 操作系统刚启动的时候还会加载 bootfs 文件系统,而咱们的 Docker 镜像最底层就是 bootfs

bootfs

boot file system 是一个文件系统,主要是包含 bootloader 和 kernel

当 boot 加载完毕之后,整个内核都在运行正在内存中的,此时内存的使用权已经由 bootfs 交接给内核,这个时候系统会将 bootfs 卸载掉

rootfs

在来说一下 rootfs,root file system,根文件系统,它是在 bootfs 之上的,就是包含了,linux 操作系统中的 /dev ,/proc,/bin,/etc 等目录和文件

例如我们知道的 rootfs 有 centos,ubuntu等等

分层原理

我们来下载一个 redis 看看效果

image.png

Docker 是按照层级进行下载,之前下载过的层级就不会再次下载了,我们可以通过 docker inspect 查看 redis 的细节


# docker inspect redis:latest
...
"RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:814bff7343242acfd20a2c841e041dd57c50f0cf844d4abd2329f78b992197f4",
                "sha256:dd1ebb1f5319785e34838c7332a71e5255bda9ccf61d2a0bf3bff3d2c3f4cdb4",
                "sha256:11f99184504048b93dc2bdabf1999d6bc7d9d9ded54d15a5f09e36d8c571c32d",
                "sha256:e461360755916af80821289b1cbc503692cf63e4e93f09b35784d9f7a819f7f2",
                "sha256:45f6df6342536d948b07e9df6ad231bf17a73e5861a84fc3c9ee8a59f73d0f9f",
                "sha256:262de04acb7e0165281132c876c0636c358963aa3e0b99e7fbeb8aba08c06935"
            ]
        },
...

如上结果我们可以看到,redis 的层级与我们 pull 拉取镜像时候的层级一致

那么Docker 为什么要采用分层下载呢?

主要是为了共享资源

例如我们的多个镜像都是从基础镜像构建而来,那么宿主机只需要在机器上保留一份基础镜像即可,并且内存中也只需要加载一份基础镜像,就可以为所有需要的容器服务,而且镜像的每一层也都是可以共享的

image.png

我们可以这样来理解:

所有的 Docker 镜像都来源于基础镜像,我们增加或修改镜像内容的时候,就会在当前镜像层上面,新建一个镜像层,这就例如 windows 里面的一个安全补丁

如上面图例:

我们在镜像的第一层,放置 file1,file2,镜像的第二层放置 file3,file4,镜像的第三层放置file3.1 (file3.1 是 file3 的一个新版本)

那么,我们在打包镜像的时候,就会合并出 一个镜像里面,有 4 个文件,此处也就是 4个 layer

当我们下载这个最终合并的镜像时,就会一次下载上述的 4 个layer

Docker 镜像的特点:

Docker 镜像默认都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部

上面说的这一层就是咱们的容器层,容器层下面是镜像层,如下图所示

image.png

如何提交咱们的镜像

Docker 提交原理和命令与 Git 类似

docker commit

提交当前容器,成为一个新的版本

我们一般会这样使用

docker commit -m="描述信息" -a="作者" 容器ID 目标镜像名:[TAG]

举个例子:

咱们自己修改一下 nginx 镜像,作为我们自己的镜像来使用

启动 nginx ,设置端口映射为 -p 8888:80

docker run -d -p 8888:80 nginx

以交互方式进入 nginx

# docker psCONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES30841a3a26cb   nginx     "/docker-entrypoint.…"   4 seconds ago   Up 2 seconds   0.0.0.0:8888->80/tcp   strange_hugle# docker exec -it 30841a3a26cb /bin/bash

进入到nginx 的html 目录,将index.html 文件替换掉,,nginx重新加载配置

#cd /usr/share/nginx/html
#ls
50x.html  index.html
#mv index.html index.html.bak
#mv 50x.html index.html
#/usr/sbin/nginx -s reload

这个时候,我们访问一个服务器的 8888 端口,查看效果(我们将正常的 index.html 页面,换成了一个显示错误的页面)

image.png

如上图,果然更换成功了

咱们来进行一下 commit

docker commit -a="xiaomotong" -m="modify index.html" 30841a3a26cb nginx01:1.0


~# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
30841a3a26cb   nginx     "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes   0.0.0.0:8888->80/tcp   strange_hugle
root@iZuf66y3tuzn4wp3h02t7pZ:~# docker commit -a="xiaomotong" -m="modify index.html" 30841a3a26cb nginx01:1.0
sha256:1d072fa616573ba67a103925c6114e40171eb1d14ca573f146a28b8c51e5fdff
root@iZuf66y3tuzn4wp3h02t7pZ:~# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
nginx01               1.0       1d072fa61657   3 seconds ago   133MB
ubuntu                latest    1318b700e415   7 days ago      72.8MB
redis                 latest    aa4d65e670d6   11 days ago     105MB
nginx                 latest    08b152afcfae   12 days ago     133MB
portainer/portainer   latest    580c0e4e98b0   4 months ago    79.1MB

如果我们想要保存自己的容器当前状态,咱们就可以通过 commit 来提交,获得一个想要的镜像,这就有点像使用虚拟机打快照一样

参考资料:

docker docs


欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
Docker 容器
将本地的应用程序打包成Docker镜像
将本地的应用程序打包成Docker镜像
|
19天前
|
NoSQL PHP MongoDB
docker push推送自己搭建的镜像
本文详细介绍了如何搭建和复盘两个Web安全挑战环境:人力资源管理系统和邮件管理系统。首先,通过Docker搭建MongoDB和PHP环境,模拟人力资源管理系统的漏洞,包括nosql注入和文件写入等。接着,复盘了如何利用这些漏洞获取flag。邮件管理系统部分,通过目录遍历、文件恢复和字符串比较等技术,逐步绕过验证并最终获取flag。文章提供了详细的步骤和代码示例,适合安全研究人员学习和实践。
44 3
docker push推送自己搭建的镜像
|
23天前
|
Docker 容器
|
1月前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
59 9
|
1月前
|
存储 缓存 运维
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像。此机制减少存储占用,提高构建和传输效率。Docker还通过缓存机制提升构建和运行效率,减少重复工作。文章深入解析了Docker镜像分层存储与缓存机制,包括具体实现、管理优化及实际应用案例,帮助读者全面理解其优势与挑战。
50 4
|
2月前
|
运维 持续交付 虚拟化
深入解析Docker容器化技术的核心原理
深入解析Docker容器化技术的核心原理
56 1
|
2月前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
2月前
|
缓存 JavaScript 安全
深入理解Docker镜像构建过程
深入理解Docker镜像构建过程
77 0
|
8月前
|
分布式计算 Java Linux
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
Docker 是一套构建在 Linux 内核之上的高级工具,旨在帮助开发人员和运维人员更轻松地交付应用程序和依赖关系,实现跨系统和跨主机的部署。使用安全且轻量级的容器环境来实现这一目标。容器可以手动创建,也可以通过编写 Dockerfile 自动创建。开发人员和运维人员可以将应用程序及其依赖打包到容器中,实现应用程序的可移植性和环境一致性。
266 5
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
|
3月前
|
Linux 应用服务中间件 Shell
docker学习--docker容器镜像常用命令大全(简)
本文档详细介绍了Docker中的镜像命令与容器管理命令。镜像命令部分涵盖了镜像搜索、下载、上传等操作;容器管理命令则包括了容器的创建、启动、停止、删除及日志查看等功能。通过具体示例,帮助用户更好地理解和使用Docker相关命令。
215 0

热门文章

最新文章