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参数,额外移除没有被使用的镜像(没有被任何容器使用的镜像)
  • 通过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
  • 镜像散列值(摘要)
    内容散列
  • 多层架构的镜像
posted @ 2020-11-19 17:33  biby  阅读(146)  评论(0编辑  收藏  举报