1、docker 镜像讲解
什么是镜像?
镜像是一个轻量级、可执行的独立软件包,用于包装软件运行环境和基于运行环境开发的软件,包括代码、运行、库、环境变量和配置文件。
所有应用程序直接打包docker镜像,可以直接跑!
如何获得镜像?
- 从远程仓库下载
- 朋友拷贝
- 自己制作镜像 DockerFile
UnionFS(联合文件系统)
UnionFS(联合文件系统):Union文件系统(UnionFS )它是一种分层、轻量级、高性能的文件系统,支持文件系统的修改作为层层叠加,同时,可以将不同的目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。Union文件系统是Docker镜像的基础。Union文件系统是Docker镜像的基础。基于基础镜像(无父镜像),可以通过分层继承镜像,制作各种具体的应用镜像。
特点:同时加载多个文件系统,但从外部看,只能看到一个文件系统。联合加载将叠加各级文件系统,使最终文件系统包含所有底层文件和目录
Docker镜像加载原理
docker镜像实际上是由一层一层的文件系统组成的,这个级别的文件系统UnionFS。
Bootfs(引导文件系统)主要包括引导加载器和内核,BootLoader主要是引导内核加载,linux启动时会加载Bootfs文件系统,在Docker镜像的最底层是Bootfs。这一层和我们是典型的linux/unix该系统是一样的,包括引导加载器和内核。引导加载完成后,整个内核都在内存中,此时内存的使用权已由引导转移到内核,此时系统也将卸载引导。
Rootfs(根fle系统),在启动之上。包含的是典型的linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。Rootfs是各种操作系统的发行版,如Ubuntu,CentOS等等。 我们通常安装在虚拟机中CentOS都是好几个G,为什么Docker这里才200M ? 对于精简OS,rootfs它可以很小,只需要包含最基本的命令、工具和程序库,因为底部直接使用主机的核心,只需要提供rootfs可以。由此可见,不同的linux发行版, bootfs基本一致, rootfs会有差异,所以不同的发行版开使用bootfs。
分层理解
分层的理解
我们可以下载一个镜像,观察下载的日志输出,看到一层一层下载! 思考:码头镜像为什么要采用这种分层结构?
我认为最大的好处是资源共享!例如,许多镜像来自同一个镜像Base当镜像构建时,宿主机只需在磁盘上保留一个base镜像只需要在内存中加载一个base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
通过码头图像检查命令可以查看镜像分层!
"RootFS": {
"Type": "layers", "Layers": [ "sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f", "sha256:9b24afeb7c2f21e50a686ead025823cd2c6e9730c013ca77ad5f115c079b57cb", "sha256:4b8e2801e0f956a4220c32e2c8b0a590e6f9bd2420ec65453685246b82766ea1", "sha256:529cdb636f61e95ab91a62a51526a84fd7314d6aab0d414040796150b4522372", "sha256:9975392591f2777d6bf4d9919ad1b2c9afa12f9a9b4d260f45025ec3cc9b18ed", "sha256:8e5669d8329116b8444b9bbb1663dda568ede12d3dbcce950199b582f6e94952" ] }, "Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z" }
理解:
所有的Docker镜像始于基本的镜像层。当修改或添加新内容时,将在当前镜像层上创建新的镜像层。
以一个简单的例子为基础Ubuntu Linux16.04创建一个亲新的镜像,以加是就销‘A绝像E,对来社队na1 oan a第二个镜像层将在基本镜像层上创建;如果继续添加安全补丁,将创建第三个镜像层。
目前,该镜像已包含三个镜像层,如下图所示(这只是一个非常简单的演示例子)。 在添加额外的镜像层的同时,镜像始终是所有镜像的组合,理解这一点非常重要。下图中有一个简单的例子,每个镜像层包含三个文件,两个镜像层包含六个文件。 在这种情况下,上镜像层中的文件覆盖了底镜像层中的文件.这使得文件的更新版本作为一个新的镜像层添加到镜像中.docker镜像层堆栈通过存储引擎(新版本采用快照机制)实现,多镜像层显示为统一的文件系统。
Linux可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顾名思义,每个存储引擎都是基于Linux对应的文件系统或块设备技术,每个存储引擎都有其独特的性能特性。
Docker在Windows上仅支持windowsfilter基于存储引擎的存储引擎NTFS在文件系统上实现了分层和CoW[1].下图显示了与系统显示相同的三层镜像。所有镜像层堆叠合并,提供统一的视图。
下图显示了与系统显示相同的三层镜像。所有镜像层堆叠合并,提供统一的视图。 > 特点
Docker镜像只读,当容器启动时,将新的可写层加载到镜像顶部!
这一层就是我们通常所说的容器层,容器下的都叫镜像层! 如何提交自己的镜像?
commit镜像
docker commit 提交容器成为一个新的副本 # 命令和git原因类似 docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
测试
1、启动一个默认的tomcat 2、发现这个默认的tomcat,是没有webapps应用,镜像的原因,官方的镜像默认webapps下面是没有文件的! 3、拷贝进去基本的文件 4、将操作过的容器通过commit提交为一个镜像!以后就使用修改过的镜像即可,这就是我们自己的一个修改的镜像
容器数据卷
什么是容器数据卷?
docker的理念回顾
将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化!
MySQL容器删了,删库跑路!需求:MySQL数据存储在本地!
容器之间可以有一个数据共享的技术!docker容器中产生的数据,同步到本地!
这就是容器技术!目前的挂载,将我们容器内的目录,挂载带Linux上面! 总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!
使用数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录
#测试
[root@localhost home]# docker run -it -v /home/ceshi:/home/ceshi centos /bin/bash
#启动起来的时候,我们可以通过docker inspect 容器id进行查看
测试文件的 再次测试:
1、停止容器
2、修改本地文件
3、启动容器
4、容器内的数据还是同步的
好处:修改只需要在本地修改即可!因为容器内会自动同步!