使用Docker部署Ktor服务

最近写教务系统课表爬虫,找到一段java的青果代码,是android端的,我做的是小程序,只能放到服务端了,但是青果的java版加密算法对于PHP而言,实现难度太大,我又不会java,最后,选择了部署到服务端,使用kotlin,ktor是kotlin官方的框架,支持,client与service,两个都用了,先用service提供加密,然后client去提交,最后返回给小程序JSON。

服务器用的ubuntu所以,就用了docker,因为我也不会java的服务配置。。。

当写完ktor的程序后,在gradle安装一个shadow插件,负责把kotlin打包成一个jar,然后再部署,首先,Gradle:

1
classpath "com.github.jengelman.gradle.plugins:shadow:2.0.1"

应用插件

1
2
3
apply plugin: 'kotlin'
apply plugin: "com.github.johnrengelman.shadow"
apply plugin: 'application'

修改启动主函数:这里注意,如果你的main函数是顶级函数写法,写主函数所在的文件名加上Kt没有点。

1
mainClassName = "app.ApplicationKt"

在gradle最后配置shadow

1
2
3
4
5
shadowJar {
baseName = 'my-application'
classifier = null
version = null
}

然后 Gradlew build 打包jar

准备dockerFile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM openjdk:8-jre-alpine

ENV APPLICATION_USER ktor
RUN adduser -D -g '' $APPLICATION_USER

RUN mkdir /app
RUN chown -R $APPLICATION_USER /app

USER $APPLICATION_USER

COPY ./build/libs/my-application.jar /app/my-application.jar
WORKDIR /app

CMD ["java", "-server", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseCGroupMemoryLimitForHeap", "-XX:InitialRAMFraction=2", "-XX:MinRAMFraction=2", "-XX:MaxRAMFraction=2", "-XX:+UseG1GC", "-XX:MaxGCPauseMillis=100", "-XX:+UseStringDeduplication", "-jar", "my-application.jar"]

构建镜像:注意点 上下文路径

1
docker build -t my-application .

启动容器

1
docker run  -p 8080:8080  my-application

然后修改nginx指向8080即可。