[Docker][Docker Image]详细讲解

目录

  • 1.Docker镜像是什么?
  • 2.Docker镜像加载原理
    • 1.bootfs
    • 2.rootfs
    • 3.为什么CentOS镜像几个G,而Docker CentOS镜像才几百M?
      • 1.CentOS
      • 2.Docker CentOS
  • 3.镜像分层
    • 1.Union FS
    • 2.分层理解
    • 3.容器层 vs 镜像层
  • 4.镜像命令
    • 1.docker images
    • 2.docker image inspect
    • 3.docker tag
    • 4.docker rmi
    • 5.docker save
    • 6.docker load
    • 7.docker history
    • 8.docker import
    • 9.docker image prune
    • 10.docker build


1.Docker镜像是什么?

  • Docker Image本质上是一个只读文件, 这个文件包含了文件系统、 源码、库文件、依赖、工具等一些运行application所必须的文件
  • 可以把Docker Image理解成一个模板, 可以通过这个模板实例化出来很多容器
  • Image里面是一层层文件系统Union FS(联合文件系统),可以将几层目录挂载到一起,形成一个虚拟文件系统

2.Docker镜像加载原理

1.bootfs

  • bootfs主要包含bootloader和kernel,Linux刚启动时会加载bootfs
    • 在Docker镜像的最底层就是bootfs,这一层与Linux是一样的,包含bootloader和kernel
  • 当boot加载完成之后,整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时OS也会卸载bootfs

2.rootfs

  • rootfs在bootfs之上,包含的就是典型的Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件
  • rootfs就是各种不同的OS发行版
    • 如Ubuntu,CentOS

3.为什么CentOS镜像几个G,而Docker CentOS镜像才几百M?

1.CentOS

  • 一个完整的Linux OS会包含Linux内核和rootfs根文件系统
    • 即:/dev,/proc,/bin,/etc等目录。
  • 平时看到的CentOS除了rootfs,还会选装很多软件,服务等,所以CentOS镜像有几个G也很正常

2.Docker CentOS

  • 对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了
    • 因为底层直接用Host的kernel,自己只要提供rootfs就可以了
    • 由此可见,对于不同的Linux发行版
      • bootfs基本是一致的,rootfs会有差别
      • 因此不同的发行版可以共用bootfs
  • 对于容器镜像而言,所有容器都是共享宿主机的Linux内核的
    • Docker镜像只需要提供一个很小的rootfs即可,只需要包含最基本的命令,工具,程序库即可,所以docker镜像才会这么小

3.镜像分层

1.Union FS

  • Union FS是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下
  • 构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统
    • 一层层往上叠加,上层的修改会覆盖底层该位置的可见性,就像上层把底层遮住了一样
    • 当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么
  • 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
  • Union FS是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像

2.分层理解

  • 所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层

  • 例子

    • 基于Ubuntu 16.04创建一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层
    • 如在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层
    • 如果继续添加一个安全补丁,就会创建第三个镜像层
      请添加图片描述
  • 在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合

    • 如下例子:每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件
      请添加图片描述
  • 下图展示了一个稍微复杂的三层镜像,在外部看来只有6个文件,这是因为最上层的文件7时文件5的一个更新版本

    • 这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件,这样就使得文件的更新版本作为一个新镜像层添加到镜像当中
      请添加图片描述

3.容器层 vs 镜像层

  • Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部
  • 这一层就是通常说的容器曾,容器层之下的都叫镜像层
    请添加图片描述

4.镜像命令

1.docker images

  • 功能:查看所有本地的主机上的镜像
  • 语法docker images [OPTIONS] [REPOSITORY][:TAG]]
  • 关键参数
    • -a, --all:列出本地所有的镜像
    • -q, --quiet:只显示镜像ID
    • digests:显示镜像的摘要信息
    • -f:显示满足条件的镜像
    • --format:指定返回值的模板文件
    • --no-trunc:显示完整的镜像信息

2.docker image inspect

  • 功能:查看镜像详细信息
  • 语法docker image inspect [OPTIONS] IMAGE [IMAGE...]
  • 注意docker inspect会自动检查是镜像还是容器然后显示详细信息
  • 示例docker image inspect nginx:1.23.3

3.docker tag

  • 功能:标记本地镜像,将其归入某一仓库
  • 语法docker tag SOUCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • 示例docker tag ubuntu:22.04 myregistry.com/myubuntu:22.04

4.docker rmi

  • 功能:删除镜像
  • 语法:`docker rmi [OPTIONS] IMAGE [IMAGE…]
  • 关键参数
    • -f:强制删除
    • --no-purse:不移除该镜像的过程镜像,默认移除

5.docker save

  • 功能:将指定镜像保存成tar归档文件
  • 语法docker save [OPTIONS] IMAGE [IMAGE...]
  • 关键参数-o:输出到文件
  • 示例docker save -o SnowK.tar Die:v1.0

6.docker load

  • 功能:导入使用docker save命令导出的镜像
  • 语法docker load [OPTIONS]
  • 关键参数
    • -i, --input:指定导入的文件,代替STDIN
    • -q, --quiet:精简输出信息
  • 示例docker load -i SnowK.tar

7.docker history

  • 功能:显示镜像历史
  • 语法docker history [OPTIONS] IMAGE
  • 关键参数
    • -H, --human:大小和日期采用人容易读的格式展现
    • --no-trunc:显示全部信息,不要隔断
    • -q, --quiet:只显示镜像ID信息

8.docker import

  • 功能:从归档文件中创建镜像
  • 语法docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
  • 关键参数
    • -c:应用Docker指令创建镜像
    • -m:提交时的说明文字

9.docker image prune

  • 功能:删除不使用的镜像
  • 语法:`docker image prune [OPTIONS]
  • 关键参数
    • -a, -all:删除全部不使用的镜像
    • --filter filter:指定过滤条件
    • -f, --force:不提示是否删除

10.docker build

  • 功能:使用Dockerfile创建镜像
  • 语法:`docker build [OPTIONS] PATH|URL| -
  • 关键参数
    • --build-arg=[]:设置镜像创建时的变量
    • -f:指定要使用的 Dockerfile 路径
    • --label=[]:设置镜像使用的元数据
    • --no-cache:创建镜像的过程不使用缓存
    • -pull:尝试去更新镜像的新版本
    • --quiet, -q:安静模式,成功后只输出镜像 ID
    • --rm:设置镜像成功后删除中间容器
    • -t, --tag:镜像的名字及标签,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个标签
    • --network:默认default,在构建期间设置RUN指令的网络模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3280834.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

fusetech_plus项目问题解决(若依魔改系列)

首页一直出现这个问题解决,是因为访问入口都在admin模块,所以必须在admin的pom里 引入blog模块 template might not exist or might not be accessible by any of the configured Template Resolvers 这个问题 类似mapper找不到问题 路径不对&#xf…

Android Compose 中的 UI 状态魔法:优雅处理加载、空状态和数据展示

Android Compose 中的 UI 状态魔法:优雅处理加载、空状态和数据展示 在Jetpack Compose中处理UI界面状态的这种情况,我们可以使用一个密封类(sealed class)来表示不同的UI状态,然后根据状态来显示相应的UI。以下是一个实现这种功能的示例: 首先,定义一个表示UI状态的密…

Selenium与WebDriver:Errno 8 Exec格式错误的多种解决方案

概述 在使用Selenium和WebDriver进行网页自动化时,可能会遇到各种错误。其中一个常见问题是执行格式错误(Errno 8 Exec format error)。这个错误通常在运行ChromeDriver时出现,错误提示涉及路径中的某个文件,如THIRD_…

什么是三级管?怎么区分PNP和NPN两种?

1.什么是三极管? 三极管,全称应为半导体三极管,也称双极型晶体管、晶体三极管,是一种控制电流的半导体器件。其作用是把微弱信号放大成幅度值较大的电信号,也用作无触点开关。三极管是半导体基本元器件之一&#xff0…

qiankun 微前端 隔离子应用样式,解决 ant-design-vue 子应用样式污染问题(已落地)

样式冲突产生原因 先分析乾坤qiankun 构建之后,会根据你的配置 给每个子应用生成一个id, 当加载到对应子应用的时候,就把内容放到对应的id 标签里去, 这样能有效的隔离 js 代码,但是样式是加载在全局的 所以 当两个子…

080基于ssm+vue的大学生兼职信息系统

开发语言:Java框架:ssmJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.…

matlab仿真 信道编码和交织(上)

(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真 刘学勇编著第八章内容,有兴趣的读者请阅读原书) ​​​ ​ ​ ​ clear all N10;%信息比特的行数 n7;%hamming码组长度n2^m-1 m3;%监督位长度 [H,G]hammgen(m);%产生(n,n-…

ai写作一键生成软件有哪些免费的网站推荐

AI写作助手大揭秘!1秒提升创作力,高效出文秘籍! 在这个信息爆炸的时代,每个人都可以成为信息的发布者。 不论是个人博客、社交媒体更新,还是学术文章、企业报告,写作无处不在。 然而,高质量的…

产品升级!抗性宏基因组又增添新成员:毒力基因VFDB-2024版

凌恩明星产品 抗性宏基因组 内容又增加啦! 注释数据库增添新成员—— 毒力因子VFDB注释-2024版 VFDB数据库全称为Virulence Factors of Pathogenic Bacteria,用于专门研究致病细菌、衣原体和支原体致病因子的数据库。来源于微生物,并对微…

C语言指针·入门用法超详解

目录 1. 什么是指针 2. 指针变量的定义格式 3. 指针的作用 3.1 查询数据 3.2 存储数据(修改数据) 3.3 操作其他函数中的变量 3.4 函数返回多个值 3.5 函数的结果和计算状态分开 1. 什么是指针 通过内存地址,指向的空间&#…

终端pip安装包后,Pycharm却导入失败?新手别慌,3招搞定!

很多小伙伴在学习Python的过程中,都会遇到这种情况:明明在终端用pip安装好了需要的包,但在Pycharm中导入时却报错。难道是安装姿势不对? 例如在cmd中已经有了pandas,但是去pycharm中导入pandas显示没有 先别急着怀疑人生,这很可能是因为pip安装包的路径和Pycharm项目使用…

数据结构之八大排序(上)

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 目录 排序的相关介绍 直接插入排序 希尔排序(缩小增量排序) 选择排序 …

SQL-自连接和分组

一.介绍 这是一道面试题,看似简单,其实还是有一定技巧的,分析一下可以复习一下SQL查询的一些重要概念。 二.问题 给定一个包含四列的员工表 IDNameSalaryManagerId 要求 获取经理姓名、每个经理的员工数量以及每个团队的总工资。 三.设…

Vscode ssh Could not establish connection to

错误表现 上午还能正常用vs code连接服务器看代码,中午吃个饭关闭vscode再重新打开输入密码后就提示 Could not establish connection to 然后我用终端敲ssh的命令连接,结果是能正常连接。 解决方法 踩坑1 网上直接搜Could not establish connectio…

前端表格控件:打造自动化报表的高效工具

摘要 在现代Web应用中,自动化报表的生成对于数据分析和业务决策至关重要。前端表格控件提供了一种直观且强大的方式,使得报表的创建、展示和交互变得更加容易。本文将探讨如何利用前端表格控件实现自动化报表的设计、生成和优化。 引言 自动化报表可以…

《Milvus Cloud向量数据库指南》——ChatGLM:从GLM-130B到GLM-4

ChatGLM:从GLM-130B到GLM-4的跨越:智谱AI在通用人工智能领域的深度探索与实践 在人工智能的浩瀚星空中,智谱AI如同一颗璀璨的新星,以其独特的技术视角和坚定的创新步伐,在通用人工智能(AGI)的征途上留下了深刻的足迹。技术生态总监贾伟在近期的一次分享中,不仅为我们描…

分布式日志分析系统--ELK

文章目录 ELK概述ELK主要特点ELK应用架构 Elasticsearch原理JSON格式倒排索引 ES与关系型数据库ES相关概念ES安装说明1.环境初始化2.优化系统资源限制配置3.编辑ES服务文件elasticsearch. yml 优化ELK集群安装脚本scp的使用集群安装成功 Shell命令API使用创建索引创建Type创建分…

Spring Cache常用注解

依赖代码如下&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency> 常用注解详解 1. Cacheable 作用&#xff1a;主要用于配置方法&#xff0c;使其…

真实体验!猫咪长肉选这些主食罐!猫生、希喂、黑夜传说详细测评

我的猫咖店铺开在高校附近&#xff0c;顾客以学生为主&#xff0c;也有很多养猫人士会到店里来&#xff0c;和我交流选粮经验。不少铲屎官都羡慕我店里的猫咪体格健壮&#xff0c;希望能介绍一些能够帮助猫咪长肉的主食罐头。那么今天我就选择了三款高肉含量的猫罐头进行测评&a…

【JLINK】J-link Commander

官方参考文档&#xff1a;J-Link Commander - SEGGER Wiki 一、运行 打开windows命令行窗口&#xff0c;找到有jlink.exe文件的地方&#xff0c;直接输入jlink.exe即可运行 二、常用命令 输入命令时候&#xff0c;大小写不影响 Command (long)Command (short)ExplanationExa…