Docker——Docker 镜像详解

article/2025/3/12 13:57:08

Docker 镜像

  • Docker镜像是什么
  • Docker镜像加载原理
    • 联合文件系统(UnionFS)
    • 镜像加载原理
    • 镜像分成理解
  • Commit镜像
  • 镜像的总结

Docker镜像是什么

  • Docker 容器的运行是基于宿主机的内核,通过linux的namespaces来实现隔离,相对于虚拟机而言降低了硬件资源的性能损耗,且具备一定程度上的应用隔离效果。
  • 镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
  • 通过最小化的镜像方式运行docker 容器,相对于虚拟机而言大幅度降低非生产力进程的资源消耗。
  • 所有应用,直接打包成docker镜像,就可以在其他服务器上直接运行起来!
  • Docker 客户端启动一个容器时,通过TCP或者unix socket连接docker daemon。如果需要启动的容器镜像本地不存在,则从registry来拉取到本地,然后根据传递的CMD或者默认的CMD来启动容器。
    在这里插入图片描述

Docker镜像加载原理

联合文件系统(UnionFS)

  • UnionFS( 联合文件系统) : Union文件系统(UnionFS )是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。
  • Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
  • 特性︰一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
  • 我们下载的时候看到的一层层的就是联合文件系统

镜像加载原理

  • docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS.
  • bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统
    • 在Docker镜像的最底层是bootfs,这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
  • rootfs (root file system),在bootfs之上。包含的就是典型Linux.系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu , Centos等等。
    在这里插入图片描述
  1. 一开始内核里什么都没有,操作一个命令下载debian
  2. 安装一个emacs,就在内核上面加了一层images
  3. 安装一个apache,又在上面再加一层
  4. 下面每一层都是公用的

Docker里的centos的大小才200m

  • 因为对于精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。

镜像分成理解

Docker镜像采用分层结构的好处:

  • 资源共享,比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务,而且镜像的每一层都可以被共享
使用docker image inspect 镜像名 查看镜像分层
docker image inspect tomcat"RootFS": {"Type": "layers","Layers": ["sha256:e2c6ff46235709f5178ab7c1939f4fba7237ffde84e13b1582fa5f0837c1d978","sha256:26270c5e25fa4569f37428604f708f8863a171ec2499a066241a641017971308","sha256:a42439ce96509df457152574716e3c07a8d5640fe9c16f5d4fb8854f72ce357a","sha256:5d5962699bd5f016d81fc6d623cb0bc1f3853efdc48b6958053122caffc425de","sha256:26863b4714ee050f833364c81528e499eeff4f778cde2064e2db4cb24b289f08","sha256:e8ef11c449dc031843c8689705b8348da5931ae611b46bfaceaa974b7832fe43","sha256:825d742348a7bd1509510b17a2ffcdedfbd601f2f06e27441c048edd24d76e40","sha256:7d8560b35c34638f13784a532581d1741f21a4f8f313f6715f127f7a22612983","sha256:447f25b09d03785e0c1a5bd581d2f2880fe315e2e5f3e78f02f7d2fb224a1ad4","sha256:bc7727a11f1ace90fd41701385cdd08659866de174873a3e3b550dcab1d717db"]},这个Layers就是分层
  • 所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。

  • 举一个简单的例子,假如基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。

  • 该镜像当前已经包含3个镜像层
    在这里插入图片描述

  • 在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。
    在这里插入图片描述

  • 上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。

  • 下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版本。
    在这里插入图片描述

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

  • Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统.

  • Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顾名思义,每种存储引擎都基于Linux 中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。

  • 下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。
    在这里插入图片描述

  • Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部

  • 这一层就是通常说的容器层,容器之下的都叫镜像层

Commit镜像

提交一个自己制作的镜像

docker commit 提交容器成为一个新的副本docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]先创建一个tomcat容器
docker run -it -p 9000:8080 --name tomcat01 tomcat /bin/bash进入容器修改
cp -r webapps.dist/* webapps/将修改后的容器提交成一个新的镜像
docker commit -a="maomao" -m="add webapps" dd3e1a74ea4f tomcat02:1.0docker imagesREPOSITORY            TAG       IMAGE ID       CREATED         SIZE
tomcat02              1.0       17282ff7d785   5 seconds ago   672MB测试
[root@docker run]# docker run -it -p 9000:8080 --name ceshi 172 /bin/bash
root@ec8413e7f4f7:/usr/local/tomcat# ls
BUILDING.txt	 LICENSE  README.md	 RUNNING.txt  conf  logs	    temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin	      lib   native-jni-lib  webapps  work
root@ec8413e7f4f7:/usr/local/tomcat# cd bin/
root@ec8413e7f4f7:/usr/local/tomcat/bin# ./startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/openjdk-11
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.不需要像之前一样修改webapps目录 就能够访问网页了

在这里插入图片描述

镜像的总结

在这里插入图片描述

  • 基于运行中的容器,手动制作镜像
    • 将运行中的容器暂停(docker commit 默认暂停容器),然后将当前的状态制作成镜像,注意需要指定repository,只要 -a添加作者信息,-c修改其它字段信息,常修改CMD信息。
    • 导出(export)当前容器的文件系统信息,导出后的格式为.tar,.tar文件是一个中间状态的文件,需要使用import导入并且设置CMD等相关信息才是一个完整的镜像。
  • 自动化制作镜像 Dockerfile
    Dockerfile 能解决两个问题:
    • 制作过程自动化:原理也是先运行容器,然后再基于运行的容器制作镜像,但是将制作过程使用dockerfile预先指定好
    • 可以引入变量:在制作镜像时手动传参,根据传递的参数制作不同的镜像;在创建容器时手动传参,根据传递的参数修改进程的配置
  • 镜像导出和导入
    • 这并不是制作镜像,而是共享或传输镜像到其它服务器的一种方式,如果局域网中存在registory,这种方式意义不大。
    • 如果局域网中没有registory,通过公网下载镜像会变得非常慢,因此将需要的镜像在一台机器上打包好,分发到各台服务器上会更加节约时间。

http://chatgpt.dhexx.cn/article/QrHPbHAL.shtml

相关文章

Docker镜像使用详解

目录 基础命令使用进阶 容器和虚拟机具有相似的资源隔离和分配优势,但功能不同,因为容器虚拟化的是操作系统而不是硬件。多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为独立进程运行。一…

docker镜像下载及docker镜像管理

文章目录 docker镜像下载镜像说明通外网主机上获取镜像官网上查看镜像的详细说明 镜像的命名方式镜像的重命名镜像的删除删除单个删除全部镜像 镜像的打包与解压包默认存放路径说明镜像打包【单个】镜像打包【多个】镜像解压 容器的导出和导入把容器导出为镜像镜像导入为容器 查…

Docker基础 - 仓库,镜像,容器详解

仓库,镜像,容器的关系 我们再回顾下仓库,镜像,容器的关系(这是官网的图) [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NBtYxRyR-1683856218077)(null)] Docker 镜像 当运行…

Docker本地镜像推送到私有库

Docker Registry是官方提供的工具,可以用于构建私有镜像仓库 1. 下载镜像Docker Registry docker pull registy 2. 运行私有库Registry,相当于本地有个私有Docker hub docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileg…

docker镜像

docker镜像 文章目录 docker镜像1.镜像的概念2.docker镜像层3.docker存储驱动3.docker registry4.Docker Hub 1.镜像的概念 Docker镜像类似于虚拟机中的镜像,是一个只读的模板,也是一个独立的文件系统,包括运行容器所需的数据。 Docker镜像…

Docker入门教程:本地打包docker镜像

什么是Docker? Dockers是基于Go语言开发的虚拟容器技术。以前我们部署应用通常是将源代码打包成一个jar包运行,这样就会受到运行环境、配置环境的限制,而且程序也不能跨服务器运行。Docker基于Linux容器技术,将Java源代码、运行环…

Docker 镜像

(一)下载实例 (二)镜像基本操作 备注: 相同名称的镜像可以存在多个,即需要不同的tags版本 (三)使用 Dockerfile 定制镜像 (1)介绍 镜像的定制实际上就是定…

Docker (一)之docker镜像库地址

一、关于docker的镜像问题: 当我们想要去拉取一个镜像的时候,初始的时候会去从国外的镜像库里面拉取,速度可想而知;这时我们需要给docker配置一个国内的镜像库: 目前发现docker有2个地方可以配置镜像库的地址&#x…

Docker镜像发布到阿里云和私有库

目录 一、Docker镜像 (一)概述 (二)Docker镜像加载原理 (三)镜像分层结构优势 (四)重点理解 (五)docker commit操作实例 (六)总…

【云原生|Docker】Docker镜像操作

作者:柒号华仔 个人主页:欢迎访问我的主页 个人信条:星光不问赶路人,岁月不负有心人。 个人方向:主要方向为5G,同时兼顾其他网络协议,编解码协议,C/C,linux,云原生等&…

Docker私有镜像仓库是什么?

Docker镜像仓库概述 镜像仓库作为Docker技术的核心组件之一,其主要作用就是负责镜像内容的存储和分发。Docker镜像仓库从使用范围来说分为“公有镜像仓库”和“私有镜像仓库”,公有镜像仓库是可以被任何人使用的,例如Docker公司维护的在线存储…

了解和使用 Docker 镜像仓库

前言 在上文 《了解和使用 Docker》 之后,反响不错,也上了热榜。本来是想直接整理一下容器编排工具 Docker Swarm 和 K8s 博文的,但是半路杀出了这个活动😂,为表敬意,先参与一波吧。 本文主要介绍一下容…

Docker容器之镜像仓库详解

Docker容器之镜像仓库详解 文章目录 Docker容器之镜像仓库详解1. 什么是Docker Image?2. 什么是Docker Registry?3. 镜像相关的操作 本文将集中对镜像、仓库、容器的概念与三者之间的联系进行详细介绍,以及基本的镜像管理操作。 1. 什么是Docker Image&…

docker镜像仓库

一、docker镜像仓库 docker镜像仓库(repository)是集中存放镜像的地方。方便与后续的镜像拉取与上传,便于对镜像的集中管理。镜像仓库一般可分为Docker Hub公共中央仓库和个人或者公司使用的私有仓库,私有仓库如果是个人使用则可…

Docker -- 镜像仓库(搭建私有镜像仓库、向镜像仓库推送镜像、从镜像仓库拉取镜像)

文章目录 1. 镜像仓库1.1 镜像仓库概念 2. 搭建私有镜像仓库2.1.简化版镜像仓库(不推荐)2.2 带有图形化界面版本(推荐)2.2.1 配置Docker信任地址2.2.2 使用DockerCompose部署带有图象界面的DockerRegistry 3. 向镜像仓库推送镜像4…

最全经典 | 机器视觉基础知识汇总

人工智能的小白资源群,这里有最齐全的干货资源,可以和你一样的入门小白一同交流学习亦可以得到专业技术大神的指导。欢迎入群813416857(AI人工智能学习交流),785685380(机器学习技术交流群)&…

机器视觉光源知识总结(二)

更多文章请关注微信公众号:机器视觉专业论坛

机器视觉系统的搭建

对于许多新人来说能成功搭建一套完善的视觉系统是比较困难的,机器视觉包括了许多需要掌握的知识点、比产品选型:视觉软件、相机、光源、镜头。比如安装高度、视野大小、系统要求的运行时间、工作环境等等,对于新人来说需要一套完善的知识体系…

OpenCV与机器视觉

最近在网易云课堂把南科大于仕琪团队的OpenCV教程完整看了一遍,对图像处理或者机器视觉又有了一个系统性的理解。OpenCV中文网站就是他创建的,他的研究团队及其相应成果可以在个人网站中查阅。回想过去在图像处理方面的点点滴滴,做了一个详细…

机器视觉——车牌识别实验汇总

文章目录 前言一、车牌识别背景资料简介二、实现车牌识别步骤1.图像采集(Image Correction)2.角度修正(Angle Correction)3.字符分割 第一次分割4.车牌定位(License Plate Location)5.字符分割 第二次分割6…