8.Docker镜像讲解

镜像是什么?

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,让包含运行某个软件所需要的所有内容,包含代码、运行时候的库,环境变量和配置文件。
所有的应用直接打包成docker镜像部署。
如何获得镜像:

  • 从远程仓库下载
  • 朋友拷贝给你
  • 自己制作一个镜像DockerFile
docker镜像加载原理

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

docker镜像加载原理

bootfs主要包含bootloader(加载器)和kernel(内核),bootloader(加载器)主要引导kernel(内核,Linux刚启动时会加载bootfs文件系统,在Docker镜像最底层是bootfs,这一层与我们典型的Linux/Unix系统是一样,包含boot加载器和内核。当boot加载完成之后整个内核都在内存中了,此时使用权转交给内核,此时系统会卸载bootfs。
黑屏------加载(加载完之后卸载)------开机进入系统
rootfs,在bootfs之上,包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的系统发行版,比如Ubuntu,Centos等等

平时我们安装进入虚拟机的Centos都是好几G,为什么docker这里才200M?

对于一个精简的OS,rootfs可以很小,只需要包含基础的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。

分层理解

分层镜像
我们可以去下载一个镜像,注意要观察下载的日志输出,可以看到一层一层的在下载!

思考为什么docker镜像要采用这种分层的结构?
最大的好处,就是资源的共享!比如有多个镜像都从相同的Base镜像构造而来,那么宿主级只需要在磁盘上保留一份base镜像,这样
比如这里,我安装redis,一层层部署中,有个already exists,这是因为在基于一层层搭建过程中,共享资源的原因,发现有些配置是已经存在了,直接使用就行

查看镜像分层的方式可以通过docker image inspect


特带:
Docker镜像都是只读的,当容器启动的时候,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层。
这也是为什么我们可以通过一个镜像去run很多容器

可写层------容器层
只读层------镜像层

如何提交自己的镜像
commit镜像

docker commit 提交容器成为一个新的副本
#命令和git原理类似
docker commit -m="提交描述信息" -a="作者" 容器id 目标镜像名:TAG

实战测试

#官方默认tomcat镜像的webapps下面没有文件
#我想自己创建一个webapps下面默认有文件的镜像,方便后面我或者后面人使用。

重新开一个终端

docker exec -it c2188940d51f /bin/bash

进入容器,官方的webapps里面每次默认启动都是没有东西的,每次都需要将webapps.dist的文件拷贝在webapps下面。很麻烦
这里递归复制

这里拷贝完成
exit退出当前容器

这个容器依然还在
访问这个页面

部署成功了的

正式来到提交我们编辑的镜像

docker commit -a="jojo" -m="add webapps's dir" c2188940d51f tomcataddwebappsdir:1.0
-a="jojo" 作者:jojo
-m="add webapps's dir" 你这个镜像的描述
tomcataddwebappsdir:1.0 名字和版本号(自定义)

docker images

红框框里面就是我们编辑的镜像,不过这个是提交到本地
如何发布,在后面dockerfile学习章节中学习

相关推荐
鹏大师运维3 小时前
为什么信创电脑装软件总提示“软件包架构不匹配”?
linux·运维·架构·国产化·麒麟·deb·统信uos
007张三丰3 小时前
软件测试专栏(11/20):测试框架开发:pytest深度解析与插件体系
运维·服务器·自动化测试·pytest·测试框架
weixin_604236674 小时前
华三 路由器 极简核心配置
运维·服务器·网络·h3c·h3c路由器
鹤落晴春5 小时前
【Linux复习】管理SELinux安全性
linux·运维·服务器
梦梦代码精5 小时前
2026年PHP开源商城系统实测对比:架构、多商户、商用授权,谁才是真·省心?
vue.js·docker·架构·开源·代码规范
AI智图坊5 小时前
多件装组合SKU图的批量生产效率分析:从PS手工到AI自动化的工作流改造
大数据·运维·人工智能·gpt·ai作画·自动化·aigc
鹤落晴春8 小时前
【K8s】Pod调度、configMaps
云原生·容器·kubernetes
极客先躯9 小时前
高级java每日一道面试题-2026年02月02日-实战篇[Docker]-如何实现容器的持久化存储?
docker·容器·面试宝典·持久化·存储·韵味·java高级面试题
云计算磊哥@9 小时前
运维开发宝典026-MySQL02数据库表操作
运维·数据库·运维开发
天天进步201510 小时前
Tunnelto 源码解析 #9:控制服务器设计:Warp、WebSocket、Ping/Pong 与连接保活
运维·服务器·websocket