什么是docker镜像
docker镜像即UnionFS(联合文件系统)–(可以理解为多层花卷),联合文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层叠加。
特性:一次加载多个文件系统,但从表面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
docker镜像加载原理
docker的镜像实际上是由一层层的文件系统组成,这种层级的文件系统是UnionFS。
UnionFS由两个部分组成bootfs(boot file system)和rootfs(root file system)。
bootfs主要包含bootloader和kernel,bootloader主要第引导kernel。docker镜像的底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会下载bootfs。
rootfs中包含是典型Linux系统中的/dev,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu、Centos等等。
平时我们安装进虚拟机的CentOS都是好几个G,但是为什么docker这里只有200M?
对于一个精简的OS,rootfs可以很笑,只需要包含最基本的命令、工具和程序库就可以了,因为底层直接用Host和kernel,自己只需要提供rootfs就行了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
docker镜像为什么采用这种分层结构?
最大的一个好处就是共享资源
比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以共享。
特点
docker容器都是只读的。当容器启动时,一个新的科协层被加载到镜像的顶部。这一层通常被称为”容器层“,容器层之下的都叫”镜像层“。
根据镜像模板生成新的镜像
这里以tomcat为例
拉取tomcat镜像并运行
docker run -it -p 9999:8080 tomcat
http://ip:9999 访问
这里出现404不是因为出问题了,而是因为原本应该在webapps文件中的文件都在webapps.dist文件中,接下来将webapps.dist修改为webapps。
- Ctrl+p+q退出容器界面
- 查看对应的容器id
docker ps
- 进入容器
docker exec -it 容器id /bin/bash
- 将webapps修改为webapps2,将webapps.dist改为webapps
- 测试http://ip:9999 访问
对已修改的容器commit生成自己的镜像
docker commit -a="author" -m="description" 容器id 包名/容器名
- 查看本地镜像
- 运行自定义的镜像并测试
到这里以镜像为模板自定义新的镜像已经完成,以后我们可以根据自己的需要自定义不同的镜像。也可以将自己自定义的镜像发布阿里云。