一、Docker镜像

镜像的定义:镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库以及环境变量和配置文件等)这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。

1、镜像的分层

以pull命令为例在下载的过程中可以看到docker的镜像好像是在一层一层的在下载

2、UnionFS(联合文件系统)

UnionFS是一种分层、轻量級并且高性能的文件系统,它文持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualflesvstem)。

UnionFS文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像)可以制作各利具体的应用镜像。

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

3、Docker镜像加载原理

Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就叫UnionFS(联合文件系统)。

bootfs(boot file system)主要包含bootoader和kemel, bootoader主要是引导加载kemne,Linux启动时会加载boots文件系统,在Docker镜像的最底层是引导文件系统boots。

这一层与Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

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

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

**4、镜像分层的优点

镜像分层最大的一个好处就是共享资源,方便复制迁移,本质就是为了复用。如:

有多个镜像都从相同的base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像:同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

重要

Docker镜像层都是只读的,容器层是可写的当容器启动时,一个新的可写层被加载到镜像的顶部这一层通常被称作“容器层",“容器层"之下的都叫“镜像层。

所有对容器的改动-无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

二、Docker commit命令

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

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

案例演示在ubuntu上增加vim

1)从Hub上下载ubuntu镜像到本地并成功运行

2)原始的默认ubuntu镜像是不带着vim命令的

3)外网连通的情况下安装vim

在docker容器内执行
apt-get update//更新管理工具
apt-get -y install vim//安装vim工具

4)安装完成后,commit我们自己的新镜像启动我们的新镜像并和原来的对比

docker commit -m="add vim cmd" a="yangzhen" [容器ID] [镜像名]:版本号

总结

Docker中的镜像分层,支持通过扩展现有镜像创建新的镜像。类似Java继承于一个Base基础类,自己再按需扩展。

新镜像是从base镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层

具体可参考该图

三、容器数据卷

1、容器卷的概念

应用场景

在工作中容器卷的主要目的就是对数据的持久化,将数据映射到宿主机下防止镜像丢失后造成的数据遗失,类似于Redis中的rdb和aof。

特点:

1):数据卷可在容器之间共享或重用数据

2):卷中的更改可以直接实时生效

3):数据卷中的更改不会包含在镜像的更新中

4):数据卷的生命周期一直持续到没有容器使用它为止

2、读写规则以及映射示例:

docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true [容器]
-v /宿主机路径:/容器路径 ==》实现信息共享,互通互联
--privileged=true//此选项提供了对主机系统资源更深层次的访问权限 docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry**:rw** --privileged=true
不加:rw也默认为开放读写权限
**若想把容器设置为只读权限需要将rw改成ro,修改后容器只有读取权限。ro意为read only**
docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry**:ro** --privileged=true

注意事项

1)docker修改,主机同步获得,

2)主机修改,docker也可以同步获得

3)docker容器stop,主机修改,dokcer启动之后也能同步获得

查看数据卷是否挂载成功

3、容器卷之间的继承:

docker run -it --privileged=true --volumes-from [父类的容器名称] --name [别名] [容器名]

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

四、Docker镜像的发布//这里的相关信息都是作者本人的其他人需要注册后自行修改

镜像的发布本身还是为了用于同步,方便公司间的同事进行容器的共享

这里还是推荐发布到阿里,阿里分为公有或者私有 https://cr.console.aliyun.com/repository/cn-hangzhou/tiand-bnkan/bz-za/details

发布

docker login --username=aliyun2541578038 registry.cn-hangzhou.aliyuncs.com
docker tag [容器ID] registry.cn-hangzhou.aliyuncs.com/tiand-bnkan/bz-za:[版本号]
docker push registry.cn-hangzhou.aliyuncs.com/tiand-bnkan/bz-za:[镜像版本号]

拉取

docker pull registry.cn-hangzhou.aliyuncs.com/tiand-bnkan/bz-za:[镜像版本号]`

Docker升阶的更多相关文章

  1. [问题2014A01] 解答三(升阶法,由董麒麟同学提供)

    [问题2014A01] 解答三(升阶法,由董麒麟同学提供) 引入变量 \(y\),将 \(|A|\) 升阶,考虑如下行列式: \[|B|=\begin{vmatrix} 1 & x_1-a & ...

  2. [问题2014A02] 解答一(两次升阶法,由张钧瑞同学、董麒麟同学提供)

    [问题2014A02] 解答一(两次升阶法,由张钧瑞同学.董麒麟同学提供) 将原行列式 \(|A|\) 升阶,考虑如下 \(n+1\) 阶行列式: \[|B|=\begin{vmatrix} 1 &a ...

  3. sql的升阶

    前言:基本数据库操作根本无法满足实际的需要,需要引入更多的操作. 触发器-隐式的,主动的,更新数据表中的信息.带有inserted和deleted两个临时表,代表新操作和旧操作. 它是一种特殊的存储过 ...

  4. nodejs技术升阶思路

    经历一两年的node后端开发,熟悉了node原生api.常用包.数据库操作语句.一两个框架等,技术会达到一个瓶颈.如果没有足够的动力去深入,很容易老死在这个瓶颈上. 下面总结一下,提升点和方向: 站在 ...

  5. python基础一 day9 函数升阶(3)

    局部命名空间一般之间是独立,局部命名空间是调用函数时生成的函数的名字指向它所在的地址局部不会对全局产生影响,除非加global.# def max(a,b):# return a if a>b ...

  6. python基础一 day9 函数升阶(2)

    def max(a,b): return a if a>b else bprint(max(1, 2)) # 函数进阶# a = 1# def func():# print(a)# func() ...

  7. python基础一 day9 函数升阶(1)

    函数 可读性强 复用性强def 函数名(): 函数体 return 返回值所有的函数 只定义不调用就一定不执行 先定义后调用 函数名() #不接收返回值返回值 = 函数名() #接收返回值 返回值 没 ...

  8. 重磅:前端 MVVM 与 FRP 的升阶实践 —— ReRest 可视化编程

    ReRest (Reactive Resource State Transfer) 是前端开发领域新兴的方法论体系,它继承了 MVVM 与 FRP 编程理念,在技术上有不少创新.本文从专利稿修改而来, ...

  9. n阶行列式计算

    1.化为上下三角 该类型的矩阵.行列式在之前写过(https://www.cnblogs.com/wangzheming35/p/12906624.html),也建议记住这个行列式的结论. 当然不仅仅 ...

  10. 现在的 Linux 内核和 Linux 2.6 的内核有多大区别?

    作者:larmbr宇链接:https://www.zhihu.com/question/35484429/answer/62964898来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

随机推荐

  1. 个人的谷歌学术主页:https://scholar.google.co.kr/citations?user=jHvm-VAAAAAJ&hl=en

    主页地址: https://scholar.google.co.kr/citations?user=jHvm-VAAAAAJ&hl=en

  2. 【转载】 Tensorflow Guide: Batch Normalization (tensorflow中的Batch Normalization)

    原文地址: http://ruishu.io/2016/12/27/batchnorm/ ------------------------------------------------------- ...

  3. 【转载】 在Ubuntu环境下,搜狗输入法乱码问题的解决

    原文作者:高坦的博客 | Tan's Blog 原文链接:https://www.cnblogs.com/gtscool/p/12234104.html本文采用 BY-NC-SA 许可协议.转载请注明 ...

  4. 如何修复ubuntu的uefi启动——如何将Ubuntu安装入移动硬盘中

    交代一下使用场景,个人平时经常使用Ubuntu系统,由于不喜欢总在一个地方呆但是来回搬电脑又不是十分的方便,于是想到了一个好的方案,那就是把Ubuntu系统安装到移动硬盘中,这样不论是在家还是在实验室 ...

  5. 【问题解决】git status中文文件名乱码

    问题复现 解决办法 在git bash中直接执行如下命令 git config --global core.quotepath false 原因 通过 git config --help 可以查看到以 ...

  6. 2. 基于MCU应用的EMC指南

    1. 硬件 主要的噪声感受器和发生器是印刷电路板(PCB)上的轨道和布线,特别是MCU附近的轨道和布线.因此,防止噪声问题的第一步行动涉及到PCB布局和电源设计.一般来说,MCU周围的元器件数量越少, ...

  7. .NET中各种线程同步锁

    编程编的久了,总会遇到多线程的情况,有些时候我们要几个线程合作完成某些功能,这时候可以定义一个全局对象,各个线程根据这个对象的状态来协同工作,这就是基本的线程同步. ​支持多线程编程的语言一般都内置了 ...

  8. 什么是API?(详解)

    编程资料时经常会看到API这个名词,网上各种高大上的解释估计放倒了一批初学者.初学者看到下面这一段话可能就有点头痛了. API(Application Programming Interface,应用 ...

  9. Oracle数据库自动备份

    1.bat脚本 格式为ANSI格式 set CURDATE=%date:~0,4%%date:~5,2%%date:~8,2% set CURMON=%date:~0,4%%date:~5,2% se ...

  10. 关于SQLServer数据库的READ_COMMITTED_SNAPSHOT隔离级别

    默认情况下,SQL Server的事务隔离级别是READ COMMITED.刚开始我理解这个模式就是读已经提交的,那也就是说并发一个事务去更新,一个事务查询同一条数据应该是像Mysql.Oracle不 ...