
❝
前言:
最近又整幺蛾子了,是什么?后面会写文章,这篇文章主要聊一聊Docker容器与宿主之间如何共享环境!其实这也是迫不得已啊,要是能自己安装环境,为什么要共享呢!首先本文章不代表是最好的解决方式,只是提供一种思路,有更好的办法希望有人能够指点,谢谢!!!
本篇文字描述比较多!❞
问题的产生
目前我有一个Node程序在一个容器里面运行,本来挺好,但是最近有个功能需要用到JAVA命令,所以需要安装JAVA环境,这就比较头疼了,而且我使用的是Dockerfile打包的自定义镜像!
我一想,这不是很简单,需要我就按一个呗,可就是因为这样把我愁坏了!
解题思路
使用两个FROM,多阶段构建
怎么说呢,试了很久,感觉不是太适合我这个,如果是一个node的前端项目,然后后端是java服务,并且是使用tomcat运行前端资源,我认为这种方式很好!
前端项目的话,我直接使用nginx代理了,自己打包上传到指定目录就行,后期可以考虑使用Jenkins搭个自动化部署,根本用不上tomcat,也对它不熟!
其次后端服务是node项目,需要运行,而不是把包打好就行,需要node环境,还有就是java当前镜像只需要几个命令,完全用不上其他的,但是还必须环境要存在!
所以方案不通过!
具体怎么多阶段构建,有文章说明!
容器内部安装Centos
使用apt-get 安装java和node
这个方法其实试了,没成功,但是不代表这个方法不行!这样会导致镜像太大了,会安装一堆东西,有些命令还不能使用(我是这样)
单纯的不适合!
不使用docker
直接在服务器上安装java,然后起一个node程序,并使用pm2守护进程,我这个node去调那个node!
这是最终方案,但是没用上,也是最麻烦的,因为很多东西要改,而且增加了复杂度!
Docker容器与宿主之间共享环境
这里其实也是经常使用的,就是把宿主的目录挂载到容器内部,两边数据互通,可做持久化操作,容器重启或者重新构建,数据依旧存在!
下面直接上代码吧
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

我们发现/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环境了,注意容器和宿主挂载的目录是互通的,宿主环境没有了,容器环境就没了,反之亦然,谨慎操作!!!
原文始发于微信公众号(分享是个有趣的东西):Docker容器与宿主之间如何共享环境
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/151394.html