自学docker必备课程笔记,b站看到动力节点docker视频教程,携带相关学习笔记,按章节整理分享给有需要的朋友~
课程学习地址:https://www.bilibili.com/video/BV1sb41X7oee
3 Docker镜像3.1 镜像基础3.1.1 镜像简介镜像是一个轻量级、可执行的独立软件包,也可以说是一个简单的操作系统。镜像包含应用软件和应用软件的运行环境。具体来说,镜像包括运行软件所需的所有内容,包括代码、库、环境变量和配置文件。几乎所有的应用程序都可以直接打包成Docker镜像。由于镜像运行时是容器,容器设计的初衷是快速小巧,所以镜像通常比较小,不包括内核,而是共享宿主机的内核;镜像只包括简单的Shell,或者没有Shell。
3.1.2 镜像仓库分类镜像仓库Imagege存储在镜像中心 Repository,每个镜像仓库都有大量的相关镜像。根据这些镜像发布者的不同,形成了四种不同的镜像仓库。
3.1.2.1 Docker Official ImageDocker官方镜像仓库。此类仓库中的镜像由Docker官方构建发布,代码质量高,安全,文档完善。此类仓库中的镜像将及时更新。常用的系统、工具软件和中间部件都有相应的官方镜像仓库。例如,Zookeeper、Redis、Nginx等。官方镜像仓库的名称一般直接是这类软件的名称。
3.1.2.2 Verified Publisher已验证出版商仓库。非Docker官方第三方发布了此类仓库中的镜像。但第三方由Docker公司审核认证,一般为大型企业、团体或组织。审核通过后,Docker公司将向其颁发“VERIFIED PUBLISHER”标识。这个仓库的镜像质量还是有保证的。除官方镜像仓库外,其他都是非官方镜像仓库。非官方镜像仓库名称一般由出版商用户名和软件名组成,形式为:/。
3.1.2.3 Sponsored OSS由Docker公司赞助开发的镜像仓库。此类仓库中的镜像也由非Docker官方第三方发布,但该镜像的开发由Docker公司赞助。这种类型的第三方通常是个人、团队或组织。这个仓库的镜像质量也有保证。
3.1.2.4 无认证仓库没有上述标志的仓库。该仓库内镜像质量参差不齐,质量无法保证,使用时应谨慎。
3.1.3 第三方镜像中心镜像中心默认使用Docker官方Docker Hub。但是,镜像中心可以配置,指定的第三方镜像中心可以使用。第三方镜像中心的仓库名称由三部分组成://。其中< domain-name >是指第三方镜像中心的域名或IP。
3.1.4 镜像定位任何镜像都可以通过:唯一定位。一般叫镜像版本号。有一个特殊的版本——latest。如果不指定,默认为latest。但是,虽然字面意思是最新版,但一般都存放在最新版,但并不能保证真的是最新版。
3.2 镜像相关命令3.2.1 docker pull3.2.1.1 基本用法通过docker pull命令可以从docker中指定镜像 hub把它拉到本地。如果没有指定的镜像,就会抛出一个error。例如,下面的命令是拉zookeeper3.7.1版本镜像。
此时默认为latest,pull命令中的也可以不写。
此时可以看出,目前宿主机已经包含了刚刚下载的两个zookeper镜像。
3.2.1.2 简化日志输出添加选项-q可以简化拉取过程中的日志输出。
3.2.1.3 通过digest拉取docker pull可以通过镜像的digest拉取。语法格式为docker pull @。
| digest,是镜像内容的Hash值,即所谓的Contentent Hash(内容散列)。只要镜像内容发生变化,其内容散列值就会发生变化。请注意,digest包含前面的sha256,这意味着digest生成中使用的hash算法是sha256。
从Docker digest可以在Hub的具体镜像中看到。
3.2.2 docker images3.2.2.1 基础用法通过docker images命令可以查看当地所有的镜像资源信息。这些镜像将根据镜像创建的时间由近到远进行排序。
- REPOSITORY:镜像仓库名称
- TAG:镜像版本号
- IMAGE ID:镜像的唯一标志
- CREATE:创建镜像的时间
- SIZE:镜像大小
docker images可以查看指定镜像的信息。
3.2.2.3 查看完整的镜像ID默认docker images 显示的镜像id是截取后的显示结果,只显示前12位。使用 --no-trunc 完成的镜像id显示在参数后。
3.2.2.4 看镜像digestt--digests选项可以查看所有镜像或指定镜像的digest信息。以后会详细学习digest。
3.2.2.5 只显示镜像ID-Q选项只能显示所有本地镜像的ImageID。这主要是在未来与其他命令一起使用。
3.2.2.6 过滤镜像-F选项用于过滤指定条件的镜像。以下是一些常用的过滤条件。例如,
dangling=true用于过滤悬虚镜像,即没有Repository和tag的镜像。显示了悬虚镜像的REPOSITORY和TAG。
-f before用于列出在本地镜像中指定镜像创建时间之前创建的所有镜像。
-f since用于列出当地镜像中指定镜像创建时间后创建的所有镜像。
-f reference用于列出所有与指定表达式相匹配的镜像。
3.2.2.7 格式化显示该选项用于格式输出docker GO模板需要指定images的内容和格式。例如,
3.2.3 docker search3.2.3.1 基础用法通过docker search命令可以从dockerch开始 在hub上查看指定名称的镜像。
AUTOMATED表示当前镜像是否为“自动化镜像”。自动化镜像是什么?使用Docker Hub连接GitHub仓库或Bitbucket仓库的源代码托管平台,包括Dockerfile文件(专门构建镜像文件),然后Docker Hub将根据Dockerfile内容自动构建镜像。这种构建的镜像将被标记为AUTOMATED,这种构建镜像Trusted的方式称为Trusted Build(受信构建)。只要Dockerfile文件的内容发生变化,那么Docker Hub将构建新的镜像。
3.2.3.2 过滤检索结果用于过滤查询结果。比如下面只查询官方提供的镜像。
3.2.3.3 限制检索数量默许docker search显示25个检索结果,可以通过-limit选项指定显示的结果数量。
3.2.3.4 查看hub官网以上检索方法和从docker开始的 httpshtpshub官网://hub.docker.com 查看是一样的,但是官网没有直观的查看。
3.2.4 docker rmi3.2.4.1 基本用法rmi,remove images。该命令用于删除指定的本地镜像。镜像通过:指定。如果要删除镜像的标签被省略,lastest版本将被默认删除。
3.2.4.2 删除多个镜像docker rmi命令可以一次删除多个镜像,多个要删除的镜像之间使用空间分隔。
3.2.4.3 通过ImageID删除镜像docker rmi还可以通过ImageID指定要删除的镜像。
3.2.4.4 强制删除镜像默认情况下,操作容器的镜像不能删除。在删除相应的镜像之前,必须停止并删除相关容器。然而,也可以通过添加-f选项来强制删除。
3.2.4.5 删除所有镜像使用组合命令删除所有镜像。当然,如果不携带-f选项,打开容器的镜像将不会被删除。
3.2.5 导出/导入镜像我们在本地生成一个镜像,如果我们想在另一台电脑上使用它,我们可以通过导出/导入镜像来完成。
3.2.5.1 导出镜像savedocker save命令用于将一个或多个镜像导出为tar文件。例如,下面的命令是将busybox和hello-world镜像导出到当前/root目录的my.在tar文件中。
3.2.5.2 导入镜像loaddocker load用于导入一个tar文件并将其加载成一个或多个镜像。
操作完成后,可以看到buxybox和hello-world两个镜像都恢复了。
3.3 镜像分层3.3.1 什么是分层Docker镜像由一些松耦合的只读镜像层组成,Docker Daemon负责堆叠这些镜像层,并将其联系成一个统一的整体,即对外显示一个独立的对象。通过docker 当pull命令拉取指定的镜像时,每个pulll complete结尾的行代表下载了一个镜像层。例如,下面的rediss:latest镜像包含6个镜像层。
3.3.2 为什么分层采用这种分层结构有很多优点。例如,每个分层只读取,所有分层修改都以新分层的形式出现,不会破坏原分层内容;另一个例子是,每个分层只记录更改的内容,这有利于节省存储空间。然而,分层结构最大的优点是实现不同镜像之间的资源共享,即不同镜像对同一下层镜像的再利用。对于docker pull命令,在拉取之前,它将首先获得所有要拉取镜像的ImageID,然后在本地找出是否存在这些分层。如果存在,则不再提取,而是共享本地分层。大节点的存储空间和网络带宽提高了提取效率。
3.3.3 镜像层构成每个镜像层由两部分组成:镜像文件系统和镜像json文件。这两部分具有相同的ImageID。镜像文件系统是一个管理镜像占用磁盘空间的文件系统,具有所有镜像层的数据内容。镜像json文件用于通过docker来描述镜像的相关属性 inspect [镜像]可直观看到。
3.3.4 由镜像FS组成docker镜像文件系统FS由多层只读镜像层组成,每层完成特定功能。这些只读镜像层可分为两类:基本镜像层和扩展镜像层。
3.3.4.1 基础镜像层所有镜像的底层都有一个可见的基本镜像层Basee Image,基本镜像层的文件系统称为根文件系统rotfs。rootfs是基于Linux系统中“看不见”的引导文件系统bootfs。
3.3.4.2 扩展镜像层基本镜像层上方的镜像层称为扩展镜像层。顾名思义,它是基本镜像层功能的扩展。在Dockerfile中,每个指令都用于完成特定的功能,每个指令都生成一个扩展镜像层。
3.3.4.3 容器层一旦镜像运行,容器就形成了,容器是运行中的Linux系统,也有文件系统。该容器的文件系统在docker镜像的最外层增加了一个可读写的容器层,只存在于容器层中。因此,任何对容器的操作都不会影响镜像本身。如果需要修改容器层的文件,系统将从容器层到下一层找到文件,直到找到。容器层将记录文件的任何操作。例如,要修改一个文件,容器层将首先将在镜像层中找到的文件复制到容器层,然后进行修改。删除文件只会删除容器层中存在的文件副本。可以看出,Docker容器是一个叠加的文件系统,该容器层称为Union File System,联合文件系统。
3.3.5 LinuxOS启动过程(扩展)现代操作系统是C/S模式的微内核架构,由两部分组成:内核(Server)与服务模块(Client)。botloader和Linux的botfs文件系统由两部分组成kernel。每个容器中的rootft由宿主机的kernel驱动。
3.4 镜像摘要每个镜像都有一个长度为64位的16进制字符串作为摘要digest。
3.4.1 查看摘要docker pull镜像结束后,会给出该拉的镜像摘要digest。
通过docker inspect命令可以查看指定镜像的详细信息。它包含了镜像的摘要。
通过docker images --digests命令还可以查看镜像的摘要信息。
3.4.2 摘要是什么摘要,即digest,是镜像内容的Hash值,即所谓的Contentent Hash(内容散列)。只要镜像内容发生变化,其内容散列值就会发生变化。也就是说,一旦创建了一个镜像,它的digest就不会改变,因为镜像只读。默认情况下,Docker采用的Hash算法是SHA256,即Hah值是长度为256位的二进制值。Docker用16进制表示,即变成64位的字符串。
3.4.3 摘要有何用摘要的主要功能是区分相同的镜像:不同的镜像。例如镜像xxx:2.8在生产运行过程中发现了一个bug。现在修复,用原标签将其push返回仓库,然后覆盖原镜像。但在生产环境中留下了大量的维修前镜像的容器。此时,通过镜像标签无法区分镜像是修复前还是修复后,因为它们的标签是相同的。此时可以通过查看镜像的digest来区分修改前后版本,因为内容发生了变化,digest肯定会发生变化。修复后的镜像可以通过digest拉取,以确保再次拉取。其用法是:docker pull @下面的例子是,首先查出zookeeper:3.8镜像digest,然后删除镜像,然后通过digest拉取。
但不方便的是,镜像摘要需要运维人员在当地手工维护。
3.4.4 分发散列值在push或pull镜像中,镜像被压缩,以减少网络带宽和传输时间。但是压缩会改变镜像内容,导致镜像内容在网络传输后与其digest不一致。出现问题。为了避免这个问题,Docker为镜像配置了Distributionn, Hash(分发散列值)。分发散列值在镜像被压缩后立即计算,然后与压缩镜像一起发送。压缩镜像的分发散列值在接收方接收后立即计算,然后与携带的分发散列值进行比较。如果是一样的,说明传输没有问题。
3.5 3.5多架构镜像.1 多架构镜像是什么?Multi-architecture Image,也就是说,多架构镜像是针对不同操作系统/系统架构的不同镜像实现的。也就是说,多架构镜像中包含的镜像是相同的,但它们针对的操作系统/系统架构是不同的。
3.5.2 多架构镜像原理无论用户使用什么操作系统/系统架构,它都是通过docker使用的 pull命令必须为操作系统/系统架构提取镜像,用户无需考虑操作系统/系统架构。Docker Hub可以根据提交pull请求的Docker系统的架构自动选择相应的镜像。
在Docker 在Hub中,镜像的多架构信息保存在Manifest文件中。拉取镜像时,Docker将当前Docker系统的OS和架构信息随pull命令提交给Docker Hub。Docker Hub首先会根据镜像找出Manifest是否存在。如果不存在,直接搜索并返回:镜像可以;如果存在,将在manifest中查找指定系统/架构的镜像。如果存在系统/架构,则根据Manifest中记录的地址找到镜像的位置。
3.6 总结3.6.1 镜像基础- 了解镜像是一个简化的操作系统。
- 了解三类镜像仓库提供的镜像都有质量保证。
- 掌握镜像相关命令的基本用法。
- 了解什么是自动化镜像:使用Docker Hub连接GitHub或Bitbucket仓库,包括Dockerfile,然后Docker 根据Dockerfile自动构建的Hub镜像将被标记为Automated Build。
- 理解镜像分层的目的是在不同的镜像之间共享镜像层。
- 了解镜像层由镜像FS和镜像描述json文件组成。docker镜像FS由多层只读镜像FS组成。
- 只读镜像层分为基本镜像层和扩展镜像层,基本镜像层的FS称为rootfs。容器的顶层是可读写的容器层。
- 现代操作系统采用微内核架构,采用C/S模式,由内核两部分组成:(Server)与服务模块(Client)。
- botloader和botfs主要由两部分组成kernel。bootloder主要负责将kernel加载到内存中,并引导kernel启动。当kernel启动时,bootfss将内存的使用权完全转移到kernel,然后kernel卸载bootfs。
- 了解digest的主要功能是区分相同的镜像:不同的镜像。
- 理解Distribution的分发列值 Hash的功能或意义:为了解决网络传输压缩后命令携带的digest与重新计算的镜像digest不一致的问题。
- 了解为什么需要多架构镜像:由于不同的OS使用不同的类库,不同的ARCH使用不同的指令系统,不同的OS/ARCH设计的镜像是不同的。
- 根据提交pull请求的Docker系统了解OS//ARCH,Docker Hub会自动选择相应的镜像。
- 了解多架构镜像信息存储在Docker中 在Hub的Manifest文件中,了解多架构镜像的实现原理。