镜像是一个只读的 Docker 容器模板,蕴含启动容器所须要的所有文件系统构造和内容。简略来讲,镜像是一个非凡的文件系统,它提供了容器运行时所需的程序、软件库、资源、配置等静态数据。即镜像不蕴含任何动态数据,镜像内容在构建后不会被扭转。
容器目标就是运行利用或者服务,这意味着容器的镜像中必须蕴含利用 / 服务运行所必须的操作系统和利用文件。然而,容器又谋求疾速和玲珑,这意味着构建镜像的时候通常须要裁剪掉不必要的局部,放弃较小的体积。例如,Docker 镜像通常不会蕴含 6 个不同的 Shell 让读者抉择——通常 Docker 镜像中只有一个精简的 Shell,甚至没有 Shell。 镜像中还不蕴含内核——容器都是共享所在 Docker 主机的内核,所以有时会说容器仅蕴含必要的操作系统(通常只有操作系统文件和文件系统对象)。
镜像操作
拉取镜像
Docker 镜像的拉取应用 docker pull 命令,命令格局个别为 docker pull [Registry]/[Repository]/[Image]:[Tag]。Linux Docker 主机本地镜像仓库通常位于 /var/lib/docker/<storage-driver>。
- Registry 为注册服务器,Docker 默认会从 docker.io 拉取镜像,如果你有本人的镜像仓库,能够把 Registry 替换为本人的注册服务器。
- Repository 为镜像仓库,通常把一组相关联的镜像归为一个镜像仓库,library 为 Docker 默认的镜像仓库。
- Image 为镜像名称。
- Tag 为镜像的标签,如果你不指定拉取镜像的标签,默认为 latest。
注:标有 latest 标签的镜像不保障这是仓库中最新的镜像。
例如,咱们须要获取一个 busybox 镜像,能够执行以下命令:
busybox 是一个集成了数百个 Linux 命令(例如 curl、grep、mount、telnet 等)的精简工具箱。
$ docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
61c5ed1cbdf8: Pull complete
Digest: sha256:4f47c01fa91355af2865ac10fef5bf6ec9c7f42ad2321377c21e844427972977
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
实际上执行 docker pull busybox 命令,都是先从本地搜寻,如果本地搜寻不到 busybox 镜像则从 Docker Hub 下载镜像。
查看镜像
Docker 镜像查看应用 docker images 或者 docker image ls 命令。如果咱们想要查问指定的镜像,也能够应用 docker image ls 命令来查问。
$ docker image ls busybox
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 018c9d7b792b 3 weeks ago 1.22MB
Docker 提供 –filter 参数来过滤 docker image ls 命令返回的镜像列表内容。Docker 目前反对如下的过滤器:
- dangling:能够指定 true 或者 false,仅返回悬虚镜像(true),或者非悬虚镜像(false)。
- before:须要镜像名称或者 ID 作为参数,返回在之前被创立的全副镜像。
- since:与 before 相似,不过返回的是指定镜像之后创立的全副镜像。
- label:依据标注(label)的名称或者值,对镜像进行过滤。docker image ls 命令输入中不显示标注内容。
其余的过滤形式能够应用 reference。
也能够应用 –format 参数来通过 Go 模板对输入内容进行格式化。如果须要更简单的过滤,能够应用 OS 或者 Shell 自带的工具,比方 grep 或者 awk。
重命名镜像
如果你想要自定义镜像名称或者推送镜像到其余镜像仓库,你能够应用 docker tag 命令将镜像重命名。docker tag 的命令格局为 docker tag SOURCE_IMAGE TARGET_IMAGE。
一个镜像能够依据用户须要设置多个标签,标签是寄存在镜像元数据中的任意数字或字符串。
上面通过实例演示一下:
$ docker tag busybox:latest mybusybox:latest
执行完 docker tag 命令后,能够应用查问镜像命令查看一下镜像列表:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 018c9d7b792b 3 weeks ago 1.22MB
mybusybox latest 018c9d7b792b 3 weeks ago 1.22MB
能够看到,镜像列表中多了一个 mybusybox 的镜像,busybox 和 mybusybox 这两个镜像的 IMAGE ID 是齐全一样的。实际上它们指向了同一个镜像文件,只是别名不同而已。
搜寻镜像
docker search 命令容许通过 CLI 的形式搜寻 Docker Hub。读者能够通过“NAME”字段的内容进行匹配,并且基于返回内容中任意列的值进行过滤。
$ docker search aipine
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
wangyulong/aipine_go_jmeter_mysql_redis 0
anjia0532/alpine-package-mirror aipine mirror server 0 [OK]
potachaidocker/aipineweb aipineweb 0
能够应用 –filter “is-official=true”,使命令返回内容只显示官网镜像。默认状况下,Docker 只返回 25 行后果。读者能够指定 –limit 参数来减少返回内容行数,最多为 100 行。
删除镜像
能够应用 docker rmi 或者 docker image rm 命令删除镜像。
$ docker rmi mybusybox
Untagged: mybusybox:latest
删除操作会在以后主机上删除该镜像以及相干的镜像层。这意味着无奈通过 docker image ls 命令看到删除后的镜像,并且对应的蕴含镜像层数据的目录会被删除。然而,如果某个镜像层被多个镜像共享,那只有当全副依赖该镜像层的镜像都被删除后,该镜像层才会被删除。
如果被删除的镜像上存在运行状态的容器,那么删除操作不会被容许。再次执行删除镜像命令之前,须要进行并删除该镜像相干的全副容器。
镜像实现原理
Docker 镜像由一些松耦合的只读镜像层组成,Docker 负责重叠这些镜像层,并且将它们示意为单个对立的对象。镜像底层的实现依赖于联结文件系统(UnionFS)。
一种查看镜像分层的形式是通过 docker image inspect 命令:
$ docker image inspect ubuntu:latest
[
{
"Id": "sha256:bd3d4369ae.......fa2645f5699037d7d8c6b415a10",
"RepoTags": [
"ubuntu:latest"
...
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:c8a75145fc...894129005e461a43875a094b93412",
"sha256:c6f2b330b6...7214ed6aac305dd03f70b95cdc610",
"sha256:055757a193...3a9565d78962c7f368d5ac5984998",
"sha256:4837348061...12695f548406ea77feb5074e195e3",
"sha256:0cad5e07ba...4bae4cfc66b376265e16c32a0aae9"
]
}
}
]
所有的 Docker 镜像都起始于一个根底镜像层,当进行批改或减少新的内容时,就会在以后镜像层之上,创立新的镜像层。每一层依据镜像的内容都有一个惟一的 ID 值,当不同的镜像之间有雷同的镜像层时,便能够实现不同的镜像之间共享镜像层的成果。在增加额定的镜像层的同时,镜像始终保持是以后所有镜像的组合。
从 Docker 1.10 版本开始,镜像就是一系列松耦合的独立层的汇合。镜像自身就是一个配置对象,其中蕴含了镜像层的列表以及一些元数据信息。镜像层才是理论数据存储的中央(比方文件等,镜像层之间是齐全独立的,并没有从属于某个镜像汇合的概念)。