Docker详解(三)
序言:前两章我们主要介绍了Docker的概念和体系,以及Docker的镜像和容器命令,这一章我们将深入Docker镜像以及熟悉Docker的容器数据卷。OK,我们开始第三章的学习吧。
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可否访问


结论:容器之间的配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
Docker详解(三)的更多相关文章
- Docker详解(四) — Dockerfile剖析
目录 1.Dockfile简介 2. Dockerfile构建过程解析 3. Dockerfile体系结构 4. 案例 4.1 自定义mycentos 4.2 CMD/ENTRYPOINT 镜像案例 ...
- .NET DLL 保护措施详解(三)最终效果
针对.NET DLL 保护措施详解所述思路完成最终的实现,以下为程序包下载地址 下载 注意: 运行环境为.net4.0,需要安装VS2015 C++可发行组件包vc_redist.x86.exe.然后 ...
- Android 之窗口小部件详解(三) 部分转载
原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...
- WebSocket安卓客户端实现详解(三)–服务端主动通知
WebSocket安卓客户端实现详解(三)–服务端主动通知 本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连 We ...
- logback -- 配置详解 -- 三 -- <encoder>
附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...
- python设计模式之装饰器详解(三)
python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...
- Python操作redis字符串(String)详解 (三)
# -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...
- Docker详解(二)
目录 1.Docker常用命令 1.1 镜像命令 1.2 容器命令 1.2.1 常用的容器命令 1.2.2 重要的容器命令 序言:上一章我们初步介绍了一下Docker的概念,那么这次我们着手于Dock ...
- pika详解(三)SelectConnection及其他Connection
pika详解(三)SelectConnection及其他Connection 本文链接:https://blog.csdn.net/comprel/article/details/94661147 ...
随机推荐
- U盘制作启动盘后空间容量变小解决方法
WinAll的快速恢复方式: 0.windows键+R(调出运行窗口)输入:diskpart回车(调出磁盘管理器) 1.输入:list disk回车(从大小容量确定目标U盘的盘符X) 2.输入:sel ...
- 『深度应用』NLP机器翻译深度学习实战课程·壹(RNN base)
深度学习用的有一年多了,最近开始NLP自然处理方面的研发.刚好趁着这个机会写一系列NLP机器翻译深度学习实战课程. 本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内容:(更新 ...
- Hive 系列(七)—— Hive 常用 DML 操作
一.加载文件数据到表 1.1 语法 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (p ...
- 基于注解的SpringAOP源码解析(三)
注意,读完本篇文章需要很长很长时间 在之前的2篇文章:AOP源码分析(一)AOP源码分析(二) 中,我们搭建了SpringAOP源码分析的环境,介绍了@EnableAspectJAutoProxy注解 ...
- 【实践总结】给Centos和Ubuntu设置静态网络IP以及配置ssh功能
作为一名以Windows平台为主的开发者,在接触和使用Linux系统的过程中总会遇到一系列的问题.每当这时候,我相信大部分人是和我一样的处理办法,就是网上各种搜索尝试直到问题解决为止,而有些问题,前后 ...
- .NET Core 小程序开发零基础系列(1)——开发者启用并牵手成功
最近几个月本人与团队一直与小程序打交道,对小程序的实战开发算比较熟悉,也因一些朋友经常问我各种小程序问题,无不能一一回答,想了很久,决定还是空余时间来写写文章吧,偶尔发现一个人安静的时候写文章特爽 ...
- Linux面试题总结
1.简述Apache两种工作模式,以及它们之间的区别.答:(1)prefork MPM使用多个子进程,每个子进程只有一个线程来处理一个http请求,直到这个TCP连接被释放.root主进程在最初建立s ...
- 分布式日志收集系统 —— Flume
一.Flume简介 Apache Flume 是一个分布式,高可用的数据收集系统.它可以从不同的数据源收集数据,经过聚合后发送到存储系统中,通常用于日志数据的收集.Flume 分为 NG 和 OG ( ...
- Delphi - cxGrid添加Footer显示
cxGrid - 添加footer显示 1:添加Footer Items 单击cxGrid Customize... ,Summary,Add: 2:添加Footer items数据绑定 选中一条需要 ...
- Linux下Tomcat项目访问路径修改
1.去除端口号8080. 首先,进入tomcat的安装目录下的conf目录,我的目录是 /usr/local/apache-tomcat-9.0.20/conf,编辑文件server.xml. 将se ...