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
<none> <none>
- 没有标签的镜像称为悬虚镜像,列表显示<none>:<none>
- 使用docker image prune 移除全部悬虚镜像。加-a参数,Docker会额外移除没有被使用的镜像。
docker支持过滤方式:
- dangling:可以指定true后false,返回悬虚镜像(true)和非悬虚镜像(false).
- before:需要镜像名称和ID作为参数,返回在之前被创建的镜像。
- since:与before类似:返回是指定镜像之后创建的全部镜像。
- label:根据标注(label)的名称或者值。
- 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
<snip>
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
<snip>
- 搜索到的镜像既有官方和非官方,显示只有官方的
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
<snip>
},
"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:删除镜像。
网友评论