一、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. 2024年 智能机器人元年 —— 国内的智能机器人(humanoid)公司当下最大的压力(最为急迫的任务)是什么?

    可以说,2024年是人形机器人的元年.我国在去年年底将发展智能机器人立为了第一线的重要科技发展方向,并计划在2024年.2025年建立出完整的产业链条,并培育出几家成熟的行业领先的智能机器人公司.而我 ...

  2. DophinScheduler 如何定期删除日志实例?

    转载自东华果汁哥 Apache DophinScheduler 运行一段时间后,实例调度日志越来越多,需要定期清理. SQL 错误 [1701] [42000]: Cannot truncate a ...

  3. JDBC Vertica Source Connector 使用文档

    支持以下引擎 Spark Flink SeaTunnel Zeta 关键特性 批处理 精确一次性处理 列投影 并行处理 支持用户自定义拆分 支持查询 SQL 并实现投影效果 描述 通过 JDBC 读取 ...

  4. Codeforces Round 964 (Div. 4)

    Codeforces Round 964 (Div. 4) A送分 B 大意:两个人两张牌 随机翻 求a翻出来的牌比b大的可能 #include <cstdio> #include < ...

  5. Linux系统中目录和文件夹是一个东西吗

    目录和文件夹的区别   在阐述Linux系统的目录前,我们先来回忆一下现实中的目录和文件夹是什么:   在现实中,文件夹(封套)可以用来保存几个文件(或其他项目).而目录则可以用来维护项目的索引,这样 ...

  6. Leetcode: 586. Customer Placing the Largest Number of Orders

    题目要求如下: 给出的例子如下: 简单地说就是要找出表中订单最多客户的ID. 使用如下的代码进行实现: import pandas as pd def largest_orders(orders: p ...

  7. Spring Security入门教程 通俗易懂 超详细 【内含案例】

    Spring Security的简单使用 推荐 Java 常见面试题 简介 SSM 整合 Security 是比较麻烦的,虽然Security的功能比 Shiro 强大,相反却没有Shiro的使用量多 ...

  8. 一文教你如何用C代码解析一段网络数据包?【含代码】

    本文的目的是通过随机截取的一段网络数据包,然后根据协议类型来解析出这段内存. 学习本文需要掌握的基础知识: 网络协议 C语言 Linux操作 抓包工具的使用 其中抓包工具的安装和使用见下文: < ...

  9. Mac 使用远程 Ubuntu 机器进行时间备份

    设置 SMB 服务 首先在 Ubuntu 中配置 SMB 服务.可以参考 Ubuntu 设置 SMB 服务. 创建 APFS 磁盘映像 我们在 Ubuntu 上创建出的 SMB 共享文件夹可以用来存放 ...

  10. Semantic Kernel/C#:一种通用的Function Calling方法,文末附经测试可用的大模型

    Funcion Calling介绍 函数调用允许您将模型如gpt-4o与外部工具和系统连接起来.这对于许多事情都很有用,比如为AI助手赋能,或者在你的应用程序与模型之间建立深度集成. 如果您了解或者使 ...