我们运行的时候容器实例,也就是鲸鱼背上的集装箱,每个集装箱都相当于一个精简版的linux系统
Docker镜像是什么
镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的那些软件,它包含运行某个软件所需的所有内容,包括代码,运行库,环境变量,配置文件等.
概念1: UnionFS(联合文件系统)-Docker镜像的基础
这是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下
镜像可以通过分层来进行集成,基于基础镜像,可以制作各种具体的镜像
- 特性: 一次同时加载多个文件系统,但从外面看来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
- UnionFS主要有两种: bootfs 和 rootfs
Docker镜像加载原理
平时我们安装进虚拟机的centos都是好几个G,为什么在docker里面才几百兆?
因为对于一个精简的os,rootfs可以很小,只需要包括最基本的命令,工具和程序库就可以了,因为底层都是直接使用宿主机的内核,自己只需要提供rootfs(centos就提供centos的,ubuntu就提供ubuntu的)就可以了
因此,对于不同的linux版本,bootfs是一致的,rootfs会有差别,所以不同发行版可以共用bootfs
分层的镜像
- Docker为什么要采用这种分层结构呢?
为了共享资源
比如说有好多镜像都从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也只需要加载一份base镜像就可以为所有容器服务了,而且镜像的每一层都可以被共享
这也就说明了为什么有时候下载那些有很多共同层的镜像的时候非常快,因为本地有不需要下载
Docker镜像特点
镜像都是只读的
当容器启动时,一个新的可写层被加载到镜像的顶部
这一层通常被称为容器层(可读可写),容器层之下的都叫镜像层
所以说,鲸鱼背上的集装箱,可以理解为: 没有运行之前是镜像,运行之后就是容器
Docker commit操作
- docker commit提交容器副本使之称为一个新的镜像,比如我们运行了tomcat容器,但是我们对tomcat做了自定义的修改,我们就可以将其作为一个新的镜像提交,然后到时候用的时候再拉下来这个自定义的
- docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
案例演示
- 从docker hub上下载tomcat镜像到本地并成功运行
- 指定端口号: docker run -it -p 8088:8080 tomcat,其中8088表示外面可以通过这个端口访问该tomcat容器,8080表示tomcat容器的端口号是8080,启动成功后,通过虚拟机的ip:8088就可以访问tomcat了
- 随机分配端口号: docker run -it -P tomcat,启动成功后,新开一个xshell界面,输入docker ps可以看到当前tomcat容器的端口号,我这里是32768,然后在浏览器中输入虚拟机ip:32768就可以访问到tomcat了
- 故意删除上一步镜像生成tomcat容器的文档
- 使用docker exec -it 容器ID /bin/bash 进去运行容器的linux控制台界面
- 输入rm -rf docs删除所有文件
- 刷新界面,我们再次点击文档就会报错404
- 当前的容器实例经过了我们自己修改,我们将它作为一个新的镜像fanlei/tomcat推送到本地,之后我们再输入docker images就会发现我们自定义的镜像已经存在于本地了
- 我们可以通过 docker 的控制台界面输入docker run -it -p 8088:8080 fanlei/tomcat:1.2就可以运行我们自己的tomcat了,注意如果我们给的版本号不是latest就一定要带上版本号,此时我们就会发现,它是没有文档的
- 上面的都是以交互式容器方式(前台运行方式)运行的,所以会输出很多日志,我们同时也可以通过守护式容器(后台运行方式)运行,通过docker run -d -p 8088:8080 tomcat就可以运行,此时再通过docker ps可以查看到,注意此时它是不会自动关闭的,不加端口是会自动关闭的