Docker容器与宿主之间如何共享环境
  EPcyJ5YAnMSB 2023年11月02日 45 0

Docker容器与宿主之间如何共享环境_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 配置

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

Docker容器与宿主之间如何共享环境_Docker_02

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

Docker容器与宿主之间如何共享环境_Docker_03

关注公众号了解更多

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  wwLZeziuqjLR   2023年12月11日   31   0   0 Dockercentos
  MCWYWqSAMsot   2023年12月11日   33   0   0 Docker
  LE2wsiBPlOhg   2023年12月06日   32   0   0 Dockercentos
  DnoStTHsc0vp   2023年12月11日   25   0   0 Docker
  wwLZeziuqjLR   2023年12月08日   100   0   0 Dockercentosbash
  wwLZeziuqjLR   2023年12月07日   34   0   0 Dockercentos
EPcyJ5YAnMSB