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

说明:

  1. 修改端口号,改成服务部署的端口号 EXPOSE ${ServerPort}
  2. 修改健康监测地址: 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} ..."

说明:

  1. 需要填写完善docker仓库信息 docker login -u ${用户} -p ${密码} ${仓库地址}
  2. 需要填写完善部署的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>

说明:

  1. 完善启动类路径。 <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

说明:

  1. 配置部署的应用名字:${应用名字},例如:test-docker-app
  2. 配置应用的镜像地址: image: ${仓库host}/${应用路径}:${版本},例如:image: 127.0.0.1/test/test-docker-app:0.02
  3. 配置网络: - ${networkName}
  4. 配置端口: - "${外部端口}:${内部端口}",例如:8080:8080
  5. 公用配置文件:./common.env
  6. 专用配置文件:- "./config/${应用名字}:/application/config:ro"
  7. 运行日志路径:- "./logs/${应用名字}:/application/logs"
  8. 健康检查:-XGET "http://localhost:${内部端口}/${checkUrl}"
  9. 如有多组应用,可以在services下编写多个;

7、服务器端,在部署目录下编写docker的配置文件:common.env

server.port=${ServerPort}
spring.application.name=${AppliCationName}
....

说明:

  1. 这个文件中存放的是java程序中的配置信息,可以在application.properties中通过变量引用获取。
  2. 通常用来放通用的配置项;

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