Docker三大核心组件:镜像、容器与仓库,你了解多少呢?

镜像(Image),容器(Container),仓库(Repository)是我们常说的Docker的三大组件,在这篇文章中,我们就来一起详细地探索一番吧 。

Docker三大核心组件:镜像、容器与仓库,你了解多少呢?

文章插图
 
01 镜像(Image)什么是Docker镜像?
简单地理解,Docker镜像就是一个linux的文件系统(Root FileSystem),这个文件系统里面包含可以运行在Linux内核的程序以及相应的数据 。
谈到这里,我们可能需要先补充一点与Linux操作系统相关的知识:
一般而言,Linux分为两个部分:Linux内核(Linux Kernel)与用户空间,而真正的Linux操作系统,是指Linux内核,我们常用的Ubuntu,centos等操作系统其实是不同厂商在Linux内核基础上添加自己的软件与工具集(tools)形成的发布版本(Linux Distribution) 。
因此,我们也可以把镜像看成是上面所说的用户空间,当Docker通过镜像创建一个容器时,就是将镜像定义好的用户空间作为独立隔离的进程运行在宿主机的Linux内核之上 。
这里要强调一下镜像的两个特征:
  1. 镜像是分层(Layer)的:即一个镜像可以多个中间层组成,多个镜像可以共享同一中间层,我们也可以通过在镜像添加多一层来生成一个新的镜像 。
  2. 镜像是只读的(read-only):镜像在构建完成之后,便不可以再修改,而上面我们所说的添加一层构建新的镜像,这中间实际是通过创建一个临时的容器,在容器上增加或删除文件,从而形成新的镜像,因为容器是可以动态改变的 。
通过下面的示意图,我可以更好地理解Docker镜像与Linux的关系:
Docker三大核心组件:镜像、容器与仓库,你了解多少呢?

文章插图
 
1.1 操作镜像的命令
Docker中与镜像操作相关的命令都在docker image这条子命令下,通过docker image --help这条命令,可以看到docker image子命令的详细文档,如下:
Usage: docker image COMMANDManage imagesCommands: build Build an image from a Dockerfile(构建镜像的命令) history Show the history of an image(显示镜像构建历史过程) import Import the contents from a tarball to create a filesystem image(导入一个由容器导出的镜像) inspect Display detailed information on one or more images(显示一个镜像的详细信息) load Load an image from a tar archive or STDIN(从一个文件或标准输入流中导入镜像) ls List images(查看镜像列表) prune Remove unused images(删除虚悬镜像) pull Pull an image or a repository from a registry(从仓库拉取镜像) push Push an image or a repository to a registry(推送镜像到仓库) rm Remove one or more images(删除镜像) save Save one or more images to a tar archive (streamed to STDOUT by default)(保存镜像到文件) tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE(给镜像打标签)【Docker三大核心组件:镜像、容器与仓库,你了解多少呢?】1.2 获取镜像
在安装了Docker之后,我们本地并没有任何镜像,当然我们可以自己构建,不过更方便还是从Docker官方提供的仓库服务Docker Hub上拉取官方或第三方已经构建好的镜像 。
拉取镜像可以使用docker image pull,其格式如下:
docker image pull [OPTIONS] NAME[:TAG|@DIGEST]当然,docker image pull有更简洁的用法:如:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]要拉取镜像,需要指定Docker Registry的URL和端口号,默认是Docker Hub,另外还需要指定仓库名和标签,仓库名和标签唯一确定一个镜像,而标签是可能省略,如果省略,则默认使用latest作为标签名,而仓库名则由作者名和软件名组成 。
所以,在省略了那么参数后,比如我们想拉取centos镜像,可以使用下面简单的命令从Docker Hub上拉到:
$ docker pull centos1.3 查看本地镜像
通过上面的方法我们将镜像拉取到了本地,那要如何查看本地有哪些镜像呢?通过下面的命令我们可以查看本地的全部镜像:
$ docker image ls当然Docker提供了更简洁的写法,如下:
$ docker images1.3.1 虚悬镜像
我们知道Docker镜像名由仓库名和标签组成,但有时候我们会看到仓库名和标签皆为<none>的镜像,我们称为这种镜像为虚悬镜像,如下图所示:
Docker三大核心组件:镜像、容器与仓库,你了解多少呢?

文章插图
 
虚悬镜像一般是当我们使用docker pull拉取最新镜像时,生成的新的镜像,所以仓库名和标签给了新的镜像,旧的镜像仓库和标签则被取消,成为虚悬镜像 。
我们可以使用下面的语句打印所有的虚悬镜像:
$ docker image ls -f dangling=true


推荐阅读