一、背景介绍
响应公司技术发展路线,开发的服务均需要将打成docker镜像,使用docker进行统一管理。可是随着服务越来越多,镜像也越来越多。每次制作镜像的时候都需要将依赖打进容器,这样一个jre的环境就是100多M。有一天突发奇想,容器能不能共用宿主机的环境?这样每次打镜像时体积就会少不少。于是就动手试试了试,结果还真可以,哈哈。
二、测试
我们测试用的是java的web项目做的测试,框架用的springboot,由于集成了tomcat插件,所以web项目打成jar包即可运行。
1、在宿主机上安装jdk环境,目录在/home/softwares/jdk1.8.0_151。
2、制作没有jdk环境的镜像。
Dockerfile文件内容如下:
*****************************************************************************
From debian:latest
ADD springWeb.jar /app.jar
ENV JAVA_HOME="/home/softwares/jdk1.8.0_151"
ENV PATH="${PATH}:${JAVA_HOME}/bin:${JAVA_HOME}/sbin"
ENTRYPOINT [ "java", "-jar", "/app.jar" ]
******************************************************************************
以上镜像是没有jdk环境的,所以在生成容器的时候一定要把宿主机jdk目录挂载到容器中。
3、生成镜像
docker build -t jdktest .
注释:jdktest是镜像的名字。
4、生成容器
docker run -d --name jdktest -p 8088:8081 -v /home/softwares:/home/softewares --restart=always jdktest
5、打开8088端口,然后用浏览器访问项目地址,成功!
三、优点
1、它的优点很明显,减少许多镜像体积。
debian系统有的只有5M不到,加上自己的一个jar包,镜像可能也就30M不到。而一个jre1.8的环境就得100多M。可以所体积减少很多。
四、缺点
1、增加了容器对宿主机的依赖性。
一旦宿主机的运行环境进行升级或改动,必定影响容器的运行。
2、增加了新人交接的难度。
生成容器时必须要将宿主机的运行环境目录挂载到容器中,也就是上面的 -v /home/softwares:/home/softewares操作。若没有此操作,容器是生成后就退出了。若进
行新人交接时,他不知道要进行环境目录挂载,后面就GG了。
五、影响
目前尚不清楚运行环境目录挂载至容器中对项目运行的影响或不稳定性,以上只供测试使用。若大家对这种做法有什么看法,欢迎来交流。