6.1 Docker 镜像-简介
- 镜像由多个层组成
6.2 Docker 镜像-详解
- 可以停止某个容器并创建新的镜像
- 镜像: build-time 结构
- 容器: run-time 结构
镜像与容器的关系应该用什么例子才能更好的比喻?
6.2.1 镜像和容器
- 一旦以某个镜像启动容器, 那么它们之间就产生了依赖关系
6.2.2 镜像通常比较小
- 只有一个精简的 Shel, 甚至没有
- 不包含内核, 仅包含必要的操作系统
6.2.3 拉取镜像
Linux Docker 主机本地镜像仓库位置:
/var/lib/docker/<storage-driver>
用 docker info
查看 storage driver.
6.2.4 镜像命名
6.2.5 镜像仓库服务
- 镜像仓库服务 (Image Registry), 默认是 Docker Hub
- 镜像仓库服务包含多个镜像仓库 (Image Repository). (比如 mysql 就是镜像仓库)
- 镜像仓库包含多个镜像 (比如 mysql 仓库包含多个 mysql 版本)
- Docker Hub 分为官方仓库 (Official Repository) 和非官方仓库 (Unofficial Repository)
6.2.6 镜像命名和标签
- 定位镜像:
镜像名:标签
- latest 标签不保证是最新镜像
- 拉取非官方仓库镜像:
DockerHub名称/镜像名:tag
- 拉取非 Docker Hub 镜像仓库服务的镜像:
DNS/账户名/镜像名:tag
6.2.7 为镜像打多个标签
6.2.8 过滤 docker image ls 的输出内容
- 返回悬虚镜像 (dangling, 没有 tag 的镜像)
$ docker image ls --filter dangling=true
# 移除全部悬虚镜像
# -a 参数会额外移除没有使用的镜像
$ docker image prune
过滤类别:
- dangling: true, false. 悬虚镜像
- before: 后跟镜像名/ID, 返回之前被创建的全部镜像
- since: 后跟镜像名/ID, 返回之后被创建的全部镜像
- label: 根据指定 label 过滤镜像
- reference: 貌似是自定义过滤
- …
$ docker image ls --filter=reference="*:latest"
对输出内容进行格式化:
- 只返回镜像大小
$ docker image ls --format "{{.Size}}"
更复杂的过滤可以使用 shell 工具:
- grep
- awk
6.2.9 通过 CLI 方式搜索 Docker Hub
搜索 “Name” 字段 (仓库名称):
$ docker search nigelpoulton
$ docker search alpine
$ docker search alpine --filter "is-official=true"
$ docker search alpine --filter "is-automated=true"
- 默认只返回25行结果, —limit 可以指定行数, 但是最多100行
6.2.10 镜像和分层
- Docker 镜像由一些松耦合的只读镜像层组成
查看某个镜像的各层:
$ docker image inspect ubuntu:latest
- 所有的 Docker 镜像都起始于一个基础镜像层
- 修改或者增加新内容时就会在当前镜像层之上创建新的镜像层
层中的文件:
文件7是文件5的更新版本:
- Docker 通过存储引擎 (新版本采用快照机制) 的方式来实现镜像层堆栈
- Linux 上可用的存储引擎:
- AUFS
- Overlay2
- Device
- Mapper
- Btrfs
- ZFS
对外看来是一层:
6.2.11 共享镜像层
6.2.12 根据摘要拉取镜像
- 标签与镜像的对应关系可变
查看摘要:
$ docker image ls --digests
通过摘要拉取:
$ docker image pull alpine@sha256:12345...
6.2.13 镜像散列值 (摘要)
- 镜像: 配置对象
- 镜像层: 实际存储数据
- 镜像 ID: 配置对象的散列值
- 镜像层 ID: 镜像层的散列值
- 分发散列值: 传输镜像时需要压缩镜像, 分发散列值指压缩后的镜像的散列值
6.2.14 多层架构的镜像
一个镜像标签之下可以支持多个平台和架构:
- Linux
- PowerPC Linux
- Windows
- ARM
镜像仓库服务 API 支持两种重要结构:
- Manifest 列表: 镜像标签支持的架构列表
- Manifest
6.2.15 删除镜像
删除全部镜像的快捷方法:
$ docker image rm $(docker image ls -q) -f