• 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
    
    • 镜像散列值(摘要)
      内容散列
    • 多层架构的镜像
  • 相关阅读:
    读书笔记——吴军《态度》
    JZYZOJ1237 教授的测试 dfs
    NOI1999 JZYZOJ1289 棋盘分割 dp 方差的数学结论
    [JZYZOJ 1288][洛谷 1005] NOIP2007 矩阵取数 dp 高精度
    POJ 3904 JZYZOJ 1202 Sky Code 莫比乌斯反演 组合数
    POJ2157 Check the difficulty of problems 概率DP
    HDU3853 LOOPS 期望DP 简单
    Codeforces 148D. Bag of mice 概率dp
    POJ3071 Football 概率DP 简单
    HDU4405 Aeroplane chess 飞行棋 期望dp 简单
  • 原文地址:https://www.cnblogs.com/biby/p/14006576.html
Copyright © 2020-2023  润新知