注意事项
- 本片文档使用Windows环境,Linux环境下操作步骤一样
- Linux下安装Docker可参考我写的文档:https://blog.csdn.net/m0_51510236/article/details/115054073
- 注意三连,要不然你就找不到那么好的原创文章了
操作步骤
首先我们来到项目目录:
使用maven的命令将应用程序打包
mvn clean package -Dmaven.test.skip
打包成功:
并且在 target 目录下生成一个 jar 包文件,我们记录一下它的名字:
现在开始我们开始编写 Dockerfile 文件:
# 用jdk容器执行这个程序 FROM openjdk:8 # 作者 MAINTAINER XiaoHH <1431984546@qq.com> # VOLUME 指定了临时文件目录为/tmp。 # 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp VOLUME /tmp # 将可执行的jar包放到容器当中去 ADD target/xiaohh-cost-1.0.0.jar app.jar # 暴露服务端口 EXPOSE 8080 # 暴露日志目录,Java程序运行的错误日志就在这个里面 VOLUME '/logs' # 运行时的环境 ENV SPRING_PROFILES_ACTIVE="prod" # JVM 调优参数 ENV JAVA_OPTION="-Dfile.encoding=UTF-8 -Xmx512m -Xms512m -Xmn256m -XX:+UseParallelGC -XX:+PrintGCDetails -XX:+PrintGCCause -XX:+PrintHeapAtGC -Xloggc:/logs/xiaohh-cost.gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC" # 运行程序 RUN bash -c 'touch /app.jar' ENTRYPOINT ["sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -jar $JAVA_OPTION /app.jar"]
详细的说一下每一行是什么意思,首先第一行
FROM openjdk:8
这一行是继承自 openjdk8 代表Java程序要运行在这样一个环境当中,第二行作者不在赘述,第三行,将虚拟机的 /tmp 临时目录挂载出来一下,方便访问容器内的临时文件
VOLUME /tmp
第四行很重要,将我们刚刚生成的 target 目录下的 xiaohh-cost-1.0.0.jar 文件复制到容器当中,并且以 app.jar 来命名这个文件
AD target/xiaohh-cost-1.0.0.jar app.jar
第四行暴露端口,将我们web服务的端口在容器当中暴露出来,以便我们访问:
EXPOSE 8080
第五行暴露日志目录,引用程序的日志(包括报错日志和gc日志)都在这个目录下面,方便我们进行查看:
VOLUME '/logs'
第六行声明运行时的环境,也是设置容器内的环境变量,在程序代码中有调用这个变量,这个配置代表我们使用的是生产环境
ENV SPRING_PROFILES_ACTIVE="prod"
程序内的用到的地方:
多环境配置可以参考https://blog.csdn.net/m0_51510236/article/details/113995303
然后我们可以设置Java程序在运行时的调优参数,调优参数设置具体可以参考我编写的JVM调优参数文档:https://blog.csdn.net/m0_51510236/article/details/113738338
ENV JAVA_OPTION="-Dfile.encoding=UTF-8 -Xmx512m -Xms512m -Xmn256m -XX:+UseParallelGC -XX:+PrintGCDetails -XX:+PrintGCCause -XX:+PrintHeapAtGC -Xloggc:/logs/xiaohh-cost.gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC"
最后两行就是运行这个Java程序了:
RUN bash -c 'touch /app.jar' ENTRYPOINT ["sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -jar $JAVA_OPTION /app.jar"]
然后我们在命令行输入命令,创建一个docker镜像(我之前电脑上有openjdk:8的镜像,如果你们电脑上没有会自动下载一个,需要联网)
# 注意 xiaohh-cost 是镜像名,而 1.0.0 是镜像版本,不要漏了后面的那个点 docker build -t xiaohh-cost:1.0.0 .
需要注意执行操作的目录:
然后可以看到镜像被创建出来了:
然后使用命令运行这个镜像:
docker run -d -p 8080:8080 -v /logs:/logs --name xiaohh-cost xiaohh-cost:1.0.0
- -d 代表以守护进程的方式运行
- -p 8080:8080 表示将内部的8080端口暴露到物理机的8080端口,方便访问
- -v /logs:/logs 将内部的 /logs 目录,也就是存放日志的目录,暴露到物理机目录的/logs目录下,方便查看日志
- –name xiaohh-cost 代表的是运行起来的容器的名字
- 最后的 xiaohh-cost:1.0.0 是运行的那个镜像,镜像的版本号和镜像名
使用命令 docker ps 查看运行当中的镜像:
然后访问一下接口文档:
好了下课