一、base 镜像

base 镜像有两层含义:

1. 不依赖其他镜像,从 scratch 构建。
2. 其他镜像可以之为基础进行扩展。

base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ubuntu, Debian, CentOS 等,以 CentOS 为例学习 base 镜像包含哪些内容。

下载镜像:
[root@docker ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
af4b0a2388c6: Pull complete
Digest: sha256:2671f7a3eea36ce43609e9fe7435ade83094291055f1c96d9d1d1d7c0b986a5d
Status: Downloaded newer image for centos:latest ##下载centos最新镜像
查看镜像信息:
[root@docker ~]# docker images centos
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              ff426288ea90        4 weeks ago         207MB

使用docker pull centos下载最新版本的Centos镜像也就207M左右,而我们平时下载一个原生的centos镜像都是4G,对于 Docker 初学者都会有这个疑问。

下面来了解下Linux 操作系统由内核空间和用户空间组成,如下图所示:

rootfs

内核空间是 kernel,Linux 刚启动时会加载 bootfs 文件系统,之后 bootfs 会被卸载掉。
用户空间的文件系统是 rootfs,包含我们熟悉的 /dev, /proc, /bin 等目录。
对于 base 镜像来说,底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。
而对于一个精简的 OS,rootfs 可以很小,只需要包括最基本的命令、工具和程序库就可以了。相比其他 Linux 发行版,CentOS 的 rootfs 已经算臃肿的了,alpine 还不到 10MB。
我们平时安装的 CentOS 除了 rootfs 还会选装很多软件、服务、图形桌面等,需要好几个 GB 就不足为奇了。

base 镜像提供的是最小安装的 Linux 发行版。

下面是 CentOS 镜像的 Dockerfile 的内容:

第二行 ADD 指令添加到镜像的 tar 包就是 CentOS 7 的 rootfs。在制作镜像时,这个 tar 包会自动解压到 / 目录下,生成 /dev, /porc, /bin 等目录。

注:可在 Docker Hub 的镜像描述页面中查看 Dockerfile 。

支持运行多种 Linux OS

不同 Linux 发行版的区别主要就是 rootfs。

比如 Ubuntu 14.04 使用 upstart 管理服务,apt 管理软件包;而 CentOS 7 使用 systemd 和 yum。这些都是用户空间上的区别,Linux kernel 差别不大。
所以 Docker 可以同时支持多种 Linux 镜像,模拟出多种操作系统环境。

上图 Debian 和 BusyBox上层提供各自的 rootfs,底层共用 Docker Host 的 kernel。

注意:base 镜像只是在用户空间与发行版一致,kernel 版本与发型版是不同的。

[root@docker ~]# uname -r
3.10.0-514.el7.x86_64                 ##Host kernel 为 3.10.0-514
[root@docker ~]# docker run -ti centos    ##启动并进入 CentOS 容器
[root@263132669aa3 /]# cat /etc/redhat-release   ##验证容器是 CentOS 7
CentOS Linux release 7.4.1708 (Core)
[root@263132669aa3 /]# uname -r      ##容器的 kernel 版本与 Host 一致
3.10.0-514.el7.x86_64

说明:

容器只能使用 Host 的 kernel,并且不能修改。所有容器都共用 host 的 kernel,在容器中没办法对 kernel 升级。如果容器对 kernel 版本有要求(比如应用只能在某个 kernel 版本下运行),则不建议用容器,这种场景虚拟机可能更合适。

二、镜像的分层结构

Docker 支持通过扩展现有镜像,创建新的镜像。
实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。比如我们现在构建一个新的镜像,Dockerfile 如下:

[root@docker ~]# docker pull debian
Using default tag: latest
latest: Pulling from library/debian
723254a2c089: Pull complete
Digest: sha256:800943bdddf4511392fe453a0eb66eacadf322b392c521700bcac29c0b858582
Status: Downloaded newer image for debian:latest
[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
liulei/centos       6.7                 dc64de0c25c4        2 days ago          191MB
liulei/centos       new                 dc64de0c25c4        2 days ago          191MB
liu/ubuntu          v2                  15caed782326        2 days ago          151MB
httpd               latest              2e202f453940        13 days ago         179MB
ubuntu              16.04               0458a4468cbc        2 weeks ago         112MB
centos              latest              ff426288ea90        4 weeks ago         207MB
nginx               latest              3f8a4339aadd        6 weeks ago         108MB
debian              latest              da653cee0545        8 weeks ago         100MB
hello-world         latest              f2a91732366c        2 months ago        1.85kB
training/webapp     latest              6fae60ef3446        2 years ago         349MB


① 新镜像不再是从 scratch 开始,而是直接在 Debian base 镜像上构建。
② 安装 emacs 编辑器。
③ 安装 apache2。
④ 容器启动时运行 bash。

构建过程如下图所示:

可以看到,新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

问什么 Docker 镜像要采用这种分层结构呢?
最大的一个好处就是 - 共享资源。

比如:有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

这时可能就有人会问了:如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是否也会被修改?
答案:不会!因为修改会被限制在单个容器内。

这就是我们接下来要学习的容器 Copy-on-Write 特性。

三、容器的可写层

当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。
只有容器层是可写的,容器层下面的所有镜像层都是只读的。
下面我们深入讨论容器层的细节。
镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。

1.添加文件
在容器中创建文件时,新文件被添加到容器层中。

  1. 读取文件
    在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,打开并读入内存。
  2. 修改文件
    在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。
  3. 删除文件
    在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。

只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。
这样就解释了我们前面提出的问题:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。

转载于:https://blog.51cto.com/liuleis/2070461

第八篇:Docker镜像结构原理相关推荐

  1. [docker]七、docker镜像的制作(超详细)、docker镜像结构原理、镜像的分享——harbor

    目录 1.镜像(images) 1.1.Dockerfile:是制作镜像的文件 2.镜像结构原理 2.1.base 镜像 2.1.1.rootfs和bootfs 2.1.2.base 镜像提供的是最小 ...

  2. (转)Docker镜像结构原理

    以下内容转载自 https://blog.51cto.com/liuleis/2070461 第八篇:Docker镜像结构原理 base 镜像 base 镜像有两层含义: 不依赖其他镜像,从 scra ...

  3. 【docker入门指北】第七篇 Docker镜像讲解

    Docker镜像讲解 文章目录 Docker镜像讲解 一.镜像是什么? 二.Docker镜像加载原理 分层理解 容器数据卷 安装MySQL 初始Dockerfile 数据卷容器 总结 一.镜像是什么? ...

  4. Docker镜像的原理

    centos7系统 包括2部分, linux内核,作用是提供操作系统的基本功能,和机器硬件交互,如何读取磁盘数据,管理网络,使用C编写的,由linus的开发团队,内核只提供操作系统的基本功能和特性,如 ...

  5. #####Docker镜像结构和镜像优化######

    ###Docker镜像的分层结构#### 共享宿主机的kernel(内核) base镜像提供的是最小的Linux发行版 同一docker主机支持运行多种linux发行版 采用分层结构的最大好处:共享资 ...

  6. Docker容器搭建及Docker镜像结构和镜像优化

    Docker Docker 是一个开源的应用容器引擎 开发者打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化.容器是完全使用沙箱 ...

  7. docker学习(三):docker镜像分层原理及本地镜像推送到阿里云或私服

    文章目录 前言 docker镜像分层加载原理 docker镜像commit操作产生新镜像 本地镜像发布到阿里云 将本地镜像推送到私有库 前言 大家好,这是我学习docker系列的笔记文章,目标是掌握d ...

  8. [第五篇]——Docker 镜像加速

    Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器.Docker 官方和国内很多云服务商都提供了国内加速器服务,例如: 科大镜像:https://doc ...

  9. Docker第五篇-Docker镜像推送公共仓库

    文章目录 镜像推送步骤 总结 这里介绍本地镜像如何推送到docker官方仓库. 镜像推送步骤 注册仓库 登录docker官网仓库(https://hub.docker.com),注册一个账号,记住账号 ...

最新文章

  1. almost late for work
  2. 关于无法用127.0.0.1连接数据库的解决办法
  3. C指针原理(25)-gtk
  4. Java黑皮书课后题第10章:*10.17(平方数)找出大于Long.MAX_VALUE的前10个平方数。平方数是指形式为n^2的数
  5. LDAP之一:OpenLDAP管理员指南资料
  6. 京东云擎提供了免费的wordpress一键安装功能了
  7. Java程序员应该了解的10个设计原则
  8. PHP 登录DEMO
  9. GTK+图形化应用程序开发学习笔记(六)—按钮
  10. 【洛谷1962】 斐波那契数列
  11. matlab求解集合覆盖问题,Set Cover Problem (集合覆盖问题)
  12. 8-过滤器Filter和监听器Listener
  13. [TACL18]隐式句法树模型真的能学到句子中有意义的结构吗?
  14. JavaScript的作用域详解
  15. linux 扫描开放的端口命令,在Linux中,如何检查开放的端口(扫描)
  16. 38、Power Query-背后的贤内助M语言
  17. 锐龙cpu能装linux吗,AMD CPU怎么安装?AMD锐龙处理器与主板安装图解教程
  18. easyui treegrid 操作
  19. 小红书算法sign php,小红书API签名算法分析
  20. 超实用!Python机器学习书籍推荐——《Python神经网络编程》(一定要看到最后)

热门文章

  1. 华为配置SSH登陆详细步骤
  2. minicom HOWTO
  3. Jboss启动报错之8083 already in use
  4. 在飞塔防火墙上实现IPSec ×××
  5. (踩坑回忆录)Dva踩坑与解决方案
  6. IBM整合管理服务:云时代驱动IT服务创新
  7. 用户利益何在:微软Windows10新政背后的疑问
  8. ThinkPHP 数据库表结构处理类(简单实用)
  9. Swing之JTable的详细介绍(转)
  10. Nginx--安装和配置