Docker学习(6) Docker镜像

Docker学习(5) Docker镜像

简介

  • Docker镜像就是停止运行的容器。
  • 使用之前需要从镜像仓库里拉取镜像,下载到本地的docker主机里
  • 镜像是由多层组成的,每层重叠之后,在外部看来就是一个独立的个体。
  • 镜像内部包括操作系统(OS),同时还包含应用运行所必要的文件和依赖包。
  • 镜像设计的初衷是快速和小巧,所有镜像通常比较小。

详解

  • 镜像也可以——停止某个容器运行,并从中创建新的镜像。

  • 镜像可以理解为构建时(build-time)结构,容器可以理解为运行时(run-time)结构。

镜像和容器

  • 容器一旦从镜像启动之后,二者之间变成相互依赖的关系。

  • 从镜像中启动的全部容器停止之前,镜像无法删除的

  • 否则会导致报错,效果如下

lhf@lhf-virtual-machine:~$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
613dad3cfc8d        ubuntu:latest       "/bin/bash"         17 seconds ago      Up 16 seconds                           beautiful_leakey
lhf@lhf-virtual-machine:~$ docker image rm ubuntu:latest
Error response from daemon: conflict: unable to remove repository reference "ubuntu:latest" (must force) - container 613dad3cfc8d is using its referenced image cf0f3ca922e0

镜像通常比较小

  • 容器追求快速和小巧,意味这镜像就必须裁剪掉不必要的部分,保持较小的体积。
  • 一般docker镜像只有一个精简的SHELL,或者没有,镜像不包含内核。
  • 容器都是共享docker主机的内核。

拉取镜像

  • docker主机本地的镜像仓库位置
lhf@lhf-virtual-machine:~$ sudo ls /var/lib/docker
[sudo] lhf 的密码: 
builder  buildkit  containers  image  network  overlay2  plugins  runtimes  swarm  tmp  trust  volumes
  • 检查本地仓库是否有镜像
lhf@lhf-virtual-machine:~$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                latest              e63fd667d16a        2 days ago          71.4MB
alpine              latest              965ea09ff2eb        4 days ago          5.55MB
ubuntu              latest              cf0f3ca922e0        7 days ago          64.2MB

  • 拉取镜像到本地
lhf@lhf-virtual-machine:~$ docker pull centos:latest
latest: Pulling from library/centos
729ec3a6ada3: Pull complete 
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

镜像仓库服务

  • docker镜像存储在镜像仓库服务(image registry)当中。默认使用的是docker Hub
  • 镜像仓库服务包含多个镜像仓库,一个镜像仓库包含多个镜像。

官方和非官方镜像仓库

  • Docker Hub 分官方仓库(Official Repositiry)和非官方仓库(UnOfficial Repositiry)

镜像命名和标签

  • 给出镜像的名字和标签,从官方仓库拉取镜像
lhf@lhf-virtual-machine:~$ docker pull alpine:latest
latest: Pulling from library/alpine
Digest: sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a
Status: Image is up to date for alpine:latest
docker.io/library/alpine:latest
lhf@lhf-virtual-machine:~$ docker pull ubuntu:latest
latest: Pulling from library/ubuntu
Digest: sha256:a7b8b7b33e44b123d7f997bd4d3d0a59fafc63e203d17efedf09ff3f6f516152
Status: Image is up to date for ubuntu:latest
docker.io/library/ubuntu:latest

  • 如果没有在仓库名称后制定具体标签,docker默认标签是latest
  • 标有latest标签的镜像并不保证是这个仓库最新的镜像

为镜像打多个标签

  • 一个镜像可以根据用户需求设置多个标签。
  • 标签是存放在镜像的元数据中的任意数字或字符串。
  • 在docker image pull 命令中指定-a 参数拉取仓库中所有的镜像。
  • latest 是一个非强制标签,不保证指向仓库中的最新镜像。

过滤docker image ls 的输出的内容

  • docker提供参数 --filter 来过滤docker image ls 命令返回镜像列表的内容。
  • 返回悬虚(dangling)镜像
lhf@lhf-virtual-machine:~$ docker image ls --filter dangling=true
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
  
  • 没有标签的镜像称为悬虚镜像,列表显示:
  • 使用docker image prune 移除全部悬虚镜像。加-a参数,Docker会额外移除没有被使用的镜像。

docker支持过滤方式:

  1. dangling:可以指定true后false,返回悬虚镜像(true)和非悬虚镜像(false).
  2. before:需要镜像名称和ID作为参数,返回在之前被创建的镜像。
  3. since:与before类似:返回是指定镜像之后创建的全部镜像。
  4. label:根据标注(label)的名称或者值。
  5. reference:过滤标签为latest的镜像
lhf@lhf-virtual-machine:~$ docker image ls --filter=reference="*:latest"
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                latest              e63fd667d16a        2 days ago          71.4MB
alpine              latest              965ea09ff2eb        4 days ago          5.55MB
ubuntu              latest              cf0f3ca922e0        7 days ago          64.2MB
centos              latest              0f3e07c0138f        3 weeks ago         220MB

  • 可以通过--format 参数来通过go模板对输出内容格式化

  • 只返回docker主机上镜像的大小属性

lhf@lhf-virtual-machine:~$ docker image ls --format "{{.Size}}"
71.4MB
5.55MB
64.2MB
220MB

  • 只返回显示仓库、标签和大小的信息
lhf@lhf-virtual-machine:~$ docker image ls --format "{{.Repository}}:{{.Tag}}:{{.Size}}"
test:latest:71.4MB
alpine:latest:5.55MB
ubuntu:latest:64.2MB
centos:latest:220MB

通过CLI方式搜索Docker Hub

  • docker search 命令运行通过CLI方式搜索Docker Hub
lhf@lhf-virtual-machine:~$ docker search nigelpoulton
NAME                                 DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nigelpoulton/pluralsight-docker-ci   Simple web app used in my Pluralsight videos…   18                                      [OK]
nigelpoulton/tu-demo                                                                 11                                      
nigelpoulton/k8sbook                 Simple web app used for demos in The Kuberne…   2


lhf@lhf-virtual-machine:~$ docker search alpine
NAME                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
alpine                                 A minimal Docker image based on Alpine Linux…   5757                [OK]                
mhart/alpine-node                      Minimal Node.js built on Alpine Linux           444                                     
anapsix/alpine-java                    Oracle Java 8 (and 7) with GLIBC 2.28 over A…   427 



  • 搜索到的镜像既有官方和非官方,显示只有官方的
lhf@lhf-virtual-machine:~$ docker search alpine --filter "is-official=true"
NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
alpine              A minimal Docker image based on Alpine Linux…   5757                [OK] 

镜像和分层

  • Docker镜像由一些松耦合的只读镜像组成的。

  • Docker复制堆积这些镜像层,并将它们表示为单个统一的镜像

  • 查看镜像分层

lhf@lhf-virtual-machine:~$ docker image inspect ubuntu:latest

            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:a090697502b8d19fbc83afb24d8fb59b01e48bf87763a00ca55cfff42423ad36",
                "sha256:97e6b67a30f1efeb050ada13c2afa1afd748e175ae744027dd0cce1f2931a594",
                "sha256:100ef12ce3a46c3242d186dbbadedff1638dc1f69cab4e1fbf73489049c01c25",
                "sha256:19331eff40f01dd084a3f966cc6939e828d617d777163706b8a13d0f972704d1"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
   
  • 显示该镜像包含了是4个镜像层、
  • 输出的内容使用了镜像的SHA256散列值来标识镜像层。
  • 所有Docker镜像都起始于一个基础镜像层,当进行修改和添加新的内容时,会在当前镜像层,创建一个新的镜像层。
  • 在添加额外的镜像层的同时,镜像始终保持当前所有镜像的组合。
  • Docker是通过存储引擎的方式来实现镜像层的堆栈的,并保证多镜像层对外展示位统一的文件系统

共享镜像层

  • 多个镜像直接可以共享镜像层,这样可以节省空间提供性能。

根据摘要拉取镜像

  • 一般是通过标签来拉取镜像的,但是标签是可变的,可能会导致问题,可以通过摘要来拉取镜像
  • 使用镜像摘要(image Digest)
  • 使用参数 --digests 在本地查看镜像摘要
lhf@lhf-virtual-machine:~$ docker image ls --digests alpine
REPOSITORY          TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE
alpine              latest              sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a   965ea09ff2eb        4 days ago          5.55MB

  • 通过摘要来拉取镜像

镜像散列值(摘要)

  • 镜像是一系列松耦合的独立层的集合
  • 镜像是一个可配置的对象,包含了镜像层的列表以及一些元数据的信息。
  • 镜像层才是实际数据存储的地方
  • 镜像的唯一标识是一个加密ID,配置对象本身的散列值。
  • 内容散列:
    • 修改镜像的内容或其中的任意镜像层都会导致加密散列值的变化。

多层架构的镜像

  • docker的优点:
    • 运行一个应用就行拉取一个镜像并运行容器这么简单,无需安装,依赖和配置这些问题了。
  • 多层架构的镜像就是解决镜像与当前运行环境匹配问题。
  • 一个镜像标签可以支持多个平台和架构。
  • 镜像仓库服务API支持两种重要架构:Manifest列表和Manifest

删除镜像

  • 使用docker image rm 命令来删除镜像

  • 通过镜像ID来删除镜像

lhf@lhf-virtual-machine:~$ docker image ls 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                latest              e63fd667d16a        3 days ago          71.4MB
alpine              latest              965ea09ff2eb        4 days ago          5.55MB
ubuntu              latest              cf0f3ca922e0        7 days ago          64.2MB
lhf@lhf-virtual-machine:~$ docker image rm cf0f3ca922e0
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:a7b8b7b33e44b123d7f997bd4d3d0a59fafc63e203d17efedf09ff3f6f516152
Deleted: sha256:cf0f3ca922e08045795f67138b394c7287fbc0f4842ee39244a1a1aaca8c5e1c
Deleted: sha256:c808877c0adcf4ff8dcd2917c5c517dcfc76e9e8a035728fd8f0eae195d11908
Deleted: sha256:cdf75cc6b4d28e72a9931be2a88c6c421ad03cbf984b099916a74f107e6708ff
Deleted: sha256:b9997ded97a1c277d55be0d803cf76ee6e7b2e8235d610de0020a7c84c837b93
Deleted: sha256:a090697502b8d19fbc83afb24d8fb59b01e48bf87763a00ca55cfff42423ad36

  • 删除docker主机的全部镜像
lhf@lhf-virtual-machine:~$ docker image rm $(docker image ls -q) -f
Untagged: test:latest
Deleted: sha256:e63fd667d16a799a73adf65c4882461171125f811326827b867eb5acca9d89b5
Deleted: sha256:a3656648909cd134aa602878560463d4e4b4ee48b84cf10d33b93617f98b5beb
Deleted: sha256:677c10bc62019a183422f8142accbcc09d9b65b317421dbbcd1b0935a0ca7179
Deleted: sha256:4f515774097fccbbec3608cee499fa51f1b0e9b70d2b1fdc1af6f3e2d725baf2
Deleted: sha256:6c293be80bd10ff2bdc72e3833be631bf9e734b0abbed353858f4ed04d6e3779
Deleted: sha256:dc254500dcdad9c1092f8e5a37ee6378a7df9320a84767933cf6c8692005d753
Deleted: sha256:5935d67da60e681d0ef3bedd55bde06a54e60f2c2adc8e73640943dcef8ef521
Untagged: alpine:latest
Untagged: alpine@sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a
Deleted: sha256:965ea09ff2ebd2b9eeec88cd822ce156f6674c7e99be082c7efac3c62f3ff652
lhf@lhf-virtual-machine:~$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

Docker 镜像——命令

  • docker image pull :下载镜像的命令
  • docker image ls:列出本地存储的镜像,参数 --digests查看镜像的SHA26签名
  • docker image inspect:展示镜像细节。包括镜像层数据和元数据。
  • docker image rm:删除镜像。

你可能感兴趣的:(Docker学习(6) Docker镜像)