赞
踩
记录时间 [2024-4-10]
前置文章:
Docker学习笔记(一):入门篇,Docker概述、基本组成等,对Docker有一个初步的认识
Docker学习笔记(二):在Linux中部署Docker(Centos7下安装docker、环境配置,以及镜像简单使用)
Docker 学习笔记(三):Centos7 中 Docker 使用,镜像、容器,以及操作等常用命令小结
Docker 学习笔记(四):练习篇,Linux 中使用 Docker 部署 Nginx,Tomcat,以及 ElasticSearch
笔者对关于 Docker 学习的文章进行了整理,需要的朋友可以参考上面专栏哦。
学前准备工作:
在前几篇文章中,笔者讲述了关于Docker 学习的入门知识,本文是 Docker 入门的最后一篇,主要是对 Docker 镜像知识的梳理,附带了 Commit 方式提交镜像副本的操作,以及可视化面板 portainer 的安装。
主要内容有:
Docker 镜像知识划重点
梳理一遍原理,重点在于理解分层
镜像是一种轻量级、可执行的独立软件包,将开发的软件和该软件的运行环境一起打包,即:镜像中包含运行这个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
联合文件系统是一种分层、轻量级并且高性能的文件系统,它支持将对文件系统的修改作为一次提交来一层层地叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
联合文件系统的特性在于:它虽然同时加载了多个文件系统,但从外面只能看到一个文件系统。联合加载会把各层文件系统叠加起来,最终,该文件系统会包含所有底层的文件和目录。
联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
Docker 镜像实际上由一层一层的文件系统组成,这种层级的文件系统即为联合文件系统。
比如下面提到的 bootfs 和 rootfs 这两层。
bootfs(boot file system):
rootfs(root file system):
/dev, /proc, /bin, /etc
等标准目录和文件;再比如,如下图所示:
平时安装在虚拟机中的 CentOS 系统一般占好几个 G
,为什么 Docker 中的 CentOS 镜像仅 200M
呢?
原因在于操作系统精简:
使用 Docker 下载一个镜像,观察下载的日志输出,可以看到是一层一层下载的。
尝试一下:
[root@localhost ~]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
a2abf6c4d29d: Already exists
c7a4e4382001: Pull complete
4044b9ba67c9: Pull complete
c8388a79482f: Pull complete
413c8bb60be2: Pull complete
1abfd3011519: Pull complete
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
查看下详细信息:
docker image inspect redis:latest
可以看到分层情况 Layers
:
[root@localhost ~]# docker image inspect redis:latest [ // ... "RootFS": { "Type": "layers", "Layers": [ "sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f", "sha256:9b24afeb7c2f21e50a686ead025823cd2c6e9730c013ca77ad5f115c079b57cb", "sha256:4b8e2801e0f956a4220c32e2c8b0a590e6f9bd2420ec65453685246b82766ea1", "sha256:529cdb636f61e95ab91a62a51526a84fd7314d6aab0d414040796150b4522372", "sha256:9975392591f2777d6bf4d9919ad1b2c9afa12f9a9b4d260f45025ec3cc9b18ed", "sha256:8e5669d8329116b8444b9bbb1663dda568ede12d3dbcce950199b582f6e94952" ] }, ... ]
为什么 Docker 镜像要采用这种分层的结构?为了实现资源共享。
因为许多镜像都由相同的 Base 镜像构建而来,那么宿主机只需将 Base 镜像在磁盘上保留一份,同时在内存中加载一份,就可以为这些镜像的所有容器服务了,而且镜像的每一层都可以被共享。
Docker 镜像的每一层都是在前一层的基础上进行更改的,此方式可减少磁盘使用和提高镜像传输的效率。
如图,假如基于 Ubuntu 创建一个新的镜像,Ubuntu 即为新镜像的第 1 层;如果在该镜像中添加 Python 包,就会在基础镜像层之上创建第 2 个镜像层;如果继续添加一个安全补丁,就会创建第 3 个镜像层。该镜像当前已经包含 3 个镜像层。
如下图,这个镜像包含 2 个镜像层,每个镜像层包含 3 个文件。也就是说:镜像 = 2 个镜像层 = 6 个文件
存储引擎与快照机制:
在 Docker 的早期版本中,每一层都是通过存储引擎的方式来实现的,在底层文件系统上构建一个读写文件系统。但从 Docker 1.10 版本开始,Docker 开始使用了更高效的快照机制来实现层的堆叠。这种快照机制允许 Docker 在不同的层之间共享数据,从而减少了磁盘的使用空间和提高了容器的启动速度。
Linux 中可用的存储引擎:AUFS、Overlay2、Device Mapper、Btrfs、ZFS,顾名思义,每种存储引擎都基于 Linux 中对应的文件系统或者块设备技术,都具备其独有的性能特点。
Windows 中可用的存储引擎:windowsfilter,该引擎基于 NTFS 文件系统之上实现了分层和 CoW。(CoW,Copy-on-Write,能保证数据的完整性,有利于掉电恢复)
如图,在这个镜像中,使用新的镜像层中的文件 7 覆盖了旧镜像层文件 5;对外展示时,提供统一的视图,所有镜像层堆叠并合并。
如图是镜像相关操作运行的原理,从远程下载到本地运行,镜像是只读文件,所有对它的操作都在容器层中进行。
使用 docker commit
命令提交容器成为一个新的副本
# 命令和 git 原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]
操作一下吧:(可以随便找个容器尝试一下)
docker commit -a="yuan" -m="add webapps app" b8e65a4d736d tomcat02:1.0
下面简单介绍下可视化面板 portainer 的安装
安装命令:
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问测试:
访问 8088 端口测试,面板如下,可以查看 docker 中镜像、容器等的情况,并进行启动、进入、移除等操作。
本文是 Docker 入门的最后一篇,下一环节进入 Docker 精髓:数据卷、DockerFile、Docker 网络。
一些参考资料
狂神说系列 Docker 教程:https://www.bilibili.com/video/BV1og4y1q7M4/
Docker 官方文档:https://docs.docker.com/engine/install/centos/
Docker 远程仓库:https://hub.docker.com/
FinalShell 下载:http://www.hostbuf.com/t/988.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。