欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > docker不停机部署

docker不停机部署

2025/3/11 20:37:50 来源:https://blog.csdn.net/qichangleixin/article/details/146166212  浏览:    关键词:docker不停机部署

背景

最近做大疆项目时,后台更新部署时,机场和无人机就会掉线。设备自动重连注册时间比较长,应用长时间不可用。所以需要灰色发布服务。docker-compose的swarm模式可解决此问题。

服务构建脚本Dockerfile

# 使用官方Java基础镜像(推荐选择Alpine轻量版)
FROM openjdk:17-jdk-alpine
# 更新时区
RUN apk add --no-cache tzdata
ENV TZ=Asia/Shanghai
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo "Asia/Shanghai" > /etc/timezone \
# 设置工作目录
WORKDIR /app# 将JAR文件复制到容器中(注意替换为你的JAR文件名)
COPY ./*.jar /app/
COPY ./lib/*.jar /app/lib/ARG JAVA_OPTS="-server -Xmx512m -Xms512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256M -Xss256k -XX:+DisableExplicitGC -XX:+UseG1GC -XX:LargePageSizeInBytes=128m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dumps/oom_dump.hprof -Djava.security.egd=file:/dev/./urandom"RUN mkdir -p /app/dumps
RUN mkdir -p /app/logs
# 启动命令
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/${project.build.finalName}.jar > /app/logs/${project.build.finalName}.log 2>&1"]

容器编排配置docker-compose.yml

下面的内容没有一行是多余的,修改时要慎重考虑

version: '3.8'
networks:${project.artifactId}-stack-proxy-tier: # 自定义的网络名称(可任意定义,但是需要提前创建)external: trueservices:${project.artifactId}: #docker应用服务名称,不能包含非法字符比如点image: ${project.build.finalName}:${project.version}deploy:replicas: 2  # 至少保持2个副本update_config:parallelism: 1    # 每次更新1个实例delay: 10s        # 新实例启动间隔order: start-first # 先启动新实例,再停止旧实例restart_policy:condition: anyhealthcheck:test: ["CMD-SHELL", "wget -q --spider http://localhost:23111/actuator/health || exit 1"]interval: 10stimeout: 5sretries: 3start_period: 20svolumes:- ./${project.build.finalName}.jar:/app/${project.build.finalName}.jar- ./lib:/app/libenvironment:- VIRTUAL_HOST=192.168.1.4 # ip或者域名- VIRTUAL_PORT=23111 # 应用启动的端口networks:- ${project.artifactId}-stack-proxy-tier# 配置Nginx反向代理nginx:image: jwilder/nginx-proxy #专应用docker负载均衡、服务发现额镜像,功能非常强大environment:- TZ=Asia/Shanghai- HTTP_CHECK=/"actuator/health"ports:- "22011:80"volumes:- /var/run/docker.sock:/tmp/docker.sock:ronetworks:- ${project.artifactId}-stack-proxy-tierdepends_on:- ${project.artifactId}

启动脚本restart

linux

#!/bin/bash# 设置脚本在遇到错误时立即退出
set -einit(){docker swarm init# 检查Overlay网络是否存在‌:ml-citation{ref="3,4" data="citationList"}if [[ -z $(docker network ls --filter name=^${project.artifactId}-stack-proxy-tier$ --format '{{.Name}}') ]]; thenecho "Creating overlay network..."docker network create --driver overlay --attachable ${project.artifactId}-stack-proxy-tierelseecho "Network ${project.artifactId}-stack-proxy-tier already exists, skipping creation."fideploy
}restart(){deploy
}deploy() {# 构建Docker镜像docker build -t ${project.build.finalName}:${project.version} .# 部署Docker堆栈docker stack deploy --detach=false -c docker-compose.yml ${project.artifactId}-stack
}remove() {#删除堆栈docker stack rm ${project.artifactId}-stack#删除网络docker network rm ${project.artifactId}-stack-proxy-tier
}case $1 ininit) init;;restart)  restart;;remove)  status;;*)  echo "require init|restart|remove";;
esac

windows

@echo off
setlocal enabledelayedexpansionif "%1"=="init" goto init
if "%1"=="restart" goto restart
if "%1"=="remove" goto remove
echo require init^|restart^|remove
exit /b 1:init
docker swarm init
for /f "tokens=*" %%i in ('docker network ls --filter name^^=^${project.artifactId}-stack-proxy-tier$ --format "{{.Name}}"') do set network=%%i
if "!network!"=="" (echo Creating overlay network...docker network create --driver overlay --attachable ${project.artifactId}-stack-proxy-tier
) else (echo Network ${project.artifactId}-stack-proxy-tier already exists, skipping creation.
)
goto deploy:restart
goto deploy:deploy
docker build -t ${project.build.finalName}:${project.version} .
docker stack deploy --detach=false -c docker-compose.yml ${project.artifactId}-stack
exit /b 0:remove
docker stack rm ${project.artifactId}-stack
docker network rm ${project.artifactId}-stack-proxy-tier
exit /b 0

整合maven

上面脚本配置中的类似${project.build.finalName}变量是需要maven在构建时替换的。
resources进行替换,打包工具我用的maven-assembly-plugin,根据项目自行替换

<build><resources><resource><directory>src/main/resources</directory><filtering>true</filtering></resource><resource><directory>src/assembly/docker</directory><includes><include>docker-compose.yml</include><include>Dockerfile</include><include>restart.sh</include><include>restart.bat</include><include>nginx.conf</include></includes><filtering>true</filtering></resource></resources><plugin><!-- 配置打包文件 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.6.0</version><configuration><descriptors><descriptor>src/assembly/distribution.xml</descriptor></descriptors><finalName>${project.artifactId}-${project.version}</finalName></configuration><executions><execution><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin><plugin><!-- 配置启动入口 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.2</version><configuration><archive><manifest><mainClass>com.dji.sample.CloudApiSampleApplication</mainClass><addClasspath>true</addClasspath><classpathPrefix>lib</classpathPrefix></manifest></archive></configuration></plugin></plugins></build>

我所有的脚本以及配置文件是放在src/assembly/docker下的
在这里插入图片描述
maven构建配置distribution.xml

<?xml version="1.0" encoding="UTF-8"?>
<assemblyxmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"><id>package</id><formats><format>zip</format></formats><includeBaseDirectory>false</includeBaseDirectory><fileSets><fileSet><directory>target</directory><outputDirectory>./</outputDirectory><includes><include>*.jar</include></includes></fileSet><fileSet><directory>target/classes</directory><outputDirectory>./</outputDirectory><includes><include>docker-compose.yml</include><include>Dockerfile</include><include>restart.sh</include><include>restart.bat</include><include>nginx.conf</include></includes></fileSet></fileSets><dependencySets><dependencySet><outputDirectory>lib</outputDirectory></dependencySet></dependencySets>
</assembly>

docker容器启动

首次部署命令

restart.bat init

重启命令

restart.bat restart

删除命令(仅限调试)

restart.bat remove

修改镜像版本

每次更新时需要修改项目的版本号${revision}
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词