Docker镜像讲解

712 阅读4分钟

docker镜像讲解


镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

所有应用,直接打包成docker镜像,就可以直接跑起来。

docker镜像获取方式

  • 从github上获取
  • 从别人那里拿到现成的
  • 自己制作镜像--> dockerfile

UnionFS(联合文件系统)

当我们下载需要的镜像时,对文件系统的每次修改都会被记录下来。在docker中不同的镜像如果有相同的部分那么下载的时候就不会重复下载,相同的部分会被两个镜像共用。

1638524485734.png

镜像加载原理

docker的镜像实际上由一层层的文件系统组成,这种层级的文件系统UnionFS主要包含bootloader和kernal,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在docker镜像的最底层时bootfs。这一层与我们典型的linux/unix系统一样,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已有bootfs转交给内核,此时系统也会卸载bootfs。

rootfs(root file system),在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,centos等,就是我们常说的镜像。

1638530715198.png

为什么docker安装的centos可以那么小才几百MB,一般情况下不都是几个G吗?

答:对于一个精简的os,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用host的kernal,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。

而在加载一个os时耗费时间最多的就是kernal的加载,因此,虚拟机是分钟级别,容器是秒级

分层的理解

最简单的理解就是相同的文件被复用。

  • 比如说当我们下载mysql镜像

    • 第一步是下载centos
    • 第二步是下载mysql相关文件
  • 当我们再下载redis镜像时

    • 第一步是下载centos,发现文件系统里面已经有了centos那么就不用去下载,直接使用已有的。
    • 第二步再去下载相关的redis文件

更深层的理解:

所有的docker镜像都起始于一个基础镜像层,当进行修改或新增新的内容时,就会在当前镜像层之上,创建新的镜像层。

 # 使用命令去查看详细数据
 docker inspect 容器id

1638531827875.png

而我们下载过来的镜像本身也是在docker的基础镜像上增加了很多操作,在打包的时候就会被打包成一个全新的镜像,所以我们下载的时候才会有这么多的层次。因此我们也可以在下载过来的镜像上添加操作生成自己的镜像。

特点

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层就是我们常说的容器层,容器之下都叫镜像层。

1638533326064.png

如何提交自己的镜像

 #命令
 docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
 ​
 #测试:
 # 1.启动下载的tomcat并进入
 [root@Liang01 ~]# docker exec -it 5525e4559ff4 /bin/bash
 ​
 # 2.因为原版的tomcat的webapps文件夹中没有文件,所以将webapps.list文件夹下的所有文件拷贝过去
 root@5525e4559ff4:/usr/local/tomcat# ls
 BUILDING.txt     NOTICE     RUNNING.txt  lib         temp      work
 CONTRIBUTING.md  README.md  bin      logs        webapps
 LICENSE      RELEASE-NOTES  conf         native-jni-lib  webapps.dist
 root@5525e4559ff4:/usr/local/tomcat# cp -r webapps.dist/* webapps
 root@5525e4559ff4:/usr/local/tomcat# cd webapps
 root@5525e4559ff4:/usr/local/tomcat/webapps# ls
 ROOT  docs  examples  host-manager  manager
 ​
 # 3.把自己修改的镜像提交生成新的镜像
 [root@Liang01 ~]# docker commit -m="add webapps remove" -a="liang" 5525e4559ff4 tomcat01
 sha256:74251c36c15e0ca9235e5901edd032efbc88db5dd63976bc701c14c46a18b358
 [root@Liang01 ~]# docker images
 REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
 tomcat01      latest    74251c36c15e   37 seconds ago   684MB
 nginx         latest    f652ca386ed1   25 hours ago     141MB
 tomcat        9.0       76206e3ba4b1   2 weeks ago      680MB
 tomcat        latest    904a98253fbf   2 weeks ago      680MB
 hello-world   latest    feb5d9fea6a5   2 months ago     13.3kB
 centos        latest    5d0da3dc9764   2 months ago     231MB
 ​

\