在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
作者:watermelo37
涉及领域:Vue、SpingBoot、Docker、LLM、python等
---------------------------------------------------------------------
温柔地对待温柔的人,包容的三观就是最大的温柔。
---------------------------------------------------------------------
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
一、为什么要用后端程序操作Docker
Docker 是现代开发和部署流程中不可或缺的一部分。它简化了应用程序的环境配置、打包和分发,使得在不同机器上运行相同的应用变得更加轻松和一致。本文将详细介绍如何使用命令行工具(CMD)操控 Docker 来配置环境。
实现后端操作docker,可以用来实现云端IDE、一键环境搭建、多人协作环境、互动编程教学、可视化部署和管理等等功能。是Docker从服务器走向客户端的必经之路。
二、安装Docker
1、安装Docker
我写过一份详细的博客,请移步:
2、启动Docker
安装完成后,启动 Docker Desktop,并确保其正常运行。可以在 CMD 中通过以下命令来验证:
三、DockerClient与CMD操作Docker的区别
说实话,我去年开始做在线编程的时候,入门就是用的DockerClient,后来又做了一个进阶项目自动化配置环境的开发,改成了用Java执行cmd指令来操控Docker,前不久看cmd指令不顺眼,又重新改成了DockerClient。
为什么?因为DockerClient高度封装,将很多细小的指令封装成若干个参数,你看到的就只是一小块含参的链式调用,但其实相当于执行了相当多的“cmd命令”,这样带来的结果就是提升了入门难度,并且长期维护和二次开发需要对DockerClient有较高的熟练度和较深的理解,不像cmd,一行有一行的作用,一行比一行清晰,大致有一个印象就能马上知道它的含义。比如docker cp是复制,比如docker build是镜像生成,再比如docker run用来启动容器,指令后面的参数也高度语义化,非常好理解,最最最关键的是,用cmd指令的时候如果有bug,只需要在终端里面输入执行,查看返回内容以及Docker engine里面的状态,就能知道哪里有bug,非常方便。
但是cmd的缺点也很明显,比如命令执行较散乱,要注意异步请求的时间节点控制、及时使用websocket返回流式数据等...
“cmd是这样的,DockerClient只需要把你要执行的命令写到链式调用的参数里面就行了,用cmd要考虑的可就多了”(套公式解题就是快)来看一个例子:
这一大段代码包括根据Dockerfile文件创建镜像并生成一个容器,并获取执行时的日志信息,以及错误抛出。但是如果使用DockerClient就一两行代码,区别就是这么大。
这里有一篇基础的使用cmd调用Java后端操作Docker的博文,感兴趣请移步:
综上所述,如果你对Docker的原理和执行逻辑比较熟悉,并且需要较多的副产物(日志数据,错误抛出,容器复用,用户管理等),可以考虑使用cmd指令,开发反馈非常好。如果你对Docker的运作机理还不太了解,或者你对Docker已经熟悉透了,都可以使用DockerClient来开发,流程更加整体,代码简洁。
本篇文章将带大家来看看如何使用DockerClient操作Docker生成python环境,该思路同样适用于所有在线编程的开发过程。
其他Docker相关文章请上划到文章标题下,在专栏中查阅,希望您能找到您的开发思路,有疑问的也欢迎大家前来沟通:
四、干货!如何使用DockerClient实现在线编程
1、前置工作
①引入并安装依赖
②构建Java与Docker的链接关系
首先你需要让你的java拥有Docker的访问权限,如果是linux系统比较简单,但如果是windows就需要先做好Docker的配置,配置代码如下(我稍后会写一篇博文介绍如何在各种系统上正确的使用Java连接Docker,敬请期待,如果我忘了请踢我的屁股):
在需要使用到DockerClient的位置(比如Controller或者Service)注入依赖
③在宿主机上安装一个基础镜像
随便安装一个你需要的基础镜像,比如python:3.9,但如果是从github上拉取的话,有魔法会更快一些,不然有time out 的风险
④在宿主机上准备一个工作目录
新建一个docker专用的文件夹,记录路径,在Java中定义为常量,比如:
这一步是为了做卷挂载,卷挂载后容器内指定文件夹的内容会与宿主机上指定文件夹的内容完全一致
⑤其他工作
写好api、返回数据结构等。
2、生成并启动容器
有了基础镜像就可以开始生成容器了,这里是接收一个id,然后根据id生成对应的容器和映射文件夹。如果你的在线编程开发不需要涉及多用户功能,就可以舍去获取id、生成文件夹、检查文件夹是否存在这些步骤。
这里有个细节是指令:.withCmd("tail", "-f", "/dev/null")
这个指令的作用是让容器持续的运行下去,这样一个容器可以反复调用不同的脚本,而不是运行完某一个脚本立刻停止。
3、安装python脚本所需的依赖
执行这一步骤前需要将requirements.txt文件放入宿主机的对应文件夹中(在该案例中是WORKING_DIRECTORY + File.separator + scenarioId;),我写了一个文件上传的api和python代码解析的api,这两种方式都可以生成requirements.txt文件,如果不涉及用户操作,可以直接手动把requirements.txt文件放入对应文件夹中。
requirements.txt文件里面是需要装的依赖库的安装别名,可以指定版本,内容就是这样:
4、 执行脚本
这个api可以多次执行,容器执行完毕后不会立刻停止。
5、删除容器,清空工作目录
容器使用完毕后,可以删除容器释放资源。
清除工作目录的Service层函数
五、总结
以上内容是一个简单的实现在Java后端中通过DockerClient操作Docker生成python环境并执行代码,最后销毁的案例全过程,也是实现一个简单的在线编程后端API的完整流程,你可以在此基础上添加额外的辅助功能,比如上传文件、编辑文件、查阅文件、自定义安装等功能。
只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
更多优质内容,请关注:
- 点赞
- 收藏
- 关注作者
评论(0)