赞
踩
Docker 可视化界面
❝前言:
❞
最近又整幺蛾子了,是什么?后面会写文章,这篇文章主要聊一聊Docker容器与宿主之间如何共享环境!
其实这也是迫不得已啊,要是能自己安装环境,为什么要共享呢!首先本文章不代表是最好的解决方式,只是提供一种思路,有更好的办法希望有人能够指点,谢谢!!!
本篇文字描述比较多!
目前我有一个Node程序在一个容器里面运行,本来挺好,但是最近有个功能需要用到JAVA命令,所以需要安装JAVA环境,这就比较头疼了,而且我使用的是Dockerfile打包的自定义镜像!
我一想,这不是很简单,需要我就按一个呗,可就是因为这样把我愁坏了!
怎么说呢,试了很久,感觉不是太适合我这个,如果是一个node的前端项目,然后后端是java服务,并且是使用tomcat运行前端资源,我认为这种方式很好!
前端项目的话,我直接使用nginx代理了,自己打包上传到指定目录就行,后期可以考虑使用Jenkins搭个自动化部署,根本用不上tomcat,也对它不熟!
其次后端服务是node项目,需要运行,而不是把包打好就行,需要node环境,还有就是java当前镜像只需要几个命令,完全用不上其他的,但是还必须环境要存在!
所以方案不通过!
具体怎么多阶段构建,有文章说明!
点击这里,查看多阶段构建!
使用apt-get 安装java和node
这个方法其实试了,没成功,但是不代表这个方法不行!这样会导致镜像太大了,会安装一堆东西,有些命令还不能使用(我是这样)
单纯的不适合!
直接在服务器上安装java,然后起一个node程序,并使用pm2守护进程,我这个node去调那个node!
这是最终方案,但是没用上,也是最麻烦的,因为很多东西要改,而且增加了复杂度!
这里其实也是经常使用的,就是把宿主的目录挂载到容器内部,两边数据互通,可做持久化操作,容器重启或者重新构建,数据依旧存在!
下面直接上代码吧
Dockerfile 配置
- FROM xxx
-
- # 容器环境变量
- # 如PATH、JRE_HOME、CLASS_PATH
- # 配置之后在容器里面全局可使用java命令、以及一些java依赖的方法
- # 这里使用的是 java-1.8.0-openjdk
- ENV JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64
- ENV JRE_HOME=$JAVA_HOME/jre
- ENV CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
- ENV PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
-
- RUN export JAVA_HOME JRE_HOME CLASS_PATH PATH
-
- # 其他配置
- ...
-
Docker 运行语句
- # -p 后面是端口,如8080:8080
- # -v 就是目录挂载了
- # /usr/lib/jvm 是宿主的java环境
- # 这样容器内部就不用安装JAVA环境了
- # /usr/share/javazi-1.8 是宿主的java时间相关处理
- # 如果不把javazi-1.8挂载过去,调用某些方法会出错
- # 例如 Exception in thread "main" java.lang.Error: java.io.FileNotFoundException: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/tzdb.dat (No such file or directory)
- # imageName 是镜像名称
-
- docker run -d -p xx:xx -v /usr/lib/jvm:/usr/lib/jvm -v /usr/share/javazi-1.8:/usr/share/javazi-1.8 imageName
如何查看javazi-1.8所在位置
- # 先进入/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/
- cd /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/
- # 然后执行ll,如下图
- ll
-
ll命令 示例图
我们发现/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/tzdb.dat 文件其实是个软连,真实目录在/usr/share/javazi-1.8下,如果不挂载这个目录,容器内使用可能会报错!
这样容器内部就能拥有java环境了,注意容器和宿主挂载的目录是互通的,宿主环境没有了,容器环境就没了,反之亦然,谨慎操作!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。