当前位置:   article > 正文

Docker容器与宿主之间如何共享环境_docker jdk 共享宿主机

docker jdk 共享宿主机

Docker 可视化界面

Docker 可视化界面

前言:
最近又整幺蛾子了,是什么?后面会写文章,这篇文章主要聊一聊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 配置

  1. FROM xxx
  2. # 容器环境变量
  3. # 如PATH、JRE_HOME、CLASS_PATH
  4. # 配置之后在容器里面全局可使用java命令、以及一些java依赖的方法
  5. # 这里使用的是 java-1.8.0-openjdk
  6. ENV JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64
  7. ENV JRE_HOME=$JAVA_HOME/jre
  8. ENV CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
  9. ENV PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
  10. RUN export JAVA_HOME JRE_HOME CLASS_PATH PATH
  11. # 其他配置
  12. ...

Docker 运行语句

  1. # -p 后面是端口,如8080:8080
  2. # -v 就是目录挂载了
  3. /usr/lib/jvm 是宿主的java环境
  4. # 这样容器内部就不用安装JAVA环境了
  5. /usr/share/javazi-1.8 是宿主的java时间相关处理
  6. # 如果不把javazi-1.8挂载过去,调用某些方法会出错
  7. # 例如 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)
  8. # imageName 是镜像名称
  9. 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所在位置

  1. # 先进入/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/
  2. cd /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/
  3. # 然后执行ll,如下图
  4. ll
  5.  

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环境了,注意容器和宿主挂载的目录是互通的,宿主环境没有了,容器环境就没了,反之亦然,谨慎操作!!!

关注公众号了解更多
关注我,了解更多
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/284297
推荐阅读
相关标签
  

闽ICP备14008679号