近期接到领导通知,要对公司应用进行后台架构进行调整,把java应用从原先的java -jar **.jar
启动方式,改成全部以docker容器的方式运行,这篇文章,是笔者在对java应用容器化的过程做的记录。
应用是采用微服务SpringCloud框架,在对所有模块进行容器化的过程中也要注意固定IP,映射相关目录、容器时间等问题,再下面的内容中,笔者也有相关介绍也解决。
Docker的安装这里不再赘述。
第一步是为应用制作一个基础镜像。
官方提供的java8镜像大小为643M
,生成服务的镜像体积就达到700M+
,所以这里笔者以alpine
镜像为基础自定义了一个jdk8版本的镜像,只有128M
。
已经对镜像的时间、环境编码做了处理,笔者已将镜像上传到DockerHub,可以使用pull命令下载:
$ docker pull hlwojiv/alpine-jdk8
如还需对此镜像进一步自定义,也可以下载笔者的Dockerfile文件(里面有个压缩包有点大,clone的时候等一会就好):
$ git clone https://github.com/hlwojiv/alpine-jdk8.git
修改项目中的pom.xml文件,配置插件内容,在 标签内添加以下内容:
<plugin>
<groupId>com.spotifygroupId>
<artifactId>docker-maven-pluginartifactId>
<version>0.4.13version>
<configuration>
<imageName>hub.examlpe.com/example/${project.artifactId}:latestimageName>
<forceTags>trueforceTags>
<baseImage>hlwojiv/alpine-jdk8baseImage>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]entryPoint>
<resources>
<resource>
<targetPath>/targetPath>
<directory>${project.build.directory}directory>
<include>${project.build.finalName}.jarinclude>
resource>
resources>
configuration>
plugin>
你需要改的是中的$
符号前的内容,顾名思义,这个标签定义了生成的镜像的名称。
配置完之后执行mvn命令生成镜像,在这个过程中docker服务要在运行状态:
$ mvn clean package docker:build
构建成功会看到这个结果:
执行docker images
,能看到构建成功的镜像:
在运行镜像前,要考虑微服务应用的配置,也就是所有模块应用的配置中,eureka的IP地址,这也就是限定所有服务的IP地址是固定的。
启动Docker容器的时候,使用默认的网络是不支持指定固定IP,所以笔者在这里创建了一个自定义网络:
$ docker network create --subnet=172.18.0.0/16 example
启动容器并指定固定IP:
$ docker run -p 2003:2003 --name order -v /data/logs:/data/logs --network example --ip 172.18.0.13 -d hub.example.com/example/order
至此,一个java应用模块的容器化就完成了,当然微服务中存在多个应用模块,重复上面的步骤启动即可,下图是我将全部模块启动后:
由于2000端口已经映射给宿主机,可以访问宿主机的2000端口查看服务是否注册:
可以看到服务都被注册上了,对应的IP地址也是容器的地址。
微服务容器化的主要为:制作jdk镜像、修改应用pom.xml文件、生成服务镜像、运行服务镜像这几个步骤,在运行镜像的时候要注意应用的IP需要固定,以及映射应用所用到的目录等问题。
到这篇文章发布时,该架构已在测试环境稳定地运行了两周,对前端的调用请求也没有出现什么问题,后期也会将生产的微服务换成容器化的结构。