Docker篇章5:Docker☞镜像
- Docker镜像是轻量级,可执行独立软件包,用来打包软件运行环境和基于运行环境开发的软线,它包含运行某个软件所需的所有内容,包括代码,运行时库,环境变量和配置文件。
1.docker镜像加载原理
- docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS.
什么是UnionFS:
UnionFS(联合文件系统),它是一种分层,轻量级并且高性能的文件系统,它支持对文件系统修改作为一次提交来一层层的叠加,同事可以将不同目录挂在到同一个虚拟文件系统下。Union文件系统时Docker镜像的基础,镜像可以通过分层来进行集成,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同事加载多个文件操作系统,但从外面看起来,只看到一个文件系统,联合加载会把各个层文件系统叠加起来,这样最终文件系统会包含所有底层文件和目录
bootfs(boot file system) 主要包含bootloader和kernel,bootloader主要时引导加载kernel,linux刚启动时会加载bootfs文件系统,在docker最底层时bootfs,这一层于我们典型Linux系统一样,包含boot加载器和内核。当boot加载完成之后整个内核旧都在内存中,此时内存使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system) 在boots纸上,包含就是典型Linux系统中 /dev, /etc,/proc,/bin等标准目录和文件,rootfs就是各种不同操作系统发性版,比如Ubuntu,CentOS等。
平时我们安装虚拟机CentOS都是好几个G,为什么docker这里才200M左右?
对于一个精简OS,rootfs可以很小,只需要包括最基本命令,工具和程序库就可以了,因为底层直接用主机的kernel,自己只需要提供rootfs就行,由此可见对于不同linux发性版本,bootfs基本是一致的,rootfs会由差额因此不同发性版可以公用bootfs
-
分层镜像效果图如下,它就好像花卷一样:
2.为什么docker镜像采用这种分层结构
-
最大好处就是共享资源,比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也需加载一份base镜像,就可以为所有容器服务了,而且镜像每一层都可以被共享。(好比如一个镜像第一次下载很慢,但是第二次下载很快,因它内部有缓存,可以共享资源)
-
特点:docker镜像都是只读,当容器启动时,一个新的可写层被加载到镜像顶部,这一层通常被称作容器层,容器层之下都叫镜像层。
3.简单示例:
-
docker拉取tomcat
docker pull tomcat
-
启动容器
#启动tomcat 从外部访问端口8888 映射内部端口8080 docker run -it -p 8888:8080 tomcat
-
此时如果浏览器访问为404页面
先关闭防火墙
# 查看防火墙状态
service firewalld status
# 关闭防火墙
systemctl stop firewalld.service
# 禁止防火墙开机启动
systemctl disable firewalld.service
# 启动docker
systemctl start docker
# 重启docker
systemctl restart docker
进入tomcat 容器内
docker exec it 启动tomcat容器的容器ID /bin/bash
在tomcat目录执行
cp -r /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps/
此时访问页面主机IP:8888
成功:
- 对当前容器内的tomcat 修改,然后形成自定义镜像
docker commit -a='xjk' -m='no change' 容器id project/tomcat:1.12
- 然后启动自己构建镜像的tomcat容器
# docker run -it -p 外部访问端口:tomcat端口默认8080 [REPOSITORY:TAG]
docker run -it -p 7777:8080 project/tomcat:1.12
# 后台启动 -d
此时访问7777端口也是OK的。