6.1 Docker 镜像-简介

  • 镜像由多个层组成

6.2 Docker 镜像-详解

  • 可以停止某个容器并创建新的镜像
  • 镜像: build-time 结构
  • 容器: run-time 结构

镜像与容器的关系应该用什么例子才能更好的比喻?

image.png

6.2.1 镜像和容器

  • 一旦以某个镜像启动容器, 那么它们之间就产生了依赖关系

6.2.2 镜像通常比较小

  • 只有一个精简的 Shel, 甚至没有
  • 不包含内核, 仅包含必要的操作系统

6.2.3 拉取镜像

Linux Docker 主机本地镜像仓库位置:

  1. /var/lib/docker/<storage-driver>

docker info 查看 storage driver.

6.2.4 镜像命名

6.2.5 镜像仓库服务

  • 镜像仓库服务 (Image Registry), 默认是 Docker Hub
  • 镜像仓库服务包含多个镜像仓库 (Image Repository). (比如 mysql 就是镜像仓库)
  • 镜像仓库包含多个镜像 (比如 mysql 仓库包含多个 mysql 版本)

image.png

  • 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 的镜像)
  1. $ docker image ls --filter dangling=true
  2. # 移除全部悬虚镜像
  3. # -a 参数会额外移除没有使用的镜像
  4. $ 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 镜像由一些松耦合的只读镜像层组成

image.png

查看某个镜像的各层:

$ docker image inspect ubuntu:latest
  • 所有的 Docker 镜像都起始于一个基础镜像层
  • 修改或者增加新内容时就会在当前镜像层之上创建新的镜像层

image.png

层中的文件:

image.png

文件7是文件5的更新版本:

image.png

  • Docker 通过存储引擎 (新版本采用快照机制) 的方式来实现镜像层堆栈
  • Linux 上可用的存储引擎:
    • AUFS
    • Overlay2
    • Device
    • Mapper
    • Btrfs
    • ZFS

对外看来是一层:

image.png

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

image.png

6.2.15 删除镜像

删除全部镜像的快捷方法:

$ docker image rm $(docker image ls -q) -f

6.3 镜像-命令

6.4 本章小结