使用IDEA Docker插件发布jfinal应用到远程docker

        现在docker的运用相当广泛,它最显而易见的优势就是让我们部署应用的过程变得极其简单,而且性能开销很低,在公司的一台普通测试服务器上,使用docker部署几十个应用或者服务,同时运行,服务器也吃得消。那么在平时的开发中,如果我们想将我们的应用快速的部署到docker环境中,进行测试,那么使用IDE的docker插件就可以非常方便的达到这个目的。下面我以IDEA的docker插件为例,给大家分享如何快速将本地应用打包成docker镜像,并且在远程docker上运行该镜像的实例。

1)安装docker插件

首先在idea的插件菜单中找到该插件,并进行安装,如下图所示:

image.png

2)开启docker远程访问

确保你想连接的docker服务已经允许远程连接,具体的操作方式可以参考这边文章:https://www.jianshu.com/p/1057a874b9dd

其中关键配置在于这个,需要根据实际情况修改对应ip即可,比如我使用的是公司内网的docker,那么访问的时候是使用内网ip访问,这个地方的就修改为tcp://10.10.120.133

-H tcp://0.0.0.0:2375

2375就是docker默认对外开放的远程访问端口,一般不需要修改,如果该端口被其他服务占用,那么则需要修改。

3)配置docker connection

接着,使用插件,新建一个远程的docker连接。当配置完成后,下方出现Connection successful,则表示插件已经成功连接到远程docker服务。

image.png

image.png

4)使用Dockerfile创建docker镜像

完成上述步骤后,我们可以进行创建应用的docker镜像的准备工作了,首先在我们的应用根目录下创建一个没有后缀名的Dockerfile文件,其内容如下:

image.png

# jfinal aop需要依赖jdk环境,所以该镜像需要依赖openjdk的镜像
FROM openjdk:8-jdk
# 拷贝target下编译后的整个项目文件夹到容器根目录下的tms-restful目录
# 如果不确定该配置是否正确,可手动执行一次maven package命令,然后根据生成的目录结构来配置
COPY ./target/hrms-release /hrms-release
# 后续命令行执行的基础路径,这里设置为容器的根路径
WORKDIR /
# 默认暴露的容器端口号,可以在可视化配置中重新指定,但需要与undertow.port配置一致才可正常访问
# EXPOSE 9061
# 创建容器后的启动命令,即通过启动类的main函数运行容器内的web应用
# cp参数添加额外依赖,即执行main函数时需要依赖config下的所有配置文件和lib下所有的jar包
CMD java -Xverify:none -cp /hrms-release/config:/hrms-release/lib/* com.qinhailin.common.config.MainConfig

有关Dockerfile的基础知识和详细说明,网上有很多资料和教程,大家可以自行百度,这里就不详细阐述了。我这个项目是使用jfinal-layui脚手架进行开发的,与标准的jfinal undertow项目核心配置基本没有区别。所以只要是基于jfinal和undertow的项目,都可以使用上述的代码来创建Dockerfile文件。

每一行的代码都有比较详细的注释,补充一点就是第一行是指我们镜像基础的依赖环境,是jdk而不是jre,因为jfinal 4.x之后自身实现了动态代理,需要依赖jdk,如果你的项目依然使用第三方的cglib,那么这里可以使用jre环境,不过还是强烈推荐升级jfinal版本,使用更简洁优雅的动态代理实现。

5)使用docker插件编辑Dockerfile运行配置

当我们在应用根目录创建了上面的文件时,ide插件会立刻检测到该文件,然后会提示我们是否进行配置,如果我们没有直接进行,也可以在该文件上右键点击Edit进行配置,如下图:

image.png

image.png

上图已经详细说明了我们所需要配置的项目的一个简要说明,这里涉及了不少docker的基础知识,对于没有了解过docker的同学可能会有点生疏,不过没关系,可以先依葫芦画瓢实现我们的目的,然后再去有针对性的学习。其实这个就相当于把docker命令的相关参数用可视化的方式进行了配置,非常方便。而且可以将该配置重命名,这样的话,每次都可以使用如下方式修改配置项。

image.png

需要额外注意的是Context folder项,如下图,这里显示的是一个点,其实代表的就是Dockerfile文件所在的目录路径。一般插件会自动识别,但是如果后面出现发布镜像失败的错误,一般就是这里出了问题,此时请手动选择Dockerfile所在文件夹路径即可。

image.png

上面的配置项配置完成以后,我们可以在Command preview中看到远程docker将要执行的docker命令。如下图:

image.png

其中说两个很关键的参数:

--env参数为docker容器内环境变量配置,我这里配置了一个TZ,也就是时区配置为东八区时区,因为如果不配置,那么应用在docker容器启动后,使用的将是0区时间,会和服务的时间相差8小时。所以这个配置一定要加上。

-v 配置的是路径映射,这是docker中非常实用的配置,比如我们的应用有文件上传功能,那么我们通常不喜欢把一些用户上传的文件保存在项目目录下,因为这样重新部署应用时很可能会清理掉用户上传的文件,这个时候就可以通过该参数来建立docker容器内文件路径和宿主机文件路径的一个映射关系。将文件的实际路径映射到容器外部。这样不管我们发布多少次应用,这些文件都不会变动位置,也不会丢失。

6)一键执行

前面的准备工作全部都完成了,接着就到了享受成果的时候了。因为是测试环境使用,所以部署流程呢,可以不那么严谨,我们把大家的代码合并一下,保证发布前自己本地的代码是最新的,配置文件是基于测试环境使用的配置。选中我们配置好的Dockerfile,然后点击下方的运行按钮,如图所示:

image.png

然后idea会先执行我们的maven clean package命令,使target目录下的代码合配置文件最新,然后docker插件会按我们编写的Dockerfile文件的内容去执行每一步操作,并且在控制台显示过程,如下图:

image.png

当一切提示操作成功后,我们可以访问应用,我这里访问地址应该是http://10.10.120.133:811,如果访问成功,则我们已经达成了目标,以后发布应用或者服务到远程docker,就是一键的事情,和jfinal一直贯彻的理念相得益彰。

image.png

最后,推荐大家实用portainer,它是一个管理docker镜像与容器的可视化工具,本身也可以使用docker容器的方式部署,提供了很多实用功能,比如查看容器内应用运行的日志信息,帮助我们排查 程序运行错误,如下图:

image.png

也可以非常方便的对容器和镜像进行很多可视化操作,如下图:

image.png

具体的container安装和使用教程,各位自行百度吧~~

eclipse也有类似的插件,可以实现相同的功能,有兴趣的童鞋可以自行搜索相关教程~

以上就是今天分享的全部内容了,希望给大家带来收获。



评论区

JFinal

2020-10-20 12:36

分享很有用,图文并茂介绍很详细,谢谢你的分享,必赞

琴海森林

2020-10-21 11:16

老铁的分享都很用心,点赞