1、打包springboot项目为jar包(引入docker插件)
<properties>
<docker.image.prefix>springboot</docker.image.prefix>
</properties>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
2、新建文件DockerFile
# 基础镜像使用java
FROM java:8
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为app.jar
ADD rainyhon-admin.jar app.jar
# 运行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
VOLUME 指定了临时文件目录为/tmp。其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp。该步骤是可选的,如果涉及到文件系统的应用就很有必要了。/tmp目录用来持久化到 Docker 数据文件夹,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录
项目的 jar 文件作为 “app.jar” 添加到容器的
ENTRYPOINT 执行项目 app.jar。为了缩短 Tomcat 启动时间,添加一个系统属性指向 “/dev/./urandom” 作为 Entropy Source
如果是第一次打包,它会自动下载java 8的镜像作为基础镜像,以后再制作镜像的时候就不会再下载了。
3、Docker springboot jar 日志时间不正确
但是以上面的方式做出的镜像是有问题的,在后面运行项目时你会发现项目启动日志中的时间和宿主机的时间不一致。如果你项目中有使用获取系统当前时间就会出问题,一般来说我们还会加上-Duser.timezone=GMT+8
在制作镜像时候,运行jar时指定上时区参数,以便Springboot项目中的日志中能够正确读取到指定时区的时间。中国采用东八区的时区,所以是GMT+8
# 基础镜像使用java
FROM java:8
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为app.jar
ADD rainyhon-admin.jar app.jar
# 运行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","-Duser.timezone=GMT+8","/app.jar"]
4、部署文件
在服务器新建一个docker文件夹,将maven打包好的jar包和Dockerfile文件复制到服务器的docker文件夹下
5、 制作镜像
执行下面命令, 看好,最后面有个"."点!
docker build -t oa .
-t 参数是指定此镜像的tag名
制作完成后通过docker images命令查看我们制作的镜像
6、启动容器
docker run -p 8088:8088 oa
-d参数是让容器后台运行 (上面的命令是在前台运行 正常来说要后台运行)
-p 是做端口映射,此时将服务器中的8080端口映射到容器中的8088(项目中端口配置的是8088)端口
7、docker挂载文件
一般来说使用docker部署项目都要将配置文件、log日志、图片文件路径挂载出来,使用宿主机的文件 ,配置文件是为了方便修改一些设置(redis、mysql等的连接)、log日志如果不放到宿主机上,当容器重启时会将log日志清空
-v 是做挂载的 下面就是挂载配置文件 一般来说配置文件和log日志都需要挂载出来
-e TZ=“Asia/Shanghai” 指定容器中的时间区域
具体步骤
第一步: 确定自己的docker容器中的日志目录
第二步:确定宿主机的挂载目录
第三步:运行docker
docker run -it -d -e TZ=“Asia/Shanghai” -p 8088:8088 -v /usr/local/app/logs:/logs oa
好了,这样启动以后,配置文件、log日志、图片文件路径就会写入到宿主机的目录中,当你的容器关闭、重启或是删除容器时日志都会被完整的保留下来,修改redis、mysql时 只需要更改宿主机的挂载文件就可以了
完整项目启动命令:
docker run -d -v /wwwroot/oa/docker/conf/application-prod.yml:/application-prod.yml -v /wwwroot/oa/logs:/logs -v /home/upload:/home/upload -e TZ=“Asia/Shanghai” -p 8088:8088 oa
8、docker logs-查看docker容器日志
查看日志 docker logs 容器id
通过docker logs命令可以查看容器的日志。
命令格式:
$ docker logs [OPTIONS] CONTAINER
Options:
--details 显示更多的信息
-f, --follow 跟踪实时日志
--since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
--tail string 从日志末尾显示多少行日志, 默认是all
-t, --timestamps 显示时间戳
--until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
例子:
查看所有日志
$ docker logs CONTAINER_ID
查看指定时间后的日志,只显示最后100行:
$ docker logs -f -t --since="2021-02-08" --tail=100 CONTAINER_ID
查看最近30分钟的日志:
$ docker logs --since 30m CONTAINER_ID
查看某时间之后的日志:
$ docker logs -t --since="2021-02-08T13:23:37" CONTAINER_ID
查看某时间段日志:
$ docker logs -t --since="2021-02-08T13:23:37" --until "2021-02-09T12:23:37" CONTAINER_ID