先抛出几个我在学习过程中产生的几个问题.

1. 容器镜像是什么, 和装系统时的镜像有什么关系?

2. 容器镜像的作用是什么?

3. 不同版本的ubuntu镜像有什么区别, 比如说 ubuntu:18.04和ubuntn:16.04 的区别?

4. Docker镜像为什么要分层? 每层都包含什么? 什么时候会创建新的一层 ? 每层的权限是如何配置的? 只有最底层的镜像层是只读的吗?
 

1 Docker镜像之初见

1.1 什么是镜像

使用docker pull <image name>下载一个镜像看看

可以看到我们仅仅是pull了一个ubuntu18.04的镜像, docker pull的结果却出现了多行, 这是因为镜像是分成多层的. 具体为什么要分层? 每一层又是什么? 下文我们会谈到.

由于docker 18.04采用的是overlayfs2作为默认的存储驱动, 所以下载的镜像都存储在/var/lib/docker/overlay2 中.

可以看到这里的目录个数和镜像层数是一致. 并且除了0c开头的那一层, 其他目录都是有diff和work两个子目录 . 0c开头的目录就是整个镜像最底层的只读层

l目录下全部都是指向这些diff目录的软链接.让我们进入0c.../diff中看看, 可以看到在diff目录中是一套完整的根目录. 所以说本质上, 根目录就是一个rootfs.

跟装系统时的镜像没有一点点关系.

1.2 构建Docker镜像

本节来说说如何使用, 使用Dockerfile构建自己的镜像, dockfile由一系列的命令构成。我目前用过的有FROM RUN CMD ADD COPY命令。

From用来制定一个基础镜像层。

RUN命令会在一个新的镜像层上执行参数中所指定的任何命令, 并commit命令的执行结果。

CMD命令在我初次使用时, 与RUN有所混淆. 但是其实二者是完全不同的, CMD只是指定了运行容器时的初始命令, 但是在镜像构建时没有commit任何命令的结果。

举例来说, 下图是一个Dockerfile. 在其中我们先在一个新的镜像层创建一个shell脚本, 然后在CMD中运行这个脚本。

可以看到容器执行CMD中指定的命令.

2 镜像的特性

2.1 分层特性

  在我们使用docker run命令启动一个容器时, 就会在现有的只读镜像层之上在创建一个可读写的容器层. 当我们将这些容器删除时, 这些容器层也会被删除.

但是容器层之下的镜像层却不会改变.

图盗自(docker reference)

通过这种共享相同的镜像层的方式, 容器即实现了一定的隔离(容器层之间), 又节省了空间.

2.2 写时拷贝(COW)

如果容器需要读底层的文件或者目录, 那么直接读取底层的文件. 但是如果容器需要修改底层的文件, 那么容器层就会拷贝一个底层的文件.

虽说都是COW策略, 但是实现起来, 不同的存储驱动也是有所不同的.

以overlayfs/overlayfs2为例:

    1. 搜索所有的镜像层, 找到要修改的文件, 这个过程从最新的一层直到最底层. 另外搜索结果会放到缓存中, 加速下一次的查找。

    2. 执行copy_up操作, 将文件拷贝到容器层

    3. 修改文件的拷贝, 同时底层的文件对于容器层是不可见的.

只说了修改和读取, 那么当容器层要删除一个镜像层的文件时, 会发生什么呢? 让我们看看。

先直接在底层镜像层中创建一个文件, 还记得上文中说到的那个只有diff目录和link文件的目录吗?那个就是最底层的镜像层。

我们直接在diff/tmp/目录中创建一个文件, 文件名为thisIsAFileCreateImageLayer

然后运行一个容器, 进入tmp目录, 可以看到这个文件对于容器是可见的.

在容器层删除该文件

在镜像层看看

由上图可以看到在镜像层, 该文件是依然存在的, 这是因为在容器层, 在容器层删除文件或者目录

时, overlayfs采用了whiteouts和opaque技术.

Whiteouts是一个设备号为0/0的字符设备文件. 当上层目录中发现一个whiteout文件时, 在上层目录中读取底层的同名的文件时, 底层的文件就会被忽略.

如下图所示, 在新创建的容器层中我们可以看到一个设备号为0,0的字符设备文件.

接下来我来尝试解答一下我之前的疑问:

其实前两个问题已经得到了解答, 先说说第三个问题

3. 不同版本的ubuntu镜像有什么区别, 比如说 ubuntu:18.04和ubuntn:16.04  的区别?

不同版本的ubuntu的区别我目前知道的区别是软件库的版本不同.

4. Docker镜像为什么要分层? 每层都包含什么? 什么时候会创建新的一层 ? 每层的权限是如何配置的? 只有最底层的镜像层是只读的吗?
     分层实现了空间最小化的隔离, 在运行一个新的容器时会创建一个新的读写层, 在使用Dockerfile构建新的镜像时会在已有的镜像层的基础上创建新的一层.
 

参考

https://docs.docker.com/storage/storagedriver/   //关于docker存储驱动很好的讲解
 

Docker镜像浅谈的更多相关文章

  1. Docker技术浅谈:私有化部署的优势以及在顶象内部的应用实践

    顶象全景式业务安全风控体系基于新一代风控体系构建,并采用Docker技术进行私有云和公有云部署.本文主要和大家分享下Docker容器技术和顶象风控系统私有化部署的优势以及Docker容器技术在顶象内部 ...

  2. 浅谈Docker

    一.为什么使用Docker 软件开发最大的麻烦事之一,就是环境配置.很多人想到,能不能从根本上解决问题,软件可以带环境安装? 也就是说,安装的时候,把原始环境一模一样地复制过来. 目前有两个主流解决方 ...

  3. 浅谈虚拟机、Docker和Hyper技术

    操作系统 我们知道: 完整的操作系统=内核+apps 内核负责管理底层硬件资源,包括CPU.内存.磁盘等等,并向上为apps提供系统调用接口,上层apps应用必须通过系统调用方式使用硬件资源,通常并不 ...

  4. 浅谈surging服务引擎中的rabbitmq组件和容器化部署

    1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...

  5. 浅谈Nginx负载均衡和F5的区别

    前言 笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道"墙",将请求分发到web服务器后,web服务器上的Nginx再进行处 ...

  6. Android安全开发之浅谈密钥硬编码

    Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...

  7. 【架构】浅谈web网站架构演变过程

    浅谈web网站架构演变过程   前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变.   该系统具备的功能:   用户模块:用户注册和管理 商品模块:商品展示和管 ...

  8. 浅谈 举家搬迁静态文件到CDN

    由于七牛CDN最近做活动,对于标准用户可以免费使用如下优惠 10 GB 存储空间 10 G/月 下载流量 10 万次/月 PUT/DELETE 请求 100 万次/月 GET 请求 以上这些指标直接就 ...

  9. docker镜像、容器

    第一部分:Docker镜像的基本知识 1.1 什么是Docker镜像 从整体的角度来讲,一个完整的Docker镜像可以支撑一个Docker容器的运行,在 Docker容器运行过程中主要提供文件系统视角 ...

随机推荐

  1. 操作Hadoop集群

    操作Hadoop集群 所有必要的配置完成后,将文件分发到所有机器上的HADOOP_CONF_DIR目录.这应该是所有机器上相同的目录. 一般来说,建议HDFS和YARN作为单独的用户运行.在大多数安装 ...

  2. Keras 时序模型

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Thinking_boy1992/article/details/53207177 本文翻译自 时序模 ...

  3. lua中的weak table

    weakTable = {} weakTable[] = function() print("i am the first element") end weakTable[] = ...

  4. create-react-native-app

    create-react-native-app官网介绍链接,github文档,可以看看了解一下,总之是一个5分钟快速搭建react native项目并能看到效果的方法. 假设你已经安装了Node,你可 ...

  5. SQL Server 有序GUID,SequentialGuid,

    问题描述 有序的GUID性能对比,堪比自增ID integer 一个大神告诉我NEWSEQUENTIALID() 在数据迁移的时候会有问题(感谢大神指点),所以我就深挖一下这个函数. 关于NEWSEQ ...

  6. Ubuntu下安装CUDA

    cuda check: cuDNN 下载cuDNN后解压 更新软链接 更新链接库 symbol link 参考链接: http://docs.nvidia.com/cuda/cuda-installa ...

  7. web.config如何实现301跳转

    .htaccess的301定向非常简单,那么web.config的301定向又应该怎么实现呢? 先来看下,web.config中的301格式 <?xml version="1.0&qu ...

  8. July 07th 2017 Week 27th Friday

    Learn wisdom by the follies of others. 要从别人的愚行中学到智慧. How to become smart or what characters should a ...

  9. June 29th 2017 Week 26th Thursday

    Hope for the best, but prepare for the worst. 做最好的期望,做最坏的打算. Always remember that quotes about being ...

  10. linux 配置 tftp

    环境:ubuntu 目的:搭建嵌入式板子网络环境 1)下载tftpd-hpa tftp-hpa 前者是服务器,后者是客户端 $sudo apt-get install tftpd-hpa tftp-h ...