乐趣区

关于docker:Docker基础镜像

镜像是一个只读的 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 版本开始,镜像就是一系列松耦合的独立层的汇合。镜像自身就是一个配置对象,其中蕴含了镜像层的列表以及一些元数据信息。镜像层才是理论数据存储的中央(比方文件等,镜像层之间是齐全独立的,并没有从属于某个镜像汇合的概念)。

退出移动版