一、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. 《重学Java设计模式》笔记——建造者模式

    1. 建造者模式可以解决什么问题 我家里有各种形状的瓷器,盘子或者碗.虽然形状不同,但是所用的材料基本上是一样的,比如土.水.釉.彩这些基本的东西. 但是做不同款式的瓷器,方法是不同的.假如说我现在已 ...

  2. 什么是ARM中的SP(堆栈)和LR?

    LR是用于保存函数调用的返回地址的link register. SP是堆栈指针.堆栈通常用于在函数调用中保存"automatic"变量和上下文/参数.从概念上讲,您可以将" ...

  3. 【CMake系列】10-cmake测试集成googletest与第三方库自动化构建

    cmake测试,使用ctest 可能不能满足我们的需求,需要我们使用更为强大的第三方测试框架,如googletest,完成项目中的测试工作 本篇文章将第三方测试框架 googletest,引入,同时也 ...

  4. Typora 上传到 Github 实现笔记同步管理

    首先在 Github 上 new 一个 repository ,我建的名称是 md_notes 然后在本地 terminal 中启动以下命令新建一个 ssh key  ssh-keygen -o 生成 ...

  5. Docker 构建多平台镜像

    构建多平台镜像的方法分为两种:一种是在不同平台的机器上分别构建并推送对应平台的镜像,然后通过 Docker Manifest 将两个镜像标签合并为一个.另一种是通过 Docker buildx 在一台 ...

  6. NET Core 多身份校验与策略模式

    背景需求:   系统需要对接到XXX官方的API,但因此官方对接以及管理都十分严格.而本人部门的系统中包含诸多子系统,系统间为了稳定,程序间多数固定Token+特殊验证进行调用,且后期还要提供给其他兄 ...

  7. Go plan9 汇编:手写汇编

    原创文章,欢迎转载,转载请注明出处,谢谢. 0. 前言 在 Go plan9 汇编: 打通应用到底层的任督二脉 一文中介绍了从应用程序到汇编指令的转换.本文将结合汇编和 Go 程序实现手写基本的汇编指 ...

  8. Unrecognized SSL message, plaintext connection?

    报错:Unrecognized SSL message, plaintext connection? 修改:把 requestContext.setScheme(Scheme.HTTPS);修改为 r ...

  9. spark 中怎么像 pandas 里面对时间数据做 resample

    1. 笨办法 pandas Dataframe 可以很容易做时序数据的 resample,按照一定的frequency 聚合数据. 但是spark 中因为没有顺序的概念就不太好做,下面是怎么在spar ...

  10. RabbitMQ脑裂处理

    脑裂现象: Network partition detectedMnesia reports that this RabbitMQ cluster has experienced a network ...