通过docker容器启动jar包详解

目录
  1. 1. 1 缘起与目的
  2. 2. 2 理清思路
  3. 3. 3 Dockerfile
    1. 3.1. 3.1 上传Dockerfile文件
    2. 3.2. 3.2 创建镜像
  4. 4. 4 启动容器
    1. 4.1. 4.1 指定配置文件yml
    2. 4.2. 4.2 不指定配置文件yml
  5. 5. 5 查看日志
  6. 6. 6 更新jar包
  7. 7. 7 配置nginx请求转发
  8. 8. 8 常用Docker命令

1 缘起与目的

在我刚实习的时候,老程序猿们通过docker容器优雅的启停jar包、查看日志等骚操作深深的的震撼了我,现在我们来探究一番他们是怎么部署docker容器jar包应用的。

本次教程想要实现的目标效果如下:

  1. 使用docker容器启停jar包
  2. 能通过docker logs查看日志
  3. 替换jar包不用容器拷贝,直接放到宿主机指定目录,重启容器即可
  4. log日志可以从宿主机直接访问
  5. 最好能在启动时指定jar包使用哪个yml文件

2 理清思路

基于我们的目的,我们思路也逐渐理顺了,基本思路如下。

  1. Dockerfile文件。我们在Dockerfile中需要加载jdk环境。设置每次重启docker执行重启jar包命令。在run时可以通过传参的形式指定使用的yml。
  2. docker run。启动容器时需要配置端口。挂载jar包位置。可以指定配置yml。
  3. docker restart。重启jar包时需要重启docker容器。

3 Dockerfile

3.1 上传Dockerfile文件

1
2
3
4
5
6
7
8
9
10
11
12
13
FROM eclipse-temurin:11-jre-alpine
MAINTAINER rex
ENV MYPATH /usr/local/app
# 指定最大内存的百分比(默认25.0) && 设置JVM默认时区
ENV JVM_OPTS="-XX:MaxRAMPercentage=80.0 -Duser.timezone=Asia/Shanghai"
ENV properties ""
WORKDIR $MYPATH
# 给jar包赋予权限(可以不用)
# CMD chmod 777 /usr/local/app/*.jar
# 用tee命令将产生的目录在输出到控制台的同时输出到文件中(tee用不上,通常springboot日志会自定义存储到文件)
# CMD java $JVM_OPTS -jar /usr/local/app/*.jar $properties | tee /usr/local/app/log.file
# 此时java进程pid=1,可优雅停机
ENTRYPOINT [ "sh", "-c", "java $JVM_OPTS -jar /usr/local/app/*.jar $properties" ]

注意:在dockerfile中只能有1个CMD指令,如有多个,最后一个生效

3.2 创建镜像

1
2
cd /home/docker/app
docker build -t jar-app .

--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式

4 启动容器

4.1 指定配置文件yml

1
docker run -d -p 8815:8080 -v /home/docker/app/:/usr/local/app/ -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime:ro -e properties="--spring.profiles.active=test" --name pm-app jar-app

-d 表示在后台启动
-p 宿主机端口:docker端口 表示将容器的端口映射成宿主主机的端口
-v /xxx:/yyy 表示将宿主主机的jar文件,映射到容器中(分号前为宿主主机的路径就是服务器的路径,分号后为容器中的路径)
--name pm-app 表示为该容器取一个全局唯一的名称,这里我取的名称为pm-app
jar-app 使用哪个镜像创建容器
-v 参数中ro代表只读模式(read only),要和宿主机时区同步,否则log文件里时间和实际差八个小时


注意:由于使用tee命令的原因,启动时的输出不能退出容器。只能重新连接一个ssh。笔者这里也没有什么好办法。大家有什么办法可以评论或者私信我。

4.2 不指定配置文件yml

1
docker run -d -p 8815:8080 -v /home/docker/app/:/usr/local/app/ --name pm-app jar-app

5 查看日志

1
docker logs -ft --tail 50 pm-app

1
cat /home/docker/app/log.file

6 更新jar包

上传jar包之后重启docker容器

1
docker restart pm-app

7 配置nginx请求转发

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name test.xxx.com;

location / {
proxy_pass http://127.0.0.1:8815/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
# 没有这一行静态资源文件无法加载
proxy_set_header Host $host;
}
}

8 常用Docker命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看所有镜像
docker image ls -a

# 删除镜像
docker image rm nameOrId

# 查看所有容器
docker container ls -a

# 删除容器
docker container rm nameOrId

# 进入容器
docker exec -it nameOrId /bin/sh

扩展阅读:
Java SpringBoot 项目构建 Docker 镜像调优实践
SpringBoot 2.3.x 分层构建 Docker 镜像实践