base镜像

base镜像有两层含义:

不依赖其他镜像,从scratch构建

其他镜像可以之为基础进行扩展

所以,base镜像一般都是各种Linux发行版本的Docker镜像,比如:Ubuntu,Debian或者CentOS等。

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

我们大部分镜像都将是基于base镜像构建的。所以,通常使用的是官方发布的base镜像。可以在docker hub里找到。比如centos:https://hub.docker.com/_/centos

我们可以自己构建docker base镜像,也可以直接使用已有的base镜像。比如centos。我们可以直接从docker hub上拉取。

拉取

docker pull centos

查看

docker images centos

REPOSITORY TAG IMAGE ID CREATED SIZE

centos latest 1e1148e4cc2c 2 months ago 202MB

可以看到最新的centos镜像只有200mb,是不是觉得太小了?这是因为docker镜像在运行的时候直接使用docker宿主机器的kernel。

Linux操作系统由用户空间和内核空间构成。

内核空间是kernel,用户空间是rootfs,不同发行版的区别主要是rootfs。比如Ubuntu 14.04使用 upstart 管理服务,apt 管理软件包;而 CentOS 7 使用 systemd 和 yum。这些都是用户空间的不同,Kernel差别不大。

所以Docker可以同时支持多种 Linux 镜像,模拟出不同的操作系统环境。

base镜像只是用户空间和发行版本一致,内核空间使用的是Docker宿主机器的Kernel。

存储结构

上文里展示了如何下载一个base镜像。我们通常是基于这份base镜像来构建我们自己的镜像。比如,在centos里添加一个nginx负载均衡。首先,得需要了解镜像的结构是什么。

Docker镜像的分层结构

启动镜像时,一个新的可写层会加载到镜像的顶层。这一层通常称为"容器层",之下是"镜像层"。

容器层可以读写,容器所有发生文件变更写都发生在这一层。镜像层只允许读取,read-only。

修改时复制策略(copy-on-write)

Docker通过一个修改时复制策略来保证base镜像的安全性,以及更高的性能和空间利用率。

当容器需要读取文件的时候

从最上层的镜像层开始往下找,找到后读取到内存中,若已经在内存中,可以直接使用。换句话说,运行在同一台机器上的Docker容器共享运行时相同的文件。

当容器需要修改文件的时候

从上往下查找,找到后复制到容器层,对于容器来说,可以看到的是容器层的这个文件,看不到镜像层里的文件,然后直接修改容器层的文件。

当容器需要删除文件的时候

从上往下查找,找到后在容器中记录删除,并不是真正的删除,而是软删除。这导致镜像体积只会增加,不会减少。

当容器需要增加文件的时候

直接在最上层的容器可写层增加,不会影响镜像层。

镜像的精简优化

优化基础镜像

基础镜像选择时,选择合适的较小的镜像,常用的 Linux 系统镜像一般有 Ubuntu、CentOs、Alpine···等

串联Dockerfile指令

在Dockerfile中,每条指令都会创建一个镜像层,从而增加镜像的大小。当前层的修改不会影响上一层。

用&&串联指令(RUN指令中)

安装完软件记得clean

具体实例如下:

自定义Dockerfile:

FROM ubuntu:14.04

#基础源镜像

MAINTAINER xiongkun

#描述镜像的创建者,名称和邮箱

WORKDIR /home

RUN dd if=/dev/zero of=50M.file bs=1M count=50

#创建大小为50M的测试文件

RUN rm -rf 50M.file

#删除该文件

优化后的Dockerfile:

FROM ubuntu:14.04

#基础源镜像

MAINTAINER xiongkun

#描述镜像的创建者,名称和邮箱

WORKDIR /home

RUN dd if=/dev/zero of=50M.file bs=1M count=50 && rm -rf 50M.file

#创建文件,同时在该层删除该文件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

linux内核镜像的分层,Docker镜像分层的原理详解相关推荐

  1. linux 内核定时器精度_linux使用select实现精确定时器详解

    在编写程序时,我们经常会用到定时器.首先看看select函数原型如下: int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set * ...

  2. Docker镜像原理详解

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

  3. docker 根据标签删除镜像_10 个 Docker 镜像安全最佳实践

    <Docker 镜像安全最佳实践速查表[1]>列举了 10 个诀窍和指南,确保更安全和更高质量的 Docker 镜像处理.此外,还可以检视有关 Docker 安全的新报告<Docke ...

  4. linux内核移植与开发板,Linux 2.6.36内核移植飞凌OK6410开发板完整步骤详解

    Linux 2.6.36内核移植飞凌OK6410开发板完整步骤详解 [复制链接] 今天终于让Linux内核在飞凌的板子上跑起来了,想来也是艰辛,为了移植成功,断断续续做了将近两个月的努力,期间郁闷不可 ...

  5. docker核心网络原理详解

    docker清空所有容器: 删除所有镜像: ip addr docker是如何处理容器网路访问的? 跑一个tomcat容器并使用ip addr查看ip地址: linux是可以ping通容器内部的ip的 ...

  6. Docker - Docker Container及Container命令详解

    Docker - Docker Container及Container命令详解 什么是Docker容器(Docker Container) 上一篇博客介绍了Docker镜像(Docker Image) ...

  7. Docker - Docker Volume及Volume命令详解

    Docker - Docker Volume及Volume命令详解 什么是数据卷(Volume) Docker镜像被存储在一系列的只读层中.当我们创建一个容器时,Docker会读取镜像(只读),并在其 ...

  8. linux系统下安装pip3,linux下安装python3和对应的pip环境教程详解

    linux下安装python3和对应的pip环境教程详解 1.下载python3.6的安装包: 2.解压后,进入到解压目录下,执行如下命令,将python3.6进行编译,如下是将python的环境编译 ...

  9. linux命令wget的url路径太长,Linux中WGET下载https链接及WGET命令的详解

    Linux中WGET下载https链接及WGET命令的详解 使用如下的命令下载https链接: ```bash wget -r -np -nd --accept=gz --no-check-certi ...

  10. Linux 高可用(HA)集群之Pacemaker详解

    大纲 说明:本来我不想写这篇博文的,因为前几篇博文都有介绍pacemaker,但是我觉得还是得写一下,试想应该会有博友需要,特别是pacemaker 1.1.8(CentOS 6.4)以后,pacem ...

最新文章

  1. POJ - 2446 Chessboard 二分匹配+建图
  2. 可重构人工智能设备展现出智能化前景
  3. (5) 百度2011研发工程师笔试卷
  4. 五大特点_探究干细胞五大特点:(五)不成瘤
  5. 【转】 ConstraintLayout 完全解析 快来优化你的布局吧
  6. [Objective-C]编程艺术 笔记整理
  7. 阿里云ubuntu mysql_Ubuntu下安装MySQL(阿里云服务器)
  8. Python学习笔记之类(二)
  9. 2013再见,2014你好!
  10. ★LeetCode(448)——找到所有数组中消失的数字(JavaScript)
  11. 10分钟搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡...
  12. 个人Web自动化测试学习点总结
  13. 自然语言处理简明教程——序言、第一章
  14. Java,Android 汉明窗 Hanmming
  15. springboot+基于微信小程序的心理测评与活动管理的设计与实现 毕业设计-附源码191752
  16. 编译提示“/usr/bin/ld: cannot find -lgflags-shared“错误的解决办法
  17. Chrome、Edge浏览器多线程下载
  18. 【学习笔记】人工智能导论
  19. VR全景打造数字化校园名片
  20. 窥探Kotlin世界(进阶语法)

热门文章

  1. 前端安全问题及解决办法
  2. Eclipse 乱码 解决方案总结(UTF8 -- GBK)
  3. scrapy爬虫返回302,301,解决方法
  4. Java中的类型列表与类型ArrayList
  5. 如何用wget指定位置?
  6. win11如何退出磁贴桌面 Windows11退出磁贴桌面的设置方法
  7. etcher制作mac启动盘_如何在Mac上创建和引导Linux USB驱动器
  8. ❤️《集成SSM框架—图书系统》Mybatis+Spring+SpirngMVC
  9. ❤️什么是Java 面向对象《装、继承、多态、抽象》?建议收藏)❤️
  10. 解决实例化Servlet类[com.mu.servlet.HelloServlet]异常