Docker镜像
目录
Docker镜像
镜像和容器
- 通常使用 docker container run 和 docker service create 命令从某个镜像启动一个或多个容器。
- 一旦容器从镜像启动后,二者之间就变成了互相依赖的关系,并且在镜像上启动的容器全部停止之前,镜像无法被删除。尝试删除镜像而不停止或摧毁使用它的容器,会导致出错。
- 镜像中不包含内核[容器共享所在Docker主机的内核][容器仅包含必要的操作系统(通常只有操作系统文件和文件系统镜像)]
- Docker官方镜像Alpine Linux大约只有4MB
- Ubuntu官方Docker镜像大约有110MB
拉取镜像
- 通过 docker image pull 下载镜像
- 镜像从远程镜像仓库服务的仓库中下载
- 默认情况下,镜像会从Docker Hub的仓库中拉取
- docker image pull apline:lastest 命令会从Docker Hub的apline仓库中拉取标签为lastest的镜像
- Linux Docker 主机本地镜像仓库通常位于 /var/lib/docker/
- 查看Docker主机的本地仓库中是否包含镜像 docker image ls
sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
test biby 770e57d63685 44 hours ago 73.1MB
<none> <none> 22e658fe9fb5 2 days ago 5.57MB
ubuntu latest adafef2e596e 4 months ago 73.9MB
alpine 3.8 c8bccc0af957 9 months ago 4.41MB
镜像仓库服务
- Docker镜像存储在镜像仓库服务(Image Registy)中
- Docker客户端的镜像仓库服务是可配置的,默认使用Docker Hub
- 镜像仓库服务包含多个镜像仓库(Image Repository)。同样,一个镜像仓库中可以包含多个镜像。
- 下图展示了包含3个镜像仓库的镜像仓库服务,其中每个镜像仓库都包含一个或多个仓库
镜像命名和标签
- 只需要给出镜像的名称和标签,就能在官方仓库中定位一个镜像(采用":"分隔)
- 从官方仓库拉取镜像,docker image pull
命令格式 docker image pull:
//拉取Apline镜像
docker image pull apline:latest
//拉取ubuntu镜像
docker image pull ubuntu:latest
//从官方仓库拉取不同的镜像
# 从官方Mongo库拉取标签为3.3.11的镜像
docker image pull mongo:3.3.11
# 从官方Redis库拉取标签为latest的镜像
docker image pull redis:latest
# 从馆藏Apline库拉取标签为latest的镜像
docker image pull apline
- 如果没有在仓库名称后指定具体的镜像标签,则Docker会默认拉取标签为latest的镜像
- 从非官方仓库拉取镜像,需要再仓库名称前面加上Docker Hub的用户名或者组织名称
//从 biby-dev 仓库中拉取test镜像,镜像的拥有者是Docker Hub账号biby
docker image pull biby/ biby-dev:test
- 如果希望从第三方镜像仓库服务获取镜像,则需要在镜像仓库名称前加上第三方镜像仓库服务的DNS名称
- 为镜像打多个标签
- 一个镜像可以根据用户需要设置多个标签
- 标签是存放在镜像元数据中的任意数字或字符串
镜像命令
docker image pull
- -a参数拉取仓库中的全部镜像
docker image pull -a
docker image ls
- Docker提供 --filter 参数来过滤镜像列表内容,过滤器参数如下
- dangling: true-仅返回悬虚镜像 false-非悬虚镜像
- before: 需要镜像名称或者ID作为参数,返回在之前被创建的全部镜像
- since: 需要镜像名称或者ID作为参数,返回在指定镜像之后被创建的全部镜像
- label: 根据标注(label)的名称或值,对镜像进行过滤。
- reference[使用reference完成过滤并显示标签为 latest 的示例]
docker image ls --filter=reference=":latest"
- --format 通过Go模板对输出内容进行格式化
//返回Docker主机上镜像大小属性
sudo docker image ls --format "{{.Size}}"
73.1MB
6.35MB
5.57MB
5.57MB
73.9MB
4.41MB
153MB
- 返回全部镜像,只显示仓库、标签和大小信息
sudo docker image ls --format "{{.Repository}}:{{.Tag}}:{{.Size}}"
test:biby:73.1MB
<none>:<none>:6.35MB
<none>:<none>:5.57MB
alpine:latest:5.57MB
ubuntu:latest:73.9MB
alpine:3.8:4.41MB
- 没有标签的镜像被称为悬虚镜像,在列表中展示为
:
通常出现这种情况,是因为构建了一个新镜像,然后为该镜像打了一个已经存在的标签
当出现这种请款,Docker会构建新镜像,移除旧镜像上的标签,然后将该标签标在新镜像上 - 返回dangling(悬虚)镜像
sudo docker image ls --filter dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> d55505601cd9 2 days ago 52MB
<none> <none> c06479ecec24 2 days ago 52MB
<none> <none> b490b1827703 2 days ago 6.35MB
<none> <none> 675517fdd918 2 days ago 5.57MB
<none> <none> 22e658fe9fb5 2 days ago 5.57MB
<none> <none> 3bd1999bbd5a 2 days ago 153MB
docker image build
用于构建镜像
docker image rm [镜像ID]
- 删除镜像
- 从Docker主机中删除镜像[rm是remove的缩写]
- 如果被删除的镜像上存在运行状态的容器,那么删除操作不会被允许。
- 删除Docker主机上所有镜像
docker image rm [当前系统全部镜像ID]
docker image rm $(docker image ls -q) -f
docker image prune
用于移除全部悬虚镜像
- -a 添加-a参数,额外移除没有被使用的镜像(没有被任何容器使用的镜像)
docker search
- 通过CLI方式搜索Docker Hub
- docker search命令允许通过CLI方式搜索Docker Hub
- 可以通过NAME字段的内容进行匹配,并且基于返回内容中任意列的值进行过滤
- 简单模式下,该命令会搜索所有“NAME”字段中包含特定字符的仓库
//查找所有“NAME”包含“biby”的仓库
sudo docker searchbiby
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
- "NAME"字段是仓库名称,包含了Docker ID,或者非官方仓库的组织名称
//列出所有仓库名称中包含“apline”的镜像
sudo docker search alpine
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
alpine A minimal Docker image based on Alpine Linux… 6911 [OK]
mhart/alpine-node Minimal Node.js built on Alpine Linux 475
anapsix/alpine-java Oracle Java 8 (and 7) with GLIBC 2.28 over A… 454
- 通过参数过滤控制返回内容仅显示官方镜像 --filter "is-official=true"
sudo docker search alpine --filter "is-official=true"
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
alpine A minimal Docker image based on Alpine Linux… 6911 [OK]
- 仅显示自动创建的仓库
sudo docker search alpine --filter "is-automated=true"
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
anapsix/alpine-java Oracle Java 8 (and 7) with GLIBC 2.28 over A… 454 [OK]
frolvlad/alpine-glibc Alpine Docker image with glibc (~12MB) 249
- docker search 默认只返回25行结果,可以通过制定 -limit 参数增加返回内容的行数,最多为100行。
镜像和分层
- Docker镜像由一些松耦合的只读镜像层组成
- Docker负责堆叠这些镜像层,并且将它们表示为单个统一的对象
- 查看镜像分层
docker image inspect ubuntu:latest
- 查看镜像构建历史记录
docker history
- 所有Docker镜像都起始于一个基础镜像层,当进行修改或增加新内容时,就会在当前镜像层之上,创建新的镜像层。
- eg,假如基于 Ubuntu Linux 16.04 创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加 Python 包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
- 在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合。下图中举了一个简单的例子,每个镜像层包含 3 个文件,而镜像包含了来自两个镜像层的 6 个文件。
共享镜像层
- 镜像分层
- 镜像共享层
- 写时复制(CoW)
- 内容寻址存储模型
*查看镜像摘要
docker image ls --digests
- 镜像散列值(摘要)
内容散列 - 多层架构的镜像