基于Docker容器的Java服务部署手册

基于Docker容器的Java服务部署手册

目前公司后端项目部署文档;不建议使用java -jar命令的方式来直接运行Java服务,这种方式不便于管理

这里不采用打包Docker镜像的方式,用openjdk镜像+挂载目录的方式来在容器下运行jar文件;这样不需要维护镜像仓库,只需了解基础的Docker命令就能部署

1 服务器环境准备

1.1 安装Docker

1
2
# 假设服务器是debian/ubuntu发行版本
apt install docker.io

1.2 拉取openjdk镜像

1
2
3
4
5
# 下载最新的OpenJDK11镜像
docker pull openjdk:11

# 如果是Java 8项目,可以用OpenJDK8镜像
# docker pull openjdk:8

2 具体部署步骤

2.1 打包jar文件

打包方式

  • 可以Maven的package命令或者Gradle的bootJar之类的命令来打包生成jar
  • 也可以在Jenkins之类的构建工具下打包jar文件到约定存储目录

不建议将环境相关的配置文件放在src/main/resources目录下直接打包

2.3 上传.jar文件至目标服务器

.jar文件一般放在/srv/java目录下,这个目录根据具体情况还可以再细分,比如细分/srv/java/dev/srv/java/test分别用于开发环境和测试环境

2.3 编辑服务器上的配置文件

在服务器上确保创建了/var/work这样的目录 再以项目名创建子目录,比如abc项目对应的完整路径是/var/work/abc 再创建config目录,里面新建application.properties配置文件(完整路径是/var/work/abc/config/application.properties)

2.4 新建并运行容器

示例命令参考:

1
2
3
4
5
6
7
8
9
10
docker run -d \
--net host \
--name abc \
-v /srv/java:/srv/java \
-v /var/work:/var/work \
-w /var/work/abc \
-e TZ="Asia/Shanghai" \
--log-driver journald \
--restart always \
openjdk:11 java -jar /srv/java/abc-service-1.0.jar

命令行参数详解:

  • -d 让容器在后台运行
  • --net host 指定使用宿主机的网络,这样服务配置指定的端口等于直接绑在宿主机上,外部直接用宿主机ip+程序端口就能访问
  • --name abc 指定容器名为abc
  • -v 将宿主机的目录挂载映射到容器内,使得容器内程序可以读/写到
    • 格式是:-v ${宿主机的路径}:${容器内的路径}
  • -w 指定容器内程序的当前目录
  • -e TZ="Asia/Shanghai" 指定中国时区(重要,如果不指定,程序内时间显示的会减8小时)
  • --log-driver journald 将容器日志写systemd-journald里,默认是写到.json文件的,不便于管理
  • --restart always 设置容器自动重启:程序崩溃或者服务器重启后,容器都会尝试自动启起来
  • openjdk:11 java -jar /srv/java/abc-service-1.0.jar 镜像名:版本,后面java -jar /srv/java/abc-service-1.0.jar是CLI命令

其它说明

  • -p-P参数也不需要配置,因为端口号是程序配置文件自己指定,并且直接绑到宿主机上的(--net host
  • -e SERVICE_NAME--expose-l traefik.*这样的参数不再需要配置,因为项目上一般不会使用注册中心,也不大会有多个实例需要负载均衡的情况

2.5 其它维护命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看`abc`容器的最后1000条日志
docker logs -n 1000 abc

# 重启容器
docker restart abc

# 启动容器
docker start abc

# 停止容器
docker stop abc

# 删除容器,容器需要在stop状态下才能删
docker rm abc

# 强制删除容器
docker rm -f abc

# 查看资源占用
docker stats

基于Docker容器的Java服务部署手册
http://blog.jingxiang.ltd/2023/05/30/基于Docker容器的Java服务部署手册/
作者
yemangran
发布于
2023年5月30日
许可协议