• Docker 镜像


    Docker镜像原理

    Docker镜像本质就是一个文件,底层依赖于***联合文件系统(UnionFS)***。
    什么是UnionFS?

    ***UnionFS***是一种分层、轻量级、高性能的文件系统,支持对文件系统的修改作为一次提交来层层叠加。这很类似于我们生活中的千层饼或鸡蛋,由蛋黄、蛋清、蛋壳一层一层的最终构成了一个鸡蛋。

    UnionFS的特性
    联合文件系统最大特点就是***分层***和***联合加载***。
    在加载时可以一次同时加载多层文件系统,通过联合加载把各层文件系统叠加起来,从外部看只能看到一个文件系统,最终的文件系统保护所有底层的文件和目录。

    Docker镜像分层结构及加载原理
    由于docker镜像底层采用联合文件系统,自然而然docker镜像也是分层的。docker采用的联合文件系统为aufs (advanced multi layered unification filesystem),是一种可堆叠的联合文件系统。
    按照docker官网的说法,docker文件系统分为两层:bootfs和rootfs。

    bootfs层

    bootfs包含了bootloader和linux内核,用户是不能对这层作任何修改的,在内核启动之后,bootfs实际上会unmount掉。
    rootfs则包含了一般系统上的常见目录结构,类似于/dev, /proc, /bin等等以及一些基本的文件和命令。

    rootfs层
    对于linux上不同版本的问题,docker可以同时运行多个rootfs。

    Docker的文件系统是分层的,它的rootfs在mount之后会转为只读模式, Docker在它上面添加一个新的文件系统,来达成它的只读。由于共享一个内核,这也是为什么docker比虚拟机消耗资源更少的根本原因。

    images层
    从下图中,我们能看到多个只读的文件系统,Docker中把他们称为层。image是只读的,container部分则是可写的。如果用户想要修改底层只读层上的文件,这个文件就会被先拷贝到上层,修改后驻留在上层,并屏蔽原有的下层文件。

    container层
    最后一部分是容器(container), 容器是可读写的。
    在系统启动时,Docker会首先一层一层的加载image,直到最先面的base image,这些image都是只读的。最后,在最上层添加可读写的一个容器, 这里存放着诸如unique id,网络配置之类的信息。

    既然是可读写的,就会有状态。容器共有两种状态:running 和 exited。用户也可以用docker commit 命令将一个容器压制为image,供后续使用。

    docker镜像为什么要分层?
    docker镜像采用基于联合文件系统的分层结构主要是为了共享公用文件,除了节约存储空间,还能实现对文件的高效管理。
    镜像可以通过分层来进行继承,基于父镜像可以制作各种具体的应用镜像。如果你有面向对象编程语言的开发经验,这就很好理解,它类似于继承与多态,子类可以继承父类功能并能派上新功能。

    关于镜像的分层,在使用后续的docker pull命令时可以很好的进行验证。比如使用docker pull命令下载一个mysql镜像,将会看到是一层一层的下载。另外如果不同镜像包含相同的公用部分(层),假设之前已经下载过包含了公用层的镜像的话,再下载包含公用层的其他镜像,会提示这些公用层已经存在于本地了,这个镜像的下载过程就不在去下载公用层,整个过程就会明显快很多。

    Docker镜像常用命令

    查看本地镜像

    命令:
    docker images [OPTIONS] [REPOSITORY[:TAG]]
    参数:

    参数名

    默认

    描述

    --all , -a

     

    显示所有镜像(默认隐藏中间镜像)

    --digests

     

    显示摘要

    --filter , -f

     

    根据提供的条件过滤输出

    --format

     

    使用Go模板打印漂亮的镜像

    --no-trunc

     

    不要截断输出

    --quiet , -q

     

    仅显示数字ID

     

    可以使用docker images --help或man docker images查看具体的用法和各项参数的意义,并且支持tab补全命令。

    输出标题中各项的含义:
    REPOSITORY:镜像名称,用于标识镜像
    TAG:版本号
    IMAGE ID :镜像ID,与镜像名称一样,可以唯一标识一个镜像
    CREATED :镜像创建日期
    SIZE:镜像大小

    在Docker Hub中搜索镜像
    命令:
    docker search [OPTIONS] TERM
    参数:

    参数名

    默认

    描述

    --automated

     

    不推荐使用
    仅显示自动构建

    --filter , -f

     

    根据提供的条件过滤输出

    --format

     

    使用Go模板进行漂亮的打印搜索

    --limit

    25

    最多搜索结果数

    --no-trunc

     

    不要截断输出

    --stars , -s

     

    不推荐使用
    只显示至少x
    个星标的显示器

     

    案例:
    (1)查询点赞数大于等于1000的mysql镜像
    docker search -f stars=1000 mysql

    (2)只查看官网的mysql镜像
    docker search -f is-official=true mysql

    下载镜像

    命令
    docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    参数

    参数名

    默认

    描述

    --all-tags , -a

     

    下载存储库中所有标记的镜像

    --disable-content-trust

    true

    跳过镜像验证

    --platform

     

    实验(守护程序)API 1.32+
    设置平台(如果服务器具有多平台功能)

    --quiet , -q

     

    禁止详细输出


    案例:拉取查出的mysql官方镜像

    这里可以很清楚的看到,是一层一层的进行下载,这就是前面讲到的镜像分层结构。默认会去Docker Hub仓库进行下载,我们也可以直接登录Docker Hub查看mysql镜像
    https://hub.docker.com/_/mysql?tab=tags 我们可以看到有很多不同的版本,使用时按需下载即可。
    特别注意:如果没指定tab版本号,默认是latest版本,也就是最新版。所以在生产环境中最好是明确指定一个版本。
    默认情况下去docker hub下载镜像比较慢,由于是在国外所以不太稳定,自己可以配置为国内的镜像仓库,如阿里云仓库。
    下载完成后,就可以在本地通过docker images命令查到该镜像

    删除本地镜像

    命令:
    docker rmi [OPTIONS] IMAGE [IMAGE...]
    参数:

    参数名

    默认

    描述

    --force , -f

     

    强制删除镜像

    --no-prune

     

    不要删除未加标签的父级镜像

     

    案例:

    1. 删除mysql镜像

    由于当时我们已经用该镜像创建了一个容器,即使此容器没有运行,在删除时也用-f参数强制删除。

    另外如果同一个镜像有不同版本,需要添加tag参数来删除指定镜像。如果要删除多个镜像,只需要在命令末尾以空格分隔多个容器即可。

    1. 删除全部镜像

    docker rmi -f $(docker images -qa)

    可以结合linux命令获取所有镜像id,然后再全部删除。

    将容器打包为镜像

    命令:
    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    参数

    名称,速记

    默认

    描述

    --author , -a

     

    作者

    --change , -c

     

    Dockerfile指令应用于创建的镜像

    --message , -m

     

    提交讯息

    --pause , -p

    true

    提交期间暂停容器


    可以通过该命令将当前运行的容器打包为镜像。后文会讲到构建镜像有两种方式:一种是通过容器commit;另外一种是通过编写DocekerFile编辑镜像。

    什么场景需要将容器打包成镜像呢?
    比如我们想扩展某个镜像的功能,我们可以把镜像运行为一个容器,然后在里边实现各种定制化需求(比如安装特定的软件),然后在重新commit提交为一个镜像,以后就基于新镜像去创建容器。

    将容器上传到远程仓库

    命令:docker push
    本地通过docker commit打包的镜像,可以通过docker push上传到远程Docker Hub仓库。这个命令与docker pull是相对的,pull则是从远程仓库下载到本地。
    要上传到远程仓库,还需要在Docker Hub上注册相应的账号

    摘自文档

    https://www.imooc.com/article/303255

  • 相关阅读:
    ExtJS4学习笔记二--表单控件相关
    Js中replace()的用法
    浅析轮询(Polling)和推送(LongPolling)服务
    ExtJS4学习笔记五--面板使用
    ExtJS4学习笔记四--图片上传
    spring MVC
    ExtJS4学习笔记三--远程访问数据源示例
    Struts 2
    ExtJs4学习笔记一--基础知识
    URL编码规则
  • 原文地址:https://www.cnblogs.com/ZQWelcomeIndex/p/12732746.html
Copyright © 2020-2023  润新知