Docker镜像简介-程序员宅基地

技术标签: 容器  运维  Docker学习  docker  

一.什么是镜像

镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好行程一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。

二.Docker镜像加载原理

2.1联合文件系统

  • Docker 中的文件存储驱动叫做 storage driver。
  • Docker 最早支持的stotage driver是 AUFS,它实际上由一层一层的文件系统组成,这种层级的文件系统叫UnionFS。

联合文件系统(UnionFS):Union 文件系统,是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。

Union文件系统是Docker镜像的基础。镜像可以通过分层来进行集成,基于基础镜像可以制作具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

后来出现的docker版本中,除了AUFS,还支持OverlayFS、Btrfs、Device Mapper、VFS、ZFS等storage driver,现在使用OverlayFS

2.2bootfs和rootfs

2.2.1bootfs

bootfs(boot file system)主要包含 bootloader 和 kernel,bootloader主要是引导加载 kernel,Linux刚启动时会加载bootfs文件系统。

在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已经由 bootfs 转交给内核,此时系统也会卸载 bootfs。

2.2.2rootfs

rootfs(root file system),在bootfs之上,包含的就是典型Linux系统中的 /dev/proc/bin/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu、CentOS等。

docker镜像底层层次:

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接使用Host的Kernel,自己只需要提供rootfs就可以。所以,对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,不同的发行版可以共用bootfs。

三.镜像分层

Docker支持扩展现有镜像,创建新的镜像。新镜像是从base镜像一层一层叠加生成的。

查看镜像分层信息

docker history

截取的nginx的分层

镜像分层的优势

镜像分层的一个最大好处就是共享资源,方便复制迁移,方便复用,镜像的每一层都可以被共享。

四.容器层

Copy On Write(写时复制)

  • 写时复制是一种共享和复制文件的策略,可最大程度地提高效率。
  • 如果文件或目录位于映像的较低层中,而另一层(包括可写层)需要对其进行读取访问,则它仅使 用现有文件。
  • 另一层第一次需要修改文件时(在构建映像或运行容器时),将文件复制到该层并进行修改。 这 样可以将I / O和每个后续层的大小最小化。

容器启动会加载镜像自带配置,但是如果修改容器里面内容,docker会在容器生成一个新的层来储存配置文件,并不会对镜像直接修改。

当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被叫做“容器层”,“容器层”之下都叫做“镜像层”。

所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中。,镜像永远不变

只有容器层是可写的,容器层下面的所有镜像层都是只读的。

五.镜像的存储

docker image inspect nginx查看镜像内部信息,截取如下片段,指示了镜像怎么存的

  • LowerDir :底层目录; diff(只是存储不同);包含小型linux和装好的软件,只读的
/var/lib/docker/overlay2/67b3802c6bdb5bcdbcccbbe7aed20faa7227d584ab37668a03ff6952e
631f7f2/diff:用户文件;
/var/lib/docker/overlay2/f56920fac9c356227079df41c8f4b056118c210bf4c50bd9bb077bdb4
c7524b4/diff: nginx的启动命令放在这里
/var/lib/docker/overlay2/0e569a134838b8c2040339c4fdb1f3868a7118dd7f4907b40468f5fe6
0f055e5/diff: nginx的配置文件在这里
/var/lib/docker/overlay2/2b51c82933078e19d78b74c248dec38164b90d80c1b42f0fdb1424953
207166e/diff: 小linux系统

我们进入到这个镜像启动的容器,容器的文件系统就是镜像的;

docker ps -s;可以看到这个容器真正用到的文件大小

容器会自己建立层;如果想要改东西,把改的内容复制到容器层即可

docker inspect container查看启动的容器分层信息

"LowerDir":
"/var/lib/docker/overlay2/41e4fa41a2ad1dca9616d4c8254a04c4d9d6a3d462
c862f1e9a0562de2384dbcinit/diff:/var/lib/docker/overlay2/e3b8bdbb0cfbe5450696c470994b3f99e
8a7942078e2639a788027529c6278f7/diff:/var/lib/docker/overlay2/67b380
2c6bdb5bcdbcccbbe7aed20faa7227d584ab37668a03ff6952e631f7f2/diff:/var
/lib/docker/overlay2/f56920fac9c356227079df41c8f4b056118c210bf4c50bd
9bb077bdb4c7524b4/diff:/var/lib/docker/overlay2/0e569a134838b8c20403
39c4fdb1f3868a7118dd7f4907b40468f5fe60f055e5/diff:/var/lib/docker/ov
erlay2/2b51c82933078e19d78b74c248dec38164b90d80c1b42f0fdb14249532071
66e/diff",
"MergedDir":
"/var/lib/docker/overlay2/41e4fa41a2ad1dca9616d4c8254a04c4d9d6a3d462
c862f1e9a0562de2384dbc/merged",
"UpperDir": (镜像的上层可以感知变
化)"/var/lib/docker/overlay2/41e4fa41a2ad1dca9616d4c8254a04c4d9d6a3d
462c862f1e9a0562de2384dbc/diff",【容器的修改后的文件,保存再宿主机的目录。
容器删除后,那些容器目录随之删除】
"WorkDir":
"/var/lib/docker/overlay2/41e4fa41a2ad1dca9616d4c8254a04c4d9d6a3d462
c862f1e9a0562de2384dbc/work"
  • MergedDir :合并目录;容器最终的完整工作目录全内容都在合并层;数据卷在容器层产生;容器里面有的文件就展示容器里的,容器里没有的就展示镜像里的。

  • UpperDir :上层目录; 是lowerdir的上一层,只有这一层是可读可写的,其实就是容器层
  • WorkDir :工作目录(临时层),pid;

docker底层的 storage driver完成了以上的目录组织结果;

六.制作发布新镜像

docker commit提交容器副本使之成为一个新的镜像。

docker 启动一个镜像容器后, 可以在里面执行一些命令操作,然后使用docker commit将新的这个容器快照生成一个镜像。

docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[tag]

5.1本地制作制作Ubuntu镜像

这里以Ubuntu容器安装vim为例:

[root@localhost ~]#  docker run -it ubuntu
root@bf9b18b76e62:/# apt -get intsall vim  #安装vim
[root@localhost ~] docker commit -m="vim cmd add ok" -a="lfz"  bf9b18b76e62 ubuntu/vim:1.1#提交容器副本让其成为一个新的镜像,这样就得到一个带vim的Ubuntu镜像了

镜像创建过程:

5.2将镜像发布到阿里云

登录阿里云,控制台-容器镜像服务-选择个人实例-创建命令空间-创建镜像仓库

创建完阿里云会自动生成代码

将镜像push推送到阿里云镜像仓库:

阿里云上面创建完仓库会有如何推送镜像教程

$ docker login --username=xxx registry.cn-hangzhou.aliyuncs.com  #自己的useename账号
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/lfz_docker/ubuntu1.1:[镜像版本号]    
$ docker push registry.cn-hangzhou.aliyuncs.com/lfz_docker/ubuntu1.1:[镜像版本号]

从阿里云push下载镜像验证:

docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
docker pull registry.cn-hangzhou.aliyuncs.com/lfz_docker/ubuntu1.1:[镜像版本号]

5.3将本地镜像发布到DockerHub

在dockerhub注册并创建仓库ubuntu

登录dockerhub

docker login
输入用户名和密码

修改镜像名符合规范并推送

docker tag  ubuntu:1.1 liufengzhi/ubuntu:1.1
docker push liufengzhi/ubuntu:1.1

注意只有官方仓库的镜像不带全路径,非官方镜像都会带全路径,所以说推送镜像必须改镜像的名字,让其符合规范

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lfz1731/article/details/131964942

智能推荐

Error while executing command 'react-native.cmd run-android --no-packager' (error code 101)_react-native.cmd run-android --no-packager 时出错-程序员宅基地

文章浏览阅读5k次。在学习的路上总是会有各种各样的错误在等待着我们。不过,我们逢山开路,遇水搭桥。我在集成ReactNative的导航Navigation时遇到了这么个错误。Error while executing command 'react-native.cmd run-android --no-packager' (error code 101)。各种百度,Google。我在VSCode里面报的这个错,但是找..._react-native.cmd run-android --no-packager 时出错

python 分词字典的词性_Python 文本挖掘:jieba中文分词和词性标注-程序员宅基地

文章浏览阅读1.1k次。最近NLP新词发现及情感倾向性分类任务,需要用到分词,查找了下,python,jieba分词,貌似用起来还可以,效果也不差,还没在python里试中科院的分词。jieba 分词:做最好的Python 中文分词组件。这是结巴分词的目标,我相信它也做到了。操作简单,速度快,精度不错。而且是Python 的库,这样就不用调用中科院分词ICTCLAS了。妈妈再也不用担心我不会分词啦。jieba 的主页有详..._python词素

vue中使用echarts在地图上绘制散点图,并根据数值大小实现不同效果_echarts散点图数据动态颜色大小-程序员宅基地

文章浏览阅读7.7k次,点赞3次,收藏31次。1、echarts省市地图上根据数值大小给散点设置不同颜色,地图颜色不根据数值大小渲染,自己设置颜色<script> //引入基本模板 let echarts = require('echarts/lib/echarts') // 引入组件 require('echarts/lib/chart/map') // 引入地图js文件 ..._echarts散点图数据动态颜色大小

MATLAB绘图 最大化全屏后保存_matlab画图全屏-程序员宅基地

文章浏览阅读6.8k次,点赞5次,收藏21次。MATLAB绘图 最大化全屏后保存一、绘图[^1]二、图例[^2]添加图例的方式一:添加图例的方式二设置图例的排列方式图例的位置和列数显示指定曲线的图例图例背景和轮廓三、保存[^3]参考资料欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图_matlab画图全屏

解决Openwrt /etc/config目录下没有wireless文件的方法_openwrt没有无线选项-程序员宅基地

文章浏览阅读9.1k次。解决Openwrt /etc/config目录下没有wireless文件的方法一、环境说明Linux内核版本:4.4.9LEDE版本:17.01.4芯片:MT7628二、解决方法1、在以下网站中寻找MT7628支持的无线网卡驱动。网址:https://wireless.wiki.kernel.org/en/users/drivers2、在Manufacturer一栏找到MTK,点击左边的驱动名称,如下所示:看到支持MT76283、进入Openwrt源码的顶层目录,执行make men_openwrt没有无线选项

Halcon中两种实现旋转的方法rotate_image和affine_trans_image-程序员宅基地

文章浏览阅读4w次,点赞2次,收藏49次。Halcon中实现旋转的方式由两种。一种是rotate_image,该方式实现简单,但只能绕中心旋转。二是affine_trans_image,该方式实现较复杂,但是可以实现绕任意位置的旋转。_rotate_image

随便推点

unity3d游戏开发猜想——当程序猿老去-程序员宅基地

文章浏览阅读96次。 程序猿将代码注入生命去打造互联网的浪潮之巅。当有一天他们老了。会走向那里,会做些什么?非常多年以后,在我60岁的那天早晨,天刚蒙蒙亮我就起床了,先去公园晨练,然后回来做早餐(50岁的时候我学会了做饭)。送完外孙上学,刚好8点。因为北京从2020年開始单双月限行了,这个月是单月。所以仅仅能挤地铁。人一如既往的多,一小伙子要给我让座,看了看他的小身板,我说不用。你也是..._unity3d有35岁危机吗

Java 小程序:实现一个购物流程的功能-程序员宅基地

文章浏览阅读989次。1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162..._java实现购买_一个简单的实现购买商品功能的java小程序

16、先天八卦与后天八卦各自有什么用途?-程序员宅基地

文章浏览阅读700次。http://www.360doc.com/content/13/0523/19/944966_287585372.shtml转载于:https://www.cnblogs.com/xue0/p/4798139.html_先天八卦与后天八卦各自有什么用途

BSD操作系统大盘点:四种主流BSD_盲点监测-程序员宅基地

文章浏览阅读9.4k次,点赞3次,收藏10次。【导读】本文将提供四个主要的BSD变体的对比,并且对基于服务器和台式电脑的解决方案提供一些建议。 那些要使用公共Unix变体的机构有两个可选解决方案inux和BSD。人们谈论比较多的Linux阵营包含了各种发布版软件。这些软件包括不同的工具和工具集。人们很少谈及的BSD阵营也是如此。本文将提供四个主要的BSD变体的对比,并且对基于服务器和台式电脑的解决方案提供一些建议。  BSD的_盲点监测

【JS】Es6无法注销事件 | class构造函数里无法注销事件解决方法(亲测有效)_js 注销事件-程序员宅基地

文章浏览阅读350次。【JS】Es6无法注销事件 | class构造函数里无法注销事件解决方法(亲测有效)_js 注销事件

iOS版本AppRTCMobile和webrtc.framework构建_webrtc 新增自定义模块方法-程序员宅基地

文章浏览阅读5.1k次。iOS版本AppRTCMobile和webrtc.framework构建_webrtc 新增自定义模块方法

推荐文章

热门文章

相关标签