Docker详解(三)

目录

  • 1. Docker镜像

    • 1.1 镜像存储
    • 1.2 base镜像
    • 1.3 镜像Commit
  • 2. Docker容器数据卷
    • 2.1 基本介绍
    • 2.2 数据卷
    • 2.3 数据卷容器

序言:前两章我们主要介绍了Docker的概念和体系,以及Docker的镜像和容器命令,这一章我们将深入Docker镜像以及熟悉Docker的容器数据卷。OK,我们开始第三章的学习吧。

Docker详解(一)
Docker详解(二)
?
??

1. Docker镜像

1.1 镜像存储

要了解 Docker镜像的存储首先务必得了解联合文件系统 UnionFS(Union File System).

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,并且可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。

?

Docker镜像加载原理:

Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

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等等。

?

1.2 base镜像

在了解base镜像之前,我们先说一下dockerFile,之前我们把镜像比作、容器比作实例,如果有人不理解dockerFile的话,那么横向对比,你可以把它看作是 .class 文件

那么base镜像就是 没有 FROM 或者 FROM scratch开头的 DockerFile所构建出来的镜像

base镜像通常都是各种 Linux发行版的镜像,如 Centos,Ubuntu,Debian 等

且base 镜像提供的是最小安装的Linux发行版,此外 Docker Hub上 99% 的镜像都是通过在base镜像中安装和配置需要的软件构建而来

下图是 官方 Centos 镜像 的 DockerFile内容

?

1.3 镜像Commit

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

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

?

案例演示

1. 从Hub 上下载tomcat镜像到本地并成功运行 (也可采用阿里云加速下载)

docker pull tomcat

?

2. 故意删除上一步镜像生产tomcat的文档

注:如果不想新开窗口,可以 后台启动 tomcat ( docker run -d -p 8888:8080 tomcat )

docker exec -it 088c813ad8ca /bin/bash

?

3. 提交删除文档的 tomcat容器副本 作为一个新的镜像

docker commit -a="coke" -m="del tomcat docs" 088c813ad8ca coke/tomcat02:1.2

?

4. 运行我们上传成功的测试镜像

docker run -it  -p 8888:8080 coke/tomcat02:1.2

?

2. Docker容器数据卷

2.1 基本介绍

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,

那么当容器删除后,数据自然也就没有了。

为了保存数据,使容器之间可以进行数据共享,在Docker 中我们使用容器数据卷。

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

主要用途: 1. 容器的持久化 2. 容器间继承 + 共享数据

特点:

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

?

2.2 数据卷

我们接下来进行操作,尝试在容器 或者 DockerFile中 添加数据卷

直接命令添加

1、 命令添加

docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash

?

2、查看容器卷是否挂载成功

docker inspect 容器ID

?

3、容器和宿主机之间数据共享

①. 尝试在Docker 容器内进行写入,主机查看是否实时更新

?

②. 尝试在主机进行文件修改,在Docker容器进行查看是否实时更新

注意:容器停止退出,主机修改文件,容器再次重启进入,主机修改的文件依然会同步到容器哦,有兴趣的可以试试。

?

DockerFile 添加 (此处我们只要学会使用Dockerfile添加容器卷就行,Dockerfile后面会介绍)

1、在主机根目录下 新建mydocker 文件夹,并进入

mkdir mydocker 新建一个mydocker文件夹

?

2、构建一个DockerFile

vim DockFile vim编辑器 编辑DockerFile文件

# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash

docker build -f /mydocker/Dockerfile -t coke/centos . 在centos基础上构建自己的Dockfile

?

3、run 容器

docker run -it coke/centos 运行我们刚刚构建的镜像的实例容器

?

4、获取主机的默认目录,后面 容器卷同步数据操作 同直接命令添加

docker inspect 容器ID

?

2.3 数据卷容器

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器

  • 我们以上一步新建的镜像 coke/centos 为模板运行容器 dc01/dc02/dc03
  • 它们已经具有的容器卷:/dataVolumeContainer1、/dataVolumeContainer2

?

1、先启动一个父容器dc01,在dataVolumeContainer2新增内容

cd dataVolumeContainer2
touch doc01_add.txt

?

2、dc02/dc03继承自dc01,分别在dataVolumeContainer2中新增内容

docker run -it --name dc02 --volumes-from dc01 coke/centos dc02继承dc01

说明:doc02继承doc01后,容器卷中的文件做到了共享

?

docker run -it --name dc03 --volumes-from dc01 coke/centos dc03继承dc02

?

3、回到dc01可以看到02/03各自添加的数据都能共享了

?

4、删除dc01,dc02修改后打dc03可否访问

?

结论:容器之间的配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。

原文地址:https://www.cnblogs.com/dwlovelife/p/11568124.html

时间: 2024-10-07 03:56:15

Docker详解(三)的相关文章

spark2.x由浅入深深到底系列六之RDD java api详解三

学习任何spark知识点之前请先正确理解spark,可以参考:正确理解spark 本文详细介绍了spark key-value类型的rdd java api 一.key-value类型的RDD的创建方式 1.sparkContext.parallelizePairs JavaPairRDD<String, Integer> javaPairRDD =         sc.parallelizePairs(Arrays.asList(new Tuple2("test", 3

php学习之道:WSDL详解(三)

通过声明方式定义绑定(binding)属性 如果你在服务中采用SOAP binding,你可以使用JAX-WS来指定一定数量的属性binding.这些属性指定对应你在WSDL中指定的属性.某些设置,比如参数类型,可以约束你实现的方法,这些设置也影响声明的效用. @SOAPBinding声明,定义在javax.jws.soap.SOAPBinding接口中.它提供发布时的SOAP Binding细节.如果@SOAPBinding没有被指定,则用缺省的doc/literal SOAPBinding.

UINavigationController详解三(转)ToolBar

原文出自:http://blog.csdn.net/totogo2010/article/details/7682641,特别感谢. 1.显示Toolbar  在RootViewController.m的- (void)viewDidLoad方法中添加代码,这样Toobar就显示出来了. [cpp] view plaincopy [self.navigationController  setToolbarHidden:NO animated:YES]; 2.在ToolBar上添加UIBarBut

logback -- 配置详解 -- 三 -- &lt;encoder&gt;

附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appender> logback -- 配置详解 -- 三 -- <encoder> logback -- 配置详解 -- 四 -- <filter> -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

Android基础入门教程——8.3.6 Paint API之—— Xfermode与PorterDuff详解(三)

Android基础入门教程--8.3.6 Paint API之-- Xfermode与PorterDuff详解(三) 标签(空格分隔): Android基础入门教程 本节引言: 上一节,我们学习了Xfermode中的三儿子:PorterDuffXfermode构造方法中的为一个参数: PorterDuff.Mode,我们在观看了16种图片混排模式后,又自己写代码来验证了一下文档中 18种不同的混排模式,18种是新增了ADD和OVERLAY两种模式!当然,仅仅验证知道是不够的, 本节我们来写个例子

LinearLayout详解三:LayoutInflater创建View过程分析

项目人力资源管理主要有以下几个过程: 编制人力资源管理计划 组建项目团队 建设项目团队 项目团队管理 编制人力资源管理计划 根据什么来编? 直观点就是你要干什么事?干这些事有哪些制约? 这个说起来好像和没说一样,但就我自己做的一些项目来说,有以下困难: 1> 项目前期需求是不具体不明确的 这样直接导致你做项目计划时WBS也是不明确的,进而你细化不了活动,自然你也没法 明确活动需要什么样的人. 这个时候怎么办? 就我个人而言,有2种员工很喜欢: 1> 数学思维强的, 注意不是会做高数题,是指给你

WebSocket安卓客户端实现详解(三)–服务端主动通知

WebSocket安卓客户端实现详解(三)–服务端主动通知 本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连 WebSocket安卓客户端实现详解(二)–客户端发送请求 终于是最后一篇啦,有点激动\ ( ≧▽≦ ) /啦啦啦, 服务端主动通知 热身完毕,我们先回顾下第一篇中讲到的服务端主动通知的流程 根据notify中事件类型找到对应的处理类,处理对应逻辑. 然后用eventbus通知对应的ui界面更新. 如果

Spring4.0MVC学习资料,ApplicationContext中的方法详解(三)

做为java开源的一部分,spring框架一直排在老大的位置.Spring4.0 是 Spring 推出的一个重大版本升级,进一步加强了 Spring 作为 Java 领域第一开源平台的地位.Spring4.0 引入了众多 Java 开发者期盼的新特性,如泛型依赖注入.SpEL.校验及格式化框架.Rest风格的 WEB 编程模型等.这些新功能实用性强.易用性高,可大幅降低 JavaEE 开发的难度,同时有效提升应用开发的优雅性.为了方便开发,Spring的ApplicationContext类,

Docker详解(二)

目录 Docker常用命令 1. 镜像命令 2. 容器命令 2.1 常用的容器命令 2.2 重要的容器命令 序言:上一章我们初步介绍了一下Docker的概念,那么这次我们着手于Docker的使用,了解一下常见的Docker的操作命令.此外不管学习什么东西,我们不但要了解纵向的知识体系,最好能加上横向的扩展,进行类比,Docker的命令风格和Git有着种种相似.好了废话不多说,我们开始Docker详解第二章吧. Docker详解(一) ? Docker常用命令 开胃菜,Docker的帮助命令 do