记录生活中的点点滴滴

0%

Docker学习3:镜像讲解

Docker学习第三篇:镜像讲解及提交镜像!

概述

Docker镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含某个软件所需的所有内容,包括代码、库、环境变量、配置文件、运行时环境等。
所有的应用,直接打包成Docker镜像,然后通过镜像创建出容器,然后就可以直接跑起来。

如何得到镜像:

  • 从远程仓库下载,比如docker hub、阿里云的镜像仓库等。
  • 朋友拷贝给你。
  • 自己制作一个镜像DockerFile。
  • 通过对原有的镜像创建的容器进行一些修改(也可以不修改),然后通过Commit命令提交一个新的镜像。

Docker镜像加载原理

UnionFS(联合文件系统)

我们在下载某个镜像的时候,可能会看到下载了一层一层的多个镜像。

联合文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层叠加,联合文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像的镜像)比如centos镜像,可以制作出各种具体应用的镜像,比如mysql镜像。一个成型的应用进行都是由若干个镜像一层层组成的。

Docker镜像加载原理

docker镜像实际上是由一层层的文件系统组成,这种层级文件系统就是联合文件系统。

bootfs(boot file system)主要包含BootLoader和kernel,BootLoader主要负责引导加载kernel,Linux刚启动时会加载bootfs文件系统来引导内核的加载,Docker镜像的最底层就是bootfs。这一层与我们典型的unix系统是一样的,包含boot引导器和内核,当boot加载完成后整个内核就在内存中了,此时内存的使用权已经由bootfs转交给内核,此时系统会卸载bootfs。

rootfs(root file system)在bootfs之上,包含的就是典型的unix系统的/dev、 /proc、 /etc等标准目录和文件和一些命令,rootfs就是不同unix系统的发行版,比如Ubuntu、centos等。

我们平时安装的虚拟机centos镜像好几个G,Docker安装的才200多m,因为对于一个精简的OS,rootfs可以很小,只需包含最基本的命令,工具和程序库就行了,因为底层直接使用宿主机的内核,自己只需提供rootfs(相当于操作内核的客户端)就可以,由此可见不同发行版的bootfs基本是一致的,roorfs有差别,因此不同的发行版可以公有bootfs。

第一个图仅仅是bootfs+rootfs,然后如果要制作一个emacs环境的镜像,就在这个基础上新加一层emacs镜像,如图二。如果要在添加一个Apache环境,那就再图二基础上加一个apache镜像。如图三。图中的每一层镜像都能进行复用。

注意:

Docker镜像都是只读的,用镜像创建容器启动时,实际上是在原本的镜像上新建了一层可写层到原本镜像的顶部,这一层我们叫作容器层,容器层之下的叫作镜像层。

如上图,使用Tomcat镜像创建容器后,会在Tomcat镜像的基础上新建一个可写层,容器的写入是在可写层进行记录,然后使用commit命令把该容器创建一个新的镜像,实际上新的镜像是tomcat镜像+可写层镜像,以tomcat镜像为基础。通过下面介绍使用容器构建镜像,可以更好地理解。

提交镜像

命令:

1
docker commit -m="信息,类似git提交的信息" -a="作者" 容器Id  目标进行名:tag

我们用我们之前的tomcat举例子,它默认情况拉取后webapps目录下是没有项目文件的,我们要把项目文件添加进去然后生成镜像。

如下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~]# docker run -it tomcat:9.0 /bin/bash
root@57c410ca4cf5:/usr/local/tomcat# cp -r webapps.dist/* webapps/
root@57c410ca4cf5:/usr/local/tomcat# [root@localhost ~]#
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57c410ca4cf5 tomcat:9.0 "/bin/bash" 23 seconds ago Up 22 seconds 8080/tcp compassionate_joliot
[root@localhost ~]# docker commit -m="add webapps/*" -a="GS" 57c410ca4cf5 mytomcat:1.0
sha256:55a29a5d0ce37dc8a8e16141b1b69dcd6c0bd3ee806d1b14c3c29ae7578c3532
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat 1.0 55a29a5d0ce3 7 seconds ago 653MB
tomcat 9.0 040bdb29ab37 2 days ago 649MB
nginx latest f6d0b4767a6c 3 days ago 133MB
mysql latest d4c3cafb11d5 3 days ago 545MB
centos latest 300e315adb2f 5 weeks ago 209MB
hello-world latest bf756fb1ae65 12 months ago 13.3kB
[root@localhost ~]#

这样就生成我们自定义的镜像了。