新用户注册入口 老用户登录入口

[转载]docker镜像详解 docker命令详解

文章作者:转载 更新时间:2023-11-26 15:47:20 阅读数量:537
文章标签:Docker
本文摘要:本文深入剖析了Docker的核心概念,围绕容器与镜像的差异、统一文件系统的工作机制展开,并通过解析关键Docker命令如`docker create`、`docker run`、`docker ps`等,阐述了容器和镜像的创建、启动、运行状态查看及管理。文章详细介绍了可读写层在容器与镜像间的重要区别,以及元数据在镜像层中的存储位置。同时,还探讨了运行态容器的定义及其与进程隔离空间的关系,强调理解Docker底层原理对于有效使用这一工具的重要性。通过解读这些技术细节,读者能更好地掌握Docker镜像构建、保存、导出及历史追溯等相关操作。
转载文章

本篇文章为转载内容。原文链接:https://blog.csdn.net/u010098331/article/details/53485539。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。


这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别。 



当我对Docker技术还是一知半解的时候,我发现理解Docker的命令非常困难。于是,我花了几周的时间来学习Docker的工作原理,更确 切地说,是关于Docker统一文件系统(the union file system)的知识,然后回过头来再看Docker的命令,一切变得顺理成章,简单极了。 

题外话:就我个人而言,掌握一门技术并合理使用它的最好办法就是深入理解这项技术背后的工作原理。通常情况 下,一项新技术的诞生常常会伴随着媒体的大肆宣传和炒作,这使得用户很难看清技术的本质。更确切地说,新技术总是会发明一些新的术语或者隐喻词来帮助宣 传,这在初期是非常有帮助的,但是这给技术的原理蒙上了一层砂纸,不利于用户在后期掌握技术的真谛。 

Git就是一个很好的例子。我之前不能够很好的使用Git,于是我花了一段时间去学习Git的原理,直到这时,我才真正明白了Git的用法。我坚信只有真正理解Git内部原理的人才能够掌握这个工具。 

Image Definition

镜像(Image)就是一堆只读层(read-only layer)的统一视角,也许这个定义有些难以理解,下面的这张图能够帮助读者理解镜像的定义。 



从左边我们看到了多个只读层,它们重叠在一起。除了最下面一层,其它层都会有一个指针指向下一层。这些层是Docker内部的实现细节,并且能够 在主机(译者注:运行Docker的机器)的文件系统上访问到。统一文件系统(union file system)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。 我们可以在图片的右边看到这个视角的形式。 

你可以在你的主机文件系统上找到有关这些层的文件。需要注意的是,在一个运行中的容器内部,这些层是不可见的。在我的主机上,我发现它们存在于/var/lib/docker/aufs目录下。 

sudo tree -L 1 /var/lib/docker/

/var/lib/docker/
├── aufs
├── containers
├── graph
├── init
├── linkgraph.db
├── repositories-aufs
├── tmp
├── trust
└── volumes
7 directories, 2 files

 

Container Definition

容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。 



细心的读者可能会发现,容器的定义并没有提及容器是否在运行,没错,这是故意的。正是这个发现帮助我理解了很多困惑。 

要点:容器 = 镜像 + 可读层。并且容器的定义并没有提及是否要运行容器。 

接下来,我们将会讨论运行态容器。 

Running Container Definition

一个运行态容器(running container)被定义为一个可读写的统一文件系统加上隔离的进程空间和包含其中的进程。下面这张图片展示了一个运行中的容器。 



正是文件系统隔离技术使得Docker成为了一个前途无量的技术。一个容器中的进程可能会对文件进行修改、删除、创建,这些改变都将作用于可读写层(read-write layer)。下面这张图展示了这个行为。 



我们可以通过运行以下命令来验证我们上面所说的: 

docker run ubuntu touch happiness.txt


即便是这个ubuntu容器不再运行,我们依旧能够在主机的文件系统上找到这个新文件。 

find / -name happiness.txt

/var/lib/docker/aufs/diff/860a7b...889/happiness.txt

 

Image Layer Definition

为了将零星的数据整合起来,我们提出了镜像层(image layer)这个概念。下面的这张图描述了一个镜像层,通过图片我们能够发现一个层并不仅仅包含文件系统的改变,它还能包含了其他重要信息。 



元数据(metadata)就是关于这个层的额外信息,它不仅能够让Docker获取运行和构建时的信息,还包括父层的层次信息。需要注意,只读层和读写层都包含元数据。 



除此之外,每一层都包括了一个指向父层的指针。如果一个层没有这个指针,说明它处于最底层。 



Metadata Location: 
我发现在我自己的主机上,镜像层(image layer)的元数据被保存在名为”json”的文件中,比如说: 

/var/lib/docker/graph/e809f156dc985.../json


e809f156dc985...就是这层的id 

一个容器的元数据好像是被分成了很多文件,但或多或少能够在/var/lib/docker/containers/<id>目录下找到,<id>就是一个可读层的id。这个目录下的文件大多是运行时的数据,比如说网络,日志等等。 

全局理解(Tying It All Together)

现在,让我们结合上面提到的实现细节来理解Docker的命令。 

docker create <image-id>


docker create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。注意,这个容器并没有运行。 



docker start <container-id>


Docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。 

docker run <image-id>


看到这个命令,读者通常会有一个疑问:docker start 和 docker run命令有什么区别。 



从图片可以看出,docker run 命令先是利用镜像创建了一个容器,然后运行这个容器。这个命令非常的方便,并且隐藏了两个命令的细节,但从另一方面来看,这容易让用户产生误解。 

题外话:继续我们之前有关于Git的话题,我认为docker run命令类似于git pull命令。git pull命令就是git fetch 和 git merge两个命令的组合,同样的,docker run就是docker create和docker start两个命令的组合。 


docker ps


docker ps 命令会列出所有运行中的容器。这隐藏了非运行态容器的存在,如果想要找出这些容器,我们需要使用下面这个命令。 

docker ps –a


docker ps –a命令会列出所有的容器,不管是运行的,还是停止的。 

docker images


docker images命令会列出了所有顶层(top-level)镜像。实际上,在这里我们没有办法区分一个镜像和一个只读层,所以我们提出了top-level 镜像。只有创建容器时使用的镜像或者是直接pull下来的镜像能被称为顶层(top-level)镜像,并且每一个顶层镜像下面都隐藏了多个镜像层。 

docker images –a


docker images –a命令列出了所有的镜像,也可以说是列出了所有的可读层。如果你想要查看某一个image-id下的所有层,可以使用docker history来查看。 

docker stop <container-id>


docker stop命令会向运行中的容器发送一个SIGTERM的信号,然后停止所有的进程。 

docker kill <container-id>


docker kill 命令向所有运行在容器中的进程发送了一个不友好的SIGKILL信号。 


docker pause <container-id>


docker stop和docker kill命令会发送UNIX的信号给运行中的进程,docker pause命令则不一样,它利用了cgroups的特性将运行中的进程空间暂停。具体的内部原理你可以在这里找到:https://www.kernel.org/doc/Doc ... m.txt,但是这种方式的不足之处在于发送一个SIGTSTP信号对于进程来说不够简单易懂,以至于不能够让所有进程暂停。 

docker rm <container-id>


docker rm命令会移除构成容器的可读写层。注意,这个命令只能对非运行态容器执行。 

docker rmi <image-id>


docker rmi 命令会移除构成镜像的一个只读层。你只能够使用docker rmi来移除最顶层(top level layer)(也可以说是镜像),你也可以使用-f参数来强制删除中间的只读层。 

docker commit <container-id>


docker commit命令将容器的可读写层转换为一个只读层,这样就把一个容器转换成了不可变的镜像。 



docker build


docker build命令非常有趣,它会反复的执行多个命令。 



我们从上图可以看到,build命令根据Dockerfile文件中的FROM指令获取到镜像,然后重复地1)run(create和start)、2)修改、3)commit。在循环中的每一步都会生成一个新的层,因此许多新的层会被创建。 

docker exec <running-container-id>


docker exec 命令会在运行中的容器执行一个新进程。 

docker inspect <container-id> or <image-id>


docker inspect命令会提取出容器或者镜像最顶层的元数据。 

docker save <image-id>


docker save命令会创建一个镜像的压缩文件,这个文件能够在另外一个主机的Docker上使用。和export命令不同,这个命令为每一个层都保存了它们的元数据。这个命令只能对镜像生效。 

docker export <container-id>


docker export命令创建一个tar文件,并且移除了元数据和不必要的层,将多个层整合成了一个层,只保存了当前统一视角看到的内容(译者注:expoxt后 的容器再import到Docker中,通过docker images –tree命令只能看到一个镜像;而save后的镜像则不同,它能够看到这个镜像的历史镜像)。 

docker history <image-id>


docker history命令递归地输出指定镜像的历史镜像。 

 参考:

http://www.cnblogs.com/bethal/p/5942369.html

本篇文章为转载内容。原文链接:https://blog.csdn.net/u010098331/article/details/53485539。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

相关阅读
文章标题:[转载][洛谷P1082]同余方程

更新时间:2023-02-18
[转载][洛谷P1082]同余方程
文章标题:[转载]webpack优化之HappyPack实战

更新时间:2023-08-07
[转载]webpack优化之HappyPack实战
文章标题:[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法

更新时间:2023-09-10
[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法
文章标题:[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo

更新时间:2024-03-11
[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo
文章标题:[转载]程序员也分三六九等?等级差异,一个看不起一个!

更新时间:2024-05-10
[转载]程序员也分三六九等?等级差异,一个看不起一个!
文章标题:[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集

更新时间:2024-01-12
[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集
名词解释
作为当前文章的名词解释,仅对当前文章有效。
Docker统一文件系统(Union File System)在Docker技术中,统一文件系统是一种将多个文件系统层合并成一个单一视图的机制。它允许容器和镜像通过堆叠只读层的方式构建,每个层代表了对文件系统的更改或添加内容。当容器运行时,最上层为可读写层,其下的只读层则提供了容器的基础环境和应用依赖。这样设计的优点在于能够实现高效的存储和快速的部署,因为多个容器可以共享底层的只读层,同时保持各自的独立性和可变性。
进程隔离空间(Process Isolation Space)在Docker中,进程隔离空间是指为容器内的进程提供的一种资源隔离机制,确保容器内部的进程与主机和其他容器的进程互不影响。Docker利用操作系统级别的功能如控制组(cgroups)和命名空间(namespaces)来实现这一目标。每个运行态容器都有自己的独立进程空间,限制了它们对CPU、内存、网络、磁盘等资源的访问,并且让容器内的进程看起来像是在独立的操作系统环境中运行。
镜像层(Image Layer)在Docker镜像结构中,镜像层是构成镜像的基本单元。每一个镜像层代表了对文件系统的一次修改或新增内容,且每一层都包含相应的元数据以及指向其父层的指针。镜像层之间采用堆叠的方式组合在一起,形成最终的镜像。这种分层的设计使得镜像能够高效地复用已有的层,并且便于跟踪和理解镜像的历史变更记录。在创建容器时,基于镜像最上面加上一层可读写层,从而保证了容器具有独立的存储空间,可以在不改变镜像本身的情况下进行持久化存储或者动态调整。
延伸阅读
作为当前文章的延伸阅读,仅对当前文章有效。
在深入理解了Docker的核心概念,包括容器与镜像的差异、统一文件系统的工作机制以及关键Docker命令之后,我们发现Docker技术在现代云原生应用开发和部署中的地位日益凸显。近日,Docker公司发布了Docker Desktop 4.0版本,进一步优化了开发者体验,提供了对Kubernetes集群更便捷的管理支持,并增强了对macOS Monterey和Windows 11操作系统的兼容性。
此外,随着容器安全问题受到越来越多的关注,Docker也正在强化其安全特性。2022年,Docker宣布将与Snyk等安全工具进行深度集成,以实现容器镜像漏洞扫描及修复的一体化流程。同时,业界也在探索零信任安全模型如何应用于容器领域,以确保容器在整个生命周期内的安全性。
另一方面,考虑到容器编排的重要性,Kubernetes作为主流的容器编排平台,其与Docker的协同使用愈发紧密。通过学习官方文档或社区教程,用户可以深入了解如何利用Docker构建并推送镜像至私有仓库,再由Kubernetes调度器拉取这些镜像以部署复杂的应用服务网格。
综上所述,掌握Docker不仅是了解基础容器技术的关键,而且还需要关注其最新发展动态和技术生态演进,例如新版本特性、安全增强措施以及与Kubernetes等生态系统组件的深度融合。对于希望进一步提升DevOps能力的专业人士来说,持续跟进Docker相关领域的前沿研究与实践案例,无疑能为自身技术栈的丰富与完善提供强大支撑。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
set -o vi 或 set -o emacs - 切换shell的命令行编辑模式。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
RabbitMQ实战中因API版本问题导致消息丢失的排查与修复 03-12 jQuery元素滚动动画库插件-ScrollMagic 02-09 属性级联同步与实体管理:Hibernate实战案例详解 01-27 jQuery超酷3D包装盒封面旋转特效 05-16 ElSteps组件动态改变当前步骤时样式更新滞后问题的Vue.js解决方案 02-22 java中处理异常的方式和语句 01-13 AI助手的工作原理与限制:无法按特定要求撰写的原因及信息处理分析 12-27 代码写的html网红钟表 12-18 简约大气文艺工作者作品展示网站模板 09-21 本次刷新还10个文章未展示,点击 更多查看。
ClickHouse系统重启情境下的数据丢失风险与应对:写入一致性、同步模式及备份恢复策略实践 08-27 jQuery带放大镜的迷你幻灯片插件 08-16 简约手机UI设计公司网站模板下载 04-30 绿色经典响应式主机服务器托管网站模板 04-25 PostgreSQL中应对密码过期警告:安全更改密码的步骤与注意事项 04-17 docker改tag(docker改配置文件) 03-17 [转载]蓝桥 利息计算(Java) 03-11 jquery文字动画特效插件animatext 01-22 大气简洁手机电子产品展示柜台前端模板 01-22 [转载]ubuntu用户和权限介绍 01-10 可爱毛绒玩具网上商城响应式网站模板 01-05
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"