docker部署java程序基本命令
1、在本地安装docker,这里已windows 11 系统为例
下载docker安装包,直接安装即可。
https://www.docker.com
安装完毕后,输入命令查看docker安装信息
docker version
启动docker,如果出现wsl的报错信息,在命令行输入
wsl --update
2、使用maven构建java项目,在项目根目录下编写对应的文件Dockerfile和docker_build.sh
Dockerfile文件内容如下
#Dockerfile
FROM registry.mlogcn.com/base/adoptopenjdk:8-jre-hotspot AS builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
FROM registry.mlogcn.com/base/adoptopenjdk:8-jre-hotspot
ARG user=www
ARG group=www
ARG uid=2021
ARG gid=2021
RUN set -eux; \
groupadd --gid=${gid} ${group}; \
useradd --uid=${uid} --gid=${gid} --shell=/bin/bash --create-home ${user}; \
mkdir -p application; \
chown -R ${uid}.${gid} application
WORKDIR application
COPY --from=builder --chown=${uid}:${gid} application/dependencies/ ./
COPY --from=builder --chown=${uid}:${gid} application/spring-boot-loader/ ./
COPY --from=builder --chown=${uid}:${gid} application/snapshot-dependencies/ ./
COPY --from=builder --chown=${uid}:${gid} application/application/ ./
ENV JVM_OPTS="-Duser.timezone=Asia/Shanghai -Djava.security.egd=file:/dev/./urandom" \
JAVA_OPTS=""
EXPOSE ${ServerPort}
USER ${user}
ENTRYPOINT ["sh", "-c", "exec java $JVM_OPTS $JAVA_OPTS org.springframework.boot.loader.JarLauncher"]
HEALTHCHECK --start-period=60s --interval=15s --timeout=5s --retries=3 \
CMD curl -m 5 -s -f -XGET "http://${host}:${ServerPort}/${checkUrl}" | \
jq -e -n 'inputs | if has("status") then .status=="UP" else false end' > /dev/null || exit 1
说明:
- 修改端口号,改成服务部署的端口号
EXPOSE ${ServerPort}
- 修改健康监测地址:
http://${host}:${ServerPort}/${checkUrl}
如果使用spring的actuator,可以直接用/actuator/health
docker_build.sh内容如下:
#docker_build.sh
#!/usr/bin/env bash
#------------------------------------------
# image build and push script.
# 最终的镜像格式为gavial-ng-web:1.3
#------------------------------------------
echo $1
export version=$1
if [ ! -n "$1" ];then
echo '未输入版本,将使用最新版本号 latest'
export version="latest"
echo ${version}
fi
docker login -u ${用户} -p ${密码} ${仓库地址}
image_name="${docker仓库地址}/${部署的java镜像名字}:${version}"
echo "start build $image_name"
docker build -f Dockerfile -t $image_name .
echo "image build success ..."
echo "start push image ..."
docker push $image_name
echo "image push success admin:${version} ..."
说明:
- 需要填写完善docker仓库信息
docker login -u ${用户} -p ${密码} ${仓库地址}
- 需要填写完善部署的java镜像信息
image_name="${docker仓库地址}/${部署的java镜像名字}:${version}"
3、修改pom文件的打包方式
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.3.RELEASE</version>
<configuration>
<mainClass>${mainClassPath}</mainClass>
<layers>
<enabled>true</enabled>
</layers>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
说明:
- 完善启动类路径。
<mainClass>${mainClassPath}</mainClass>
4、编译并上传到镜像仓库
使用maven命令执行编译
mvn clean install -Dmaven.test.skip=true
使用默认版本号覆盖上传(当前版本)
bash docker_build.sh
指定版本号上传
bash docker_build.sh ${version}
5、使用docker创建网络(这里docker的容器配置暂时不展开描述)
创建自定义网络
docker network create ${networkName}
6、编写docker和部署的java程序配置文件:docker-compose.yml
docker-compose.yml内容如下所示:
version: "3.9"
services:
${应用名字}:
image: ${仓库host}/${应用路径}:${版本}
container_name: ${应用名字}
restart: always
networks:
- ${networkName}
ports:
- "${外部端口}:${内部端口}"
env_file:
- "./common.env"
volumes:
- "/etc/localtime:/etc/localtime:ro"
- "./config/${应用名字}:/application/config:ro"
- "./logs/${应用名字}:/application/logs"
healthcheck:
test: curl -m 5 -s -f -XGET "http://localhost:${内部端口}/${checkUrl}"
| jq -e -n 'inputs | if has("status") then .status=="UP" else false end' > /dev/null || exit 1
interval: 15s
timeout: 5s
retries: 3
start_period: 30s
networks:
spoweress:
external: true
说明:
- 配置部署的应用名字:
${应用名字}
,例如:test-docker-app
- 配置应用的镜像地址:
image: ${仓库host}/${应用路径}:${版本}
,例如:image: 127.0.0.1/test/test-docker-app:0.02
- 配置网络:
- ${networkName}
- 配置端口:
- "${外部端口}:${内部端口}"
,例如:8080:8080
- 公用配置文件:
./common.env
- 专用配置文件:
- "./config/${应用名字}:/application/config:ro"
- 运行日志路径:
- "./logs/${应用名字}:/application/logs"
- 健康检查:
-XGET "http://localhost:${内部端口}/${checkUrl}"
- 如有多组应用,可以在
services
下编写多个;
7、服务器端,在部署目录下编写docker的配置文件:common.env
server.port=${ServerPort}
spring.application.name=${AppliCationName}
....
说明:
- 这个文件中存放的是java程序中的配置信息,可以在application.properties中通过变量引用获取。
- 通常用来放通用的配置项;
8、提交部署
不变更版本号的部署:刷新docker镜像:
docker pull ${镜像地址}:${版本号}
变更版本号的部署:修改docker-compose.yml
中的版本号:
image: ${仓库host}/${应用路径}:${版本}
9、运行实例:
docker-compose up -d
10、查看实例运行状态等信息:
docker ps
11、查看实例日志
docker logs -f ${CONTAINER ID}
说明:
1.${CONTAINER ID}
可以通过docker ps
命令获取
12、进入运行部署的目录
docker exec -it ${CONTAINER ID} /bin/bash