docker镜像讲解
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有应用,直接打包成docker镜像,就可以直接跑起来。
docker镜像获取方式
- 从github上获取
- 从别人那里拿到现成的
- 自己制作镜像--> dockerfile
UnionFS(联合文件系统)
当我们下载需要的镜像时,对文件系统的每次修改都会被记录下来。在docker中不同的镜像如果有相同的部分那么下载的时候就不会重复下载,相同的部分会被两个镜像共用。
镜像加载原理
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等,就是我们常说的镜像。
为什么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
而我们下载过来的镜像本身也是在docker的基础镜像上增加了很多操作,在打包的时候就会被打包成一个全新的镜像,所以我们下载的时候才会有这么多的层次。因此我们也可以在下载过来的镜像上添加操作生成自己的镜像。
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层就是我们常说的容器层,容器之下都叫镜像层。
如何提交自己的镜像
#命令
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
\