大家好!今天这篇教程会兼顾 CentOS 7 和 Ubuntu 系统,教你用 Docker、Kubernetes(K8s)和 Jenkins 搭建 Java 服务的自动化部署流程。这两套系统操作略有差异,但核心逻辑一致,跟着步骤走,无论用哪种 Linux 都能顺利上手~
为什么选择这三个工具?
- Docker:把 Java 服务打包成标准化容器,彻底解决"在我这能跑,到你那就崩"的环境问题
- Kubernetes:自动化管理容器集群,自动扩缩容、故障恢复、滚动更新全搞定
- Jenkins:构建自动化流水线,代码提交后自动完成"构建→测试→打包→部署"全流程
三者结合,就是一套企业级的 Java 服务部署解决方案。话不多说,开始实操!
准备工作
通用环境要求
- 一台 Linux 服务器(CentOS 7 或 Ubuntu 20.04/22.04,内存至少 2GB,K8s 对内存有要求)
- 服务器已关闭 SELinux(否则可能影响容器运行)
- 已安装 Java 8+(Jenkins 依赖 Java 环境)
- 已安装 Git(用于拉取代码)
第一步:基础环境配置(分系统操作)
CentOS 7 基础配置
# 关闭防火墙(生产环境可按需配置规则,测试环境简化操作)
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 关闭 SELinux(否则可能影响容器运行)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 安装基础工具
sudo yum install -y curl wget vim net-toolsUbuntu 基础配置
# 更新系统
sudo apt update && sudo apt upgrade -y
# 关闭防火墙(测试环境简化,生产环境需配置规则)
sudo ufw disable
# 安装基础工具
sudo apt install -y curl wget vim net-tools apt-transport-https ca-certificates第二步:安装 Docker(分系统操作)
CentOS 7 安装 Docker
# 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加 Docker 源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装 Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable dockerUbuntu 安装 Docker
# 添加 Docker GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加 Docker 源
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker验证 Docker 安装(通用)
docker --version # 显示版本信息即成功第三步:安装 Kubernetes(单节点,通用操作)
我们用 Minikube 搭建单节点 K8s 集群,适合入门:
安装 Minikube:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube安装 kubectl(K8s 命令行工具):
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl启动 Minikube 集群:
minikube start --driver=docker # 用 Docker 作为驱动
注意:如果 CentOS 7 启动失败,可能是内核版本问题,可尝试指定低版本 K8s:
minikube start --driver=docker --force --kubernetes-version=v1.23.0
验证 K8s 集群(通用):
kubectl get nodes # 看到 STATUS 为 Ready 即成功
第四步:安装 Jenkins(分系统操作)
先安装 Java(通用,若已安装可跳过)
# CentOS 7 安装 Java
sudo yum install -y java-1.8.0-openjdk-devel
# Ubuntu 安装 Java
sudo apt install -y openjdk-8-jdk
# 验证 Java 安装
java -version # 显示 1.8.x 版本即成功CentOS 7 安装 Jenkins
# 添加 Jenkins 源
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
# 安装 Jenkins
sudo yum install -y jenkins
# 启动并设置开机自启
sudo systemctl start jenkins
sudo systemctl enable jenkinsUbuntu 安装 Jenkins
# 添加 Jenkins 源
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/" | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null
# 安装 Jenkins
sudo apt update
sudo apt install -y jenkins
# 启动并设置开机自启
sudo systemctl start jenkins
sudo systemctl enable jenkins初始化 Jenkins(通用)
获取初始密码:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword- 访问 Jenkins:浏览器输入
http://服务器IP:8080,输入初始密码,安装推荐插件。
第五步:准备 Java 服务(通用)
用一个简单的 Spring Boot 项目演示,你也可以用自己的项目:
创建 Spring Boot 项目(通过 Spring Initializr 生成),添加一个 REST 接口:
@RestController public class DemoController { @GetMapping("/") public String hello() { return "Hello, Docker + K8s + Jenkins on Linux!"; } }在项目根目录创建
Dockerfile:# 基础镜像 FROM openjdk:8-jdk-alpine # 工作目录 WORKDIR /app # 复制 jar 包到容器 COPY target/demo-0.0.1-SNAPSHOT.jar app.jar # 暴露端口(与 Spring Boot 端口一致) EXPOSE 8080 # 启动命令 ENTRYPOINT ["java", "-jar", "app.jar"]- 提交代码到 Git 仓库(GitHub/GitLab/Gitee 均可)。
第六步:配置 Jenkins 流水线(通用)
- 在 Jenkins 新建"流水线"项目,选择"从 SCM 获取",填写你的 Git 仓库地址。
在仓库根目录创建
Jenkinsfile:pipeline { agent any tools { maven 'Maven' // 需在 Jenkins 全局工具配置中添加 Maven(名称保持一致) } stages { stage('Build') { steps { sh 'mvn clean package -DskipTests' // 构建 Java 项目 } } stage('Build Docker Image') { steps { sh 'docker build -t demo-app:${BUILD_NUMBER} .' // 打包镜像 sh 'docker tag demo-app:${BUILD_NUMBER} demo-app:latest' } } stage('Push to Minikube Docker') { steps { sh 'eval $(minikube docker-env)' // 连接 Minikube 内置 Docker sh 'docker push demo-app:${BUILD_NUMBER}' } } stage('Deploy to K8s') { steps { sh 'kubectl apply -f k8s/deployment.yaml' // 部署到 K8s sh 'kubectl apply -f k8s/service.yaml' } } } }- 在 Jenkins 中配置 Maven:
进入"系统管理→全局工具配置→Maven",添加 Maven 安装(命名为Maven,与 Jenkinsfile 一致)。
第七步:创建 K8s 部署配置(通用)
在项目根目录创建 k8s 文件夹,添加两个配置文件:
deployment.yaml(部署规则):apiVersion: apps/v1 kind: Deployment metadata: name: demo-app spec: replicas: 2 # 运行 2 个副本 selector: matchLabels: app: demo-app template: metadata: labels: app: demo-app spec: containers: - name: demo-app image: demo-app:latest # 使用我们构建的镜像 ports: - containerPort: 8080 imagePullPolicy: Never # 本地镜像不远程拉取service.yaml(访问规则):apiVersion: v1 kind: Service metadata: name: demo-app-service spec: selector: app: demo-app ports: - port: 80 targetPort: 8080 type: NodePort # 暴露端口到节点
第八步:运行部署流水线(通用)
- 在 Jenkins 中点击项目"立即构建",查看日志确保各阶段成功。
验证部署结果:
# 查看运行的容器(pod) kubectl get pods # 应有 2 个 Running 状态的 pod # 查看服务信息 kubectl get svc demo-app-service # 找到 NodePort(30000-32767 之间)访问服务:
minikube service demo-app-service --url # 获取访问地址 curl $(minikube service demo-app-service --url) # 测试访问,应返回 Hello 消息
常见问题解决(通用)
Jenkins 无权限执行 docker 命令:
sudo usermod -aG docker jenkins # 把 jenkins 用户加入 docker 组 sudo systemctl restart jenkins- K8s 拉取镜像失败:
检查deployment.yaml中imagePullPolicy: Never是否配置(本地镜像无需拉取)。 Minikube 启动失败:
minikube delete # 删除集群 minikube start --driver=docker --force # 强制重新启动- Jenkins 找不到 maven:
确保"全局工具配置"中 Maven 名称为Maven,与 Jenkinsfile 一致。
总结
无论你用 CentOS 7 还是 Ubuntu,核心流程都是:
代码提交→Jenkins 自动构建→打包 Docker 镜像→K8s 部署运行
这套流程看似复杂,但一旦搭建完成,后续部署 Java 服务只需提交代码,剩下的全自动化完成,大大提高开发效率。
如果操作中遇到问题,欢迎留言交流~ 祝大家部署顺利!