『现学现忘』Docker基础 — 25、Docker镜像讲解
1、镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时环境、库、环境变量和配置文件。
即:所有的应用,直接打包成Docker镜像,就可以直接跑起来!
2、Docker镜像获取的方式
- 从仓库中拉取镜像(
docker pull
)。 - 从本地文件中载入镜像(
docker load
)。 - 由容器生成新的镜像(
docker commit
)。 - 自己构建新的镜像(
docker build
)。
3、Docker镜像加载原理
(1)UnionFS(联合文件系统)
Union
文件系统(UnionFS
)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交,来一层层的叠加。- 同时可以将不同目录,挂载到同一个虚拟文件系统下(
unite several directories into a single virtual filesystem
)。 Union
文件系统是Docker镜像的基础。- 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像概念),可以制作各种具体的应用镜像。
总结:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
我们下载镜像的时候,看到的一层层就是这个,如下:
[root@192 /]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
a076a628af6f: Already exists # 本地种已存在基础镜像
f40dd07fe7be: Pull complete # 一层一层下载
ce21c8a3dbee: Pull complete # 一层一层叠加
ee99c35818f8: Pull complete
56b9a72e68ff: Pull complete
3f703e7f380f: Pull complete
Digest: sha256:0f97c1c9daf5b69b93390ccbe8d3e2971617ec4801fd0882c72bf7cad3a13494
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
所以这种UnionFS
(联合文件系统)来管理镜像是非常高效和节省空间的。
(2)Docker镜像加载原理
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS
(联合文件系统)。
分为两个部分:
bootfs
(boot file system
):主要包含bootloader
和kernel
(Linux内核),bootloader
主要是引导加载kernel
,Linux刚启动时会加载bootfs
文件系统,而在Docker镜像的最底层也是bootfs
这一层,这与我们典型的Linux/Unix系统是一样的,包含boot
加载器和内核。当boot
加载完成之后,整个内核就都在内存中了,此时内存的使用权已由bootfs
转交给内核,此时系统也会卸载bootfs
。
即:系统启动时需要的引导加载,这个过程会需要一定时间。就是黑屏到开机之间的这么一个过程。电脑、虚拟机、Docker容器启动都需要的过程。在说回镜像,所以这一部分,无论是什么镜像都是公用的。rootfs
(root file system
):rootfs
在bootfs
之上。包含的就是典型Linux系统中的/dev
,/proc
,/bin
,/etc
等标准目录和文件。rootfs
就是各种不同的操作系统发行版,比如Ubuntu,CentOS等等。
即:镜像启动之后的一个小的底层系统,这就是我们之前所说的,容器就是一个小的虚拟机环境,比如Ubuntu,CentOS等,这个小的虚拟机环境就相当于rootfs
。
bootfs
和rootfs
关系如下图:
平时我们安装进虚拟机的CentOS系统都是好几个G,为什么Docker这里才200M?
如下:
[root@192 /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 300e315adb2f 3 months ago 209MB
对于一个精简的OS系统,rootfs
可以很小,只需要包含最基本的命令、工具和程序库就可以了,因为底层直接用Host
(宿主机)的kernel
(也就是宿主机或者服务器的boosfs+
内核),自己只需要提供rootfs
就可以了。
由此可见对于不同的Linux发行版,bootfs
基本是一致的,rootfs
会有差别,因此不同的发行版可以公用bootfs
部分。
这就是我们之前说:虚拟机的启动是分钟级的,容器的启动是秒级的。
『现学现忘』Docker基础 — 25、Docker镜像讲解的更多相关文章
- 『现学现忘』Git基础 — 25、git log命令参数详解
目录 1.git log命令说明 2.git log命令参数 (1)不带参数 (2)常用显示参数 (3)--pretty参数 (4)--date=参数 (5)筛选参数 git log命令主要用于查看G ...
- 『现学现忘』Docker基础 — 9、Docker简介
目录 1.什么是Docker? 2.Docker的出现解决了什么问题? 3.Docker的特别之处 4.Docker相关网站 1.什么是Docker? 2010年dotCloud公司在旧金山成立,PA ...
- 『现学现忘』Docker基础 — 16、Docker中的基本概念和底层原理
目录 1.Docker的底层原理 2.Docker中常用的基本概念 3.run命令的运行流程 4.为什么Docker比VM快 Docker架构图: 我们依照Docker架构图进行Docker基础概念的 ...
- 『现学现忘』Docker基础 — 34、DockerFile文件详解
目录 1.DockerFile文件说明 2.Dockerfile构建过程解析 (1)Docker容器构建三步骤 (2)Dockerfile文件的基本结构 (3)Dockerfile注意事项 (4)Do ...
- 『现学现忘』Docker基础 — 35、实战:自定义CentOS镜像
目录 1.前提说明 2.编写Dockerfile文件 3.构建镜像 4.运行镜像 5.列出镜像的变更历史 1)目标:自定义镜像wokong_centos. 2)所用到的保留字指令: FROM:基础镜像 ...
- 『现学现忘』Docker基础 — 10、Docker的安装
目录 1.前提 2.通过yum安装Docker (1)更新yum包 (2)移除旧的Docker版本 (3)安装必须的软件包 (4)设置稳定yum源仓库 (5)更新yum软件包索引 (6)开始安装Doc ...
- 『现学现忘』Docker基础 — 30、Docker中数据卷相关命令
目录 1.Volume命令说明 2.Volume命令的使用 (1)创建数据卷 (2)查看本地数据卷列表 (3)打印myVolume数据卷的详细信息 (4)删除数据卷 (5)删除所有未使用的数据卷 3. ...
- 『现学现忘』Docker基础 — 40、发布镜像到Docker Hub
目录 1.准备工作 2.Docker登陆命令 3.Docker提交命令 4.总结: 5.补充:docker tag命令 1.准备工作 Docker Hub地址:https://hub.docker.c ...
- 『现学现忘』Docker常用命令 — 19、容器常用命令(一)
目录 1.新建并启动容器 2.列出当前所有正在运行的容器 3.退出容器 4.启动容器 5.重启容器 6.停止容器 7.强制停止容器 8.删除已停止的容器 有镜像才能创建容器,这是根本前提. 我们下载一 ...
- 『现学现忘』Docker常用命令 — 21、容器常用命令(三)
目录 13.进入正在运行的容器并以命令行交互 (1)方式一 (2)方式二 (3)attach和exec的区别 14.从容器内拷贝文件到主机上 15.Docker常用命令小结 (1)容器生命周期管理 ( ...
随机推荐
- autorelease基本使用
1.autorelease基本概念 autorelease是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease消息,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里 ...
- Msi.h causes compilation error in vs2010
创建一个Win32 Console工程ReadFromMSM,什么都不需要做. 在ReadFromMSM.cpp文件中引入头文件: #include <msi.h> 编译,会发现有成堆的错 ...
- Elasticsearch按请求体基本查询
1 分页: localhost:9200/get-together/_search {"query": {"match_all": {}},"from ...
- 34、python并发编程之多进程(操作篇)
目录: 一 multiprocessing模块介绍 二 Process类的介绍 三 Process类的使用 四 守护进程 五 进程同步(锁) 六 队列(推荐使用) 七 管道 八 共享数据 九 信号量( ...
- 四路4 GSPS@ 12 bit,四路12 GSPS@16 位4T4R 射频芯片AD9988
一.产品概述 AD9988 是一款高度集成的套件,是北京太速最新研发的,具有四个 16 位.12 GSPS 最大采样率.RF 数模转换器 (DAC) 内核,以及四个 12 位.4 GSPS 速率.RF ...
- 5道面试题,拿捏String底层原理!
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. String字符串是我们日常工作中常用的一个类,在面试中也是高频考点,这里Hydra精心总结了一波常见但也有点烧脑的String面试题,一共5道 ...
- c++ 文本处理
c++ 文本处理 1.使用sstream版本 (1)功能:截取第一列为1以后的数据,如下图,截取第5行(包括第5行)以后的数据,前面4行数据丢弃. (2)代码:textProc.cc #include ...
- Spring Boot数据访问之数据源自动配置
Spring Boot提供自动配置的数据访问,首先体验下,Spring Boot使用2.5.5版本: 1)导入坐标: 2.5.25版本支持8.0.26mysql数据库驱动.spring-boot-st ...
- webshell安全教程防止服务器被破解
直接上传取得webshell 因过滤上传文件不严,导致用户能够直接上传webshell到网站恣意可写目录中,然后拿到网站的办理员操控权限. 2 增加修正上传类型 现在很多脚本程序上传模块不是只允许上传 ...
- node / npm安装、启动报错
1. 系统禁止运行脚本 a. 在系统中找到Windos PowerShell[可以按win健,然后搜powershell]--以管理员身份打开 b. 在打开的窗口输入set-ExecutionPoli ...