Jenkins一键部署Java应用远程Docker服务器完整步骤
作者:油墨香^_^
使用 Jenkins 一键将 Java 应用部署到远程 Docker 服务器,能显著提升部署效率并保证环境一致性。下面我将为你梳理核心的实现步骤、不同方法的选择以及一些最佳实践。
为了让你能快速把握整体流程,下图描绘了从代码提交到应用部署的完整步骤:

部署方案与操作步骤
实现一键部署,主要有两种方式:基于SSH的传统方式和使用Docker Pipeline插件。你可以根据技术熟悉度和项目需求选择。
方法一:基于SSH的部署
这种方法适合对脚本控制有偏好,或者部署环境对网络隔离有严格要求的场景。其核心是通过SSH连接并控制远程服务器。
1. 环境与插件准备
- 确保Jenkins和远程服务器(Docker宿主机)网络互通。
- 在Jenkins上安装 Publish over SSH 插件。
- 在Jenkins的
系统管理 > 系统配置中,配置远程服务器的SSH连接信息(主机、端口、凭据等)。
2. 准备构建脚本
在Jenkins项目中配置构建后操作,使用 Send build artifacts over SSH。
关键是在远程服务器上准备一个部署Shell脚本,通常需要完成以下任务:
#!/bin/bash # 定义项目名和端口 PROJECT_NAME="my-java-app" PORT=8080 # 停止并删除旧容器 docker stop $PROJECT_NAME || true docker rm $PROJECT_NAME || true # 删除旧镜像(可选,避免重名导致构建失败) # docker rmi $PROJECT_NAME || true # 构建新镜像(假设Dockerfile和jar包已通过SSH传输到指定目录) docker build -t $PROJECT_NAME . # 运行新容器 docker run -d -p $PORT:8080 --name $PROJECT_NAME $PROJECT_NAME
注意:脚本中的 || true 是为了防止因容器或镜像不存在而导致脚本执行中断。
3. 准备Dockerfile
在你的Java项目根目录下,需要一个Dockerfile来指导Docker构建镜像。一个基础的示例如下:
# 选择基础镜像 FROM openjdk:8-jdk-alpine # 设置工作目录 WORKDIR /app # 将Maven打包好的jar包复制到容器中 COPY target/my-app.jar app.jar # 声明应用运行端口 EXPOSE 8080 # 启动Java应用 CMD ["java", "-jar", "app.jar"]
方法二:使用Docker Pipeline插件
如果你希望更原生、更灵活地控制Docker,并且项目已在使用Jenkins Pipeline,那么这种方式更适合。它能让你在Jenkinsfile中直接使用Docker命令。
1. 安装插件
在Jenkins中安装 Docker Pipeline 插件。
2. 编写Jenkinsfile
在你的项目根目录创建一个Jenkinsfile,使用类似以下的脚本化流水线语法:
node {
checkout scm // 拉取代码
// 定义镜像名称,使用构建ID区分版本
def customImage = docker.build("my-java-app:${env.BUILD_ID}")
// 你可以选择在此处运行集成测试
// customImage.inside { sh 'make test' }
// 推送镜像到镜像仓库(可选,需要先配置凭据)
// customImage.push()
// 在远程Docker服务器上运行容器
docker.withServer('tcp://你的远程docker服务器:2376', 'docker-host-cert') {
// 注意:这里假设远程Docker守护进程开启了远程API访问
customImage.run("--name my-running-app -d -p 8080:8080")
}
}重要安全提示:直接暴露Docker的2375/2376端口存在安全风险。务必配合TLS证书认证使用,并在withServer方法中指定证书ID。
最佳实践与注意事项
为了让你的部署流程更稳健可靠,请参考以下几点:
- 提升构建效率:在Pipeline中,可以利用Docker的数据卷(Volume)功能,将Maven的本地仓库目录 (
~/.m2) 挂载到容器内。这样可以在多次构建之间缓存依赖,大幅减少下载时间。 - 管理镜像版本:建议为镜像打上有意义的标签,如
${BUILD_ID}、${GIT_COMMIT}前几位或latest,而不是每次都使用latest。这有助于版本追踪和回滚。 - 确保部署一致性:使用Dockerfile定义构建过程,可以固化应用运行环境,消除因环境差异导致的各种问题。
关注安全配置:
- 远程Docker守护进程的TLS加密访问至关重要。
- 在Jenkins中妥善管理各类凭据(如Git、Docker Registry、SSH等),切勿在脚本中硬编码密码。
方案选择与总结
如果你是初学者,或者需要一个在隔离网络环境中简单可靠的部署方式,基于SSH的方案更容易上手。
如果你的架构追求现代化和声明式配置,并且希望更精细地控制Docker构建和部署流程,Docker Pipeline是更强大和推荐的选择。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
