一、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. Jupyter Lab和Jupyter Notebook的区别

    JupyterLab与Jupyter Notebook:详细比较 简介 Jupyter Notebook是一个开源的Web应用程序,允许用户创建和共享包含实时代码.方程.可视化和解释性文本的文档.Ju ...

  2. 论文《policy-gradient-methods-for-reinforcement-learning-with-function-approximation 》的阅读——强化学习中的策略梯度算法基本形式与部分证明

    最近组会汇报,由于前一阵听了中科院的教授讲解过这篇论文,于是想到以这篇论文为题做了学习汇报.论文<policy-gradient-methods-for-reinforcement-learni ...

  3. mujoco_py.cymj.GlfwError: Failed to initialize GLFW

    安装mujoco后运行可视化界面代码报错: mujoco_py.cymj.GlfwError: Failed to initialize GLFW 解决方法: sudo apt-get install ...

  4. 再探 游戏 《 2048 》 —— AI方法—— 缘起、缘灭(6) —— Python版本实现的《2048》游戏环境运行性能对比

    <2048>游戏在线试玩地址: https://play2048.co/ 如何解决<2048>游戏源于外网的一个讨论帖子,而这个帖子则是讨论如何解决该游戏的最早开始,可谓是&q ...

  5. 内存交换空间--Swap Space

    转载请注明出处: 一.概述 内存交换空间(Swap Space)是计算机内存的一种补充,位于硬盘驱动器上.当物理内存(RAM)不足时,系统会将不活跃的页面(或称为内存页)移到交换空间中,以释放物理内存 ...

  6. ollama安装和运行llama3.1 8b

    ollama安装和运行llama3.1 8b conda create -n ollama python=3.11 -y conda activate ollama curl -fsSL https: ...

  7. 项目管理工具Maven的简单配置示例

    Maven是一个强大的项目管理工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建.报告和文档.以下是一些关于Maven的具体例子,涵盖了项目配置.依赖管理.插件使用等方面: ...

  8. jQuery的基本操作总结

    什么是jquery? 就是一个用js的插件库   解决了原生dom的操作的兼容性和代码量 使用前需要引入它的js库 以下例子以 jQuery1.12.4.js  这个版本为例 一:jQuery入口函数 ...

  9. mysql读写分离之springboot集成

    springboot.mysql实现读写分离 1.首先在springcloud config中配置读写数据库 mysql: datasource: readSize: 1 #读库个数 type: co ...

  10. this 之谜揭底:从浅入深理解 JavaScript 中的 this 关键字(二)

    前言 系列首发于公众号『前端进阶圈』 ,若不想错过更多精彩内容,请"星标"一下,敬请关注公众号最新消息. this 之谜揭底:从浅入深理解 JavaScript 中的 this 关 ...