镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好行程一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。
联合文件系统(UnionFS):Union 文件系统,是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
Union文件系统是Docker镜像的基础。镜像可以通过分层来进行集成,基于基础镜像可以制作具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
后来出现的docker版本中,除了AUFS,还支持OverlayFS、Btrfs、Device Mapper、VFS、ZFS等storage driver,现在使用OverlayFS
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等。
docker镜像底层层次:
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接使用Host的Kernel,自己只需要提供rootfs就可以。所以,对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,不同的发行版可以共用bootfs。
Docker支持扩展现有镜像,创建新的镜像。新镜像是从base镜像一层一层叠加生成的。
docker history
截取的nginx的分层
镜像分层的一个最大好处就是共享资源,方便复制迁移,方便复用,镜像的每一层都可以被共享。
容器启动会加载镜像自带配置,但是如果修改容器里面内容,docker会在容器生成一个新的层来储存配置文件,并不会对镜像直接修改。
当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被叫做“容器层”,“容器层”之下都叫做“镜像层”。
所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中。,镜像永远不变
只有容器层是可写的,容器层下面的所有镜像层都是只读的。
docker image inspect nginx查看镜像内部信息,截取如下片段,指示了镜像怎么存的
/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"
docker底层的 storage driver完成了以上的目录组织结果;
docker commit
提交容器副本使之成为一个新的镜像。
docker 启动一个镜像容器后, 可以在里面执行一些命令操作,然后使用docker commit
将新的这个容器快照生成一个镜像。
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[tag]
这里以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镜像了
镜像创建过程:
登录阿里云,控制台-容器镜像服务-选择个人实例-创建命令空间-创建镜像仓库
创建完阿里云会自动生成代码
将镜像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:[镜像版本号]
在dockerhub注册并创建仓库ubuntu
登录dockerhub
docker login
输入用户名和密码
修改镜像名符合规范并推送
docker tag ubuntu:1.1 liufengzhi/ubuntu:1.1
docker push liufengzhi/ubuntu:1.1
注意只有官方仓库的镜像不带全路径,非官方镜像都会带全路径,所以说推送镜像必须改镜像的名字,让其符合规范
文章浏览阅读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 时出错
文章浏览阅读1.1k次。最近NLP新词发现及情感倾向性分类任务,需要用到分词,查找了下,python,jieba分词,貌似用起来还可以,效果也不差,还没在python里试中科院的分词。jieba 分词:做最好的Python 中文分词组件。这是结巴分词的目标,我相信它也做到了。操作简单,速度快,精度不错。而且是Python 的库,这样就不用调用中科院分词ICTCLAS了。妈妈再也不用担心我不会分词啦。jieba 的主页有详..._python词素
文章浏览阅读7.7k次,点赞3次,收藏31次。1、echarts省市地图上根据数值大小给散点设置不同颜色,地图颜色不根据数值大小渲染,自己设置颜色<script> //引入基本模板 let echarts = require('echarts/lib/echarts') // 引入组件 require('echarts/lib/chart/map') // 引入地图js文件 ..._echarts散点图数据动态颜色大小
文章浏览阅读6.8k次,点赞5次,收藏21次。MATLAB绘图 最大化全屏后保存一、绘图[^1]二、图例[^2]添加图例的方式一:添加图例的方式二设置图例的排列方式图例的位置和列数显示指定曲线的图例图例背景和轮廓三、保存[^3]参考资料欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图_matlab画图全屏
文章浏览阅读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没有无线选项
文章浏览阅读4w次,点赞2次,收藏49次。Halcon中实现旋转的方式由两种。一种是rotate_image,该方式实现简单,但只能绕中心旋转。二是affine_trans_image,该方式实现较复杂,但是可以实现绕任意位置的旋转。_rotate_image
文章浏览阅读96次。 程序猿将代码注入生命去打造互联网的浪潮之巅。当有一天他们老了。会走向那里,会做些什么?非常多年以后,在我60岁的那天早晨,天刚蒙蒙亮我就起床了,先去公园晨练,然后回来做早餐(50岁的时候我学会了做饭)。送完外孙上学,刚好8点。因为北京从2020年開始单双月限行了,这个月是单月。所以仅仅能挤地铁。人一如既往的多,一小伙子要给我让座,看了看他的小身板,我说不用。你也是..._unity3d有35岁危机吗
文章浏览阅读989次。1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162..._java实现购买_一个简单的实现购买商品功能的java小程序
文章浏览阅读700次。http://www.360doc.com/content/13/0523/19/944966_287585372.shtml转载于:https://www.cnblogs.com/xue0/p/4798139.html_先天八卦与后天八卦各自有什么用途
文章浏览阅读9.4k次,点赞3次,收藏10次。【导读】本文将提供四个主要的BSD变体的对比,并且对基于服务器和台式电脑的解决方案提供一些建议。 那些要使用公共Unix变体的机构有两个可选解决方案inux和BSD。人们谈论比较多的Linux阵营包含了各种发布版软件。这些软件包括不同的工具和工具集。人们很少谈及的BSD阵营也是如此。本文将提供四个主要的BSD变体的对比,并且对基于服务器和台式电脑的解决方案提供一些建议。 BSD的_盲点监测
文章浏览阅读350次。【JS】Es6无法注销事件 | class构造函数里无法注销事件解决方法(亲测有效)_js 注销事件
文章浏览阅读5.1k次。iOS版本AppRTCMobile和webrtc.framework构建_webrtc 新增自定义模块方法