镜像操作命令格式
1 拉取镜像
1.1 拉取镜像基本操作
docker pull <镜像名字> :<标签名>
命令功能:从docker hub上拉取镜像至本地
<镜像名字>:想要拉取的镜像名字
<标签名>:若不指定标签名,通常会拉取标签名为“latest”的镜像,但有意思的是标签名为“latest”的镜像却不一定就是最新版本的镜像。
Q:为什么需要<标签名>?
A:因为一个镜像存在多个版本,例如一个ubuntu的镜像,或许存在3.1版本的ubuntu,也可能存在3.2版本的ubuntu。因此需要通过指定<标签名>来指定特定版本的镜像。
1.2拉取镜像进阶操作
假设存在一个bugDemon:1.5的镜像,这个镜像存在bug。在这个bug被暴露之前,已经使用这个bugDemon:1.5生成了许多容器。在随后的使用过程中,发现了这个bugDemon:1.5的bug,在本地对其进行修改后,使用相同的标签将更新后的镜像重新推送回仓库。在随后的任务中,若需要使用更新后的bugDemon:1.5再次生成容器,这将会引发一个问题:如何区分一个容器是否是由存在bug的bugDemon:1.5镜像所生成的还是由不存在bug的bugDemon:1.5所生成?因为这两个bugDemon共享同一个<标签名>,即1.5。为解决次问题,使用image digets准确地拉取镜像。
docker pull <镜像名字> @< image digets>
< image digets>:一长串十六进制位串用于来标记镜像,关于image id和image digets的区别,暂未知。
Exp: docker pull alpine@ sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb
ps:为@后面一长串十六进制序列取了一个名字,这个名字就是image digets。alpine是一个镜像名字。
Q:如何获得一个镜像的image digets?
A:使用命令docker image ls - -digests alpine。
1.3 总结
使用标签拉取镜像操作方便快捷,但容易出现指代不清的情况,若两个镜像公用一个标签名,将出现误操作。使用image digets拉取镜像,总能够准确的拉取到想要的镜像,但较复杂。本质就在于image digets能够唯一标识镜像,而镜像标签不能够唯一标识镜像。
2 使用镜像创建容器
2.1 创建容器基本操作
docker run <选项> < images> : < tag>:< app>
命令功能:使用< images>去创建一个容器,并在容器中运行
< app>。
<选项>:暂时已知-it,这使得容器与终端连接,容器的输入输出都会被重定向至终端中。
< images>:镜像名。
< tag>:镜像标签。
< app>:application,即容器中的进程。在前面几个博客中提到进程组的概念,也揭示了容器本质上是一个进程组。跟据进程组的生命周期可知道,创建容器时必须至少要指定一个进程使其运行在容器中,否则将无法启动容器。
Exp: docker run -it ubuntu /bin/bash
运行该条命令后,终端将会显示**root@22a185ea32a3:/#**这是ubuntu的/bin/bash程序。使用ctrl + p + q可以退回到终端中,且容器不会被终止运行,容器将在后台中继续运行。
Q:如何查看在系统后台中运行的容器?
A:使用命令 docker ps。
2.2 删除和停止容器
docker container stop <容器ID>
docker container rm <容器ID>
Q:为什么需要先停止容器再删除?
A:Linux系统下,stop命令会向容器中的进程发送SIGTERM信号,这个SIGTERM信号是可以通过signal函数修改其行为的,即是可以被捕获的。一旦当其被捕获之后,可以是进程跳转到handler程序,进行特定的处理。因此率先使用stop命令,让容器停下手中工作,转去做一些善后工作,例如保存当前任务进度,将数据写入磁盘等。
BTW:signal函数原型
sighandler_t siganal(int signum,sighandler_t handler)
若handler == SIG_IGN,则忽略signum的信号。
若handler == SIG_DFL,则保持signum信号的默认行为。
若handler == 函数地址,则捕获到signum的信号立即跳转至函数地址处执行程序。
Q:container rm命令是什么?
A:Linux系统下,rm命令就是向进程发送SIGKILL信号。懂得吧,所以为什么要先来一个stop命令。
3 删除镜像
3.1 删除镜像基本命令操作
docker image rm <镜像ID>
命令功能:删除指定的镜像。因为镜像层是可以被共享的,且镜像在被删除时,是按照一层一层镜像层顺序删除的,因此只有当全部依赖某一个镜像层的镜像都被删除后,该镜像才能被删除,即该条命令才能被执行成功。除此之外,该条命令生效之前,要求由该镜像层生成的容器必须全部被停止。
Q:如何查看镜像ID?
A:使用命令docker image ls。
Q:删除镜像和删除容器的区别是什么?
A:删除容器是指结束容器进程,让容器不再挂在后台上运行。删除镜像则是将镜像从本地磁盘上抹去,下次需要再次使用镜像创建容器,就不得不需要重新从docker hub上下载。