首页>软件资讯>常见问题

常见问题

Docker共享宿主机文件,减小镜像体积

发布时间:2024-06-25 11:16:25人气:67

为了响应公司技术发展路线,开发的服务均需要将打成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了。

镜像管理.jpg

使用VOLUME指令


在Dockerfile中使用VOLUME指令可以声明一个或多个挂载点,以便将宿主机文件或文件夹挂载到容器中。以下是一个简单的dockerfile示例,供大家参考。


FROM node:8  

WORKDIR /app  

COPY package.json .  

RUN npm install  

COPY . .  

VOLUME ["/app"]  

EXPOSE 3000  

CMD ["node", "index.js"]

其中COPY . .命令将宿主机当前目录下的所有文件复制到容器中的/app目录。


然后使用VOLUME ["/app"]指令声明了一个挂载点/app,


当容器启动时,宿主机中/app目录下的文件和文件夹都会被挂载到容器中。



上一条:Docker常用命令总结

下一条:Docker系列之 Harbor 仓库