镜像是一个用于在Docker容器中执行代码的文件。镜像作为一组指令来构建Docker容器,就像模板一样。docker镜像也可以作为使用Docker的起点。映像相当于虚拟机(VM)环境中的快照。
docker用于在容器中创建、运行和部署应用程序。镜像包含应用程序代码、库、工具、依赖项和其他使应用程序运行所需的文件。当用户运行一个镜像时,它可以成为一个容器的一个或多个实例。
通常,一个镜像是基于另一个镜像的,还需要进行一些额外的定制。例如,您可以构建基于ubuntu镜像的镜像,但会在你的镜像中会添加Apache Web服务器和您的应用程序,以及运行应用程序所需的配置详细信息。
您可以创建自己的镜像,也可以只使用其他人创建并发布在registry中的镜像。要构建您自己的镜像,您需要创建一个Dockerfile,它具有简单的语法,用于定义创建镜像和运行镜像所需的步骤。Dockerfile中的每个指令都在镜像中创建一个层。
当您更改Dockerfile并重新构建镜像时,只会重新构建那些已更改的层。与其他虚拟化技术相比,这就是镜像如此轻量级、小巧和快速的部分原因。
容器是镜像的可运行实例。您可以使用Docker API或CLI创建、启动、停止、移动或删除容器。您可以将容器连接到一个或多个网络,将存储附加到其中,甚至根据其当前状态创建新镜像。
如果读者之前曾经是VM管理员,则可以把Docker镜像理解为VM模板,VM模板就像停止运行的VM,而Docker镜像就像停止运行的容器;如果读者是一名研发人员,可以将镜像理解为类(Class)。
我们说到镜像就像停止运行的容器(类)。实际上,读者可以停止某个容器的运行,并从中创建新的镜像。在该前提下,镜像可以理解为一种构建时(build-time)结构,而容器可以理解为一种运行时(run-time)结构,如下图所示
相关命令
docker image help
- build 从Dockerfile构建一个映像
- history 显示镜像的历史
- import 从tarball导入内容以创建文件系统映像
- inspect 显示一个或多个图像的详细信息
- load 从tar存档或STDIN加载镜像
- ls 显示镜像列表
- prune 删除未使用的镜像
- pull 从registry中提取镜像或存储库
- push 推送镜像或存储库到registry
- rm 删除一个或多个镜像
- save 将一个或多个图像保存到tar存档
- tag 创建一个引用SOURCE_IMAGE的TARGET_IMAGE标记
子命令help信息:
docker image subCommand —help 例如docker image build –help
拉取
将镜像取到Docker主机本地的操作是拉取。 Docker镜像存储在镜像仓库服务(ImageRegistry)当中。Docker客户端的镜像仓库服务是可配置的,默认使用Docker Hub。
Docker Hub也分为官方仓库(Official Repos-itory)和非官方仓库(Unofficial Repository)。
顾名思义,官方仓库中的镜像是由Docker公司审查的。这意味着其中的镜像会及时更新,由高质量的代码构成,这些代码是安全的,有完善的文档和最佳实践。
非官方仓库更像江湖侠客,其中的镜像不一定具备官方仓库的优点,但这并不意味着所有非官方仓库都是不好的!非官方仓库中也有一些很优秀的镜像。
大部分流行的操作系统和应用在Docker Hub的官方仓库中都有其对应镜像。这些镜像很容易找到,基本都在Docker Hub命名空间的顶层。
只需要给出镜像的名字和标签,就能在官方仓库中定位一个镜像(采用“:”分隔)。从官方仓库拉取镜像时,docker image pull命令的格式如下。
docker image pull <repository>:<tag>
在docker image pull命令中指定-a参数来拉取仓库中的全部镜像。
假如我们想拉取nginx,那么我们可以进入https://hub.docker.com/,然后进行搜索,假如我们搜索nginx
然后选择官方的镜像
然后点击对应的链接
我们可以看到有这些标签是可以提供拉取的。我们可以随便试一个标签,这些都是可以拉取的。
构建
首先我们创建一个Dockerfile
然后切换到对应目录下面,使用docker image build命令,可以根据Dockerfile中的指令来创建新的镜像。
这时候我们发现镜像创建成功了。
查看
我们可以看到,刚才创建的镜像也在这里,并且REPOSITORY和TAG列也对应上我们刚才的-t参数。
过滤
ls不加任何参数的时候,有时候看到的镜像会很多,我们要加一些过滤条件,只查看我们想要看的镜像
下面我们看一下这个filter支持哪些操作。
过滤标志(-f或——filter)格式为“key=value”。如果有多个过滤器,则传递多个标志(例如,–filter “foo=bar” –filter “bif=baz”)。
目前支持的过滤器有:
- dangling (boolean – true or false)
- label (label=<key> or label=<key>=<value>)
- before (<image-name>[:<tag>], <image id> or <image@digest>) –
- since (<image-name>[:<tag>], <image id> or <image@digest>) –
- reference (pattern of an image reference)
显示未标签的镜像:
dangling=true就是REPOSITORY和TAG为none的,dangling=false就是REPOSITORY和TAG不为none的
label:根据label查出对应的镜像
这里的label指的就是Dockerfile里面的label。
根据时间过滤
我们现在有这么多镜像,那我们现在有一个需求,我只想看laradock_redis之前的镜像,那么我们就可以用到before了
假如我们想看laradock_redis之后的镜像,那么怎么办呢,我们可以用since。
REFERENCE过滤
如果有多个–filter=reference, 那么这是一个或的关系
显示格式
我们有时候docker image ls 一下,查看查出来的列太多了,我们不需要这么多,那么这时候就可以用到
有以下几列:
- .ID 镜像ID
- .Repository 镜像库
- .Tag 镜像标签
- .Digest 镜像摘要
- .CreatedSince 自镜像创建以来经过的时间
- .CreatedAt 镜像创建的时间
- .Size 镜像的磁盘大小
下面我们来一个例子:
但我们发现没有对应列的名称了,那么我们只需要加上table就可以了
查看历史
显示一个或多个镜像的详细信息
Docker镜像由一些松耦合的只读镜像层组成,如下图所示:
我们可以拉取一个新的镜像来讲解一下。
在上面输出内容中,以Pull complete结尾的每一行都代表了镜像中某个被拉取的镜像层。可以看到,这个镜像包含5个镜像层。
另一种查看镜像分层的方式是通过docker image inspect命令
缩减之后的输出也显示该镜像包含5个镜像层。只不过这次的输出内容中使用了镜像的SHA256散列值来标识镜像层。不过,两种命令都显示了镜像包含5个镜像层。
至于其他的命令,我在这里就不在做讲解了,大家可以直接试一下。
参考资料
https://docs.docker.com/engine/docker-overview/
《深入浅出Docker》