Docker学习笔记(三):Docker镜像详解

1、镜像的定义

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,其中包括代码、运行时、库、环境变量和配置文件。通过将所有的应用和环境直接打包为docker镜像,就可以直接运行。我们需要知道的是:Docker镜像都是只读的,在容器启动的时候,一个新的可写层被加载到镜像到的顶部,这一层就被称为容器层,处于容器层之下的称之为镜像层。当启动容器的时候,会在镜像的基础上再添加一个当前容器的专用层,这层是读写的。在删除容器的时候,这个容器的专属的这个读写层就会被删除,所以默认容器无法实现数据的持久存储。

2、镜像的获取方式

  • 从远程仓库下载。
  • 通过拷贝获取。
  • 自己制作一个镜像DockerFile。

3、镜像加载的原理

在介绍Docker镜像的原理之前,先来介绍一下UnionFS(联合文件系统),它是一种分层、轻量级且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像)可以制作各种具体的应用镜像。对于UnionFS来说,它可以一次同时加载多个文件系统,但是从外面来看只能看到一个文件系统。通过层层叠加,联合文件系统会把各层文件系统叠加起来,这样最终形成的文件系统就会包含所有底层到的文件和目录。这种方式就像千层饼一样。

Docker的镜像实际上由一层一层的文件系统组成。如下图:

Docker学习笔记(三):Docker镜像详解_第1张图片

观察上图:

  • bootfs主要包含bootloader和kernel,它的类型可以是btrfs、aufs、lxc。bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
  • rootfs是一个根文件系统,这里面包括很多的文件和目录,位于在bootfs之上,主要包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs指的是各种不同的操作系统发行版,比如Ubuntu,Centos等等。 

需要注意的是:在启动容器的时候,这两层都是以只读的方式来挂载的。

通过前面的介绍可以知道:镜像的设计采用了层级管理的方式,其底层的是bootfs,最上面的是rootfs,这种方式最大的好处就是共享资源,并且很大程度提高了Docker镜像的分发与存储。因为当多个镜像都是从相同的base镜像构建出来的,那么对于宿主机而言,只需要在磁盘上保存一份base镜像即可,同时在内存中也只需要加载一份base镜像,从而为所有的容器服务。如下图,这种方式更容易理解。

Docker学习笔记(三):Docker镜像详解_第2张图片

来看一下我们pull一个镜像的过程:

Docker学习笔记(三):Docker镜像详解_第3张图片

从上面的下载过程就可以看到Docker镜像的分层结构,因为下载的过程是逐步下载的。通过docker images可以看到下载之后的文件是比较小的。这是因为对于一个精简的OS来说,rootfs可以很小,里面只需要包括最基本的命令、工具和程序库,而底层直接用Host的kernel,自己只需要提供 rootfs 即可。由此可见,对于不同的linux发行版, bootfs基本是一致的,,而rootfs会有差别,,因此不同的发行版可以共用bootfs。所以,我们拉取的镜像,大小比以前都小

4、镜像的commit操作

(1)命令

格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

参数说明:

  • -a :提交的镜像作者;

  • -c :使用Dockerfile指令来创建镜像;

  • -m :提交时的说明文字;

  • -p :在commit时,将容器暂停。

示例:

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

(2)实例

以tomcat为例:

a.从hub下载tomcat镜像——docker pull tomcat

Docker学习笔记(三):Docker镜像详解_第4张图片

b.运行tomcat容器——docker run -d -p 8084:8080 tomcat

c.查看当前运行的容器——docker ps

d.以交互方式运行Tomcat——docker exec -it eff0e88737be /bin/bash

e.删除webapp——rm -rf webapps/docs 

f.以当前的tomcat运行实例为模板commit一个没有doc的tomcat新镜像。

 

你可能感兴趣的:(Docker,docker,内核,linux,编程语言)