跳到主要内容

Docker 部署 Jenkins

Jenkins 是流行的 CI/CD 工具,用于自动化构建、测试和部署。

快速开始

基础部署

# 创建目录
mkdir -p /apps/devops/jenkins
chmod 777 /apps/devops/jenkins

# 启动 Jenkins
docker run -d \
--name jenkins \
-p 9000:8080 \
-p 50000:50000 \
-v /apps/devops/jenkins:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/usr/bin/docker \
jenkins/jenkins:lts

首次访问

  1. 打开 http://localhost:9000
  2. 获取初始密码:docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
  3. 安装推荐插件
  4. 创建管理员账户

Docker Compose 部署

version: '3.8'

services:
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins
ports:
- "9000:8080"
- "50000:50000"
volumes:
- jenkins-data:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
environment:
- JAVA_OPTS=-Djenkins.install.runSetupWizard=false

jenkins-dind:
image: docker:dind
container_name: jenkins-dind
privileged: true
ports:
- "2375:2375"
volumes:
- docker-data:/var/lib/docker

volumes:
jenkins-data:
docker-data:

常用插件

插件用途
Blue Ocean现代化 UI
Pipeline流水线
GitGit 集成
DockerDocker 支持
Credentials凭据管理
Role-based Authorization角色权限

流水线示例

Jenkinsfile

pipeline {
agent any

environment {
DOCKER_IMAGE = 'myapp'
REGISTRY = 'registry.cn-hangzhou.aliyuncs.com/igeekfan'
}

stages {
stage('Build') {
steps {
sh 'dotnet restore'
sh 'dotnet build -c Release'
}
}

stage('Test') {
steps {
sh 'dotnet test'
}
}

stage('Docker Build') {
steps {
script {
def image = docker.build("${REGISTRY}/${DOCKER_IMAGE}:${BUILD_NUMBER}")
}
}
}

stage('Docker Push') {
steps {
script {
docker.withRegistry("https://${REGISTRY}", 'registry-credentials') {
docker.image("${REGISTRY}/${DOCKER_IMAGE}:${BUILD_NUMBER}").push()
docker.image("${REGISTRY}/${DOCKER_IMAGE}:${BUILD_NUMBER}").push('latest')
}
}
}
}

stage('Deploy') {
steps {
sh """
docker stop ${DOCKER_IMAGE} || true
docker rm ${DOCKER_IMAGE} || true
docker run -d --name ${DOCKER_IMAGE} -p 5000:80 ${REGISTRY}/${DOCKER_IMAGE}:${BUILD_NUMBER}
"""
}
}
}

post {
always {
cleanWs()
}
}
}

简单构建脚本

#!/bin/bash
# build.sh

GITHASH=$(git rev-parse --short HEAD)
IMAGE_NAME="myapp"
REGISTRY="registry.cn-hangzhou.aliyuncs.com/igeekfan"

echo "Building Docker image..."
docker build -f Dockerfile -t ${IMAGE_NAME}:${GITHASH} .
docker tag ${IMAGE_NAME}:${GITHASH} ${REGISTRY}/${IMAGE_NAME}:${GITHASH}
docker tag ${IMAGE_NAME}:${GITHASH} ${REGISTRY}/${IMAGE_NAME}:latest

echo "Pushing to registry..."
docker push ${REGISTRY}/${IMAGE_NAME}:${GITHASH}
docker push ${REGISTRY}/${IMAGE_NAME}:latest

echo "Deploying..."
docker stop ${IMAGE_NAME} || true
docker rm ${IMAGE_NAME} || true
docker run -d --name ${IMAGE_NAME} -p 5000:80 ${REGISTRY}/${IMAGE_NAME}:${GITHASH}

常用命令

# 查看日志
docker logs -f jenkins

# 进入容器
docker exec -it jenkins /bin/bash

# 安装插件
docker exec -it jenkins jenkins-plugin-cli --plugins blue-ocean

# 备份
docker exec jenkins tar -czf /var/jenkins_home/backup.tar.gz /var/jenkins_home

运维建议

建议说明
定期备份备份 Jenkins 配置和数据
插件更新定期更新插件
权限管理配置合理的用户权限
资源限制限制构建资源使用

故障排查

问题解决方案
无法启动检查目录权限
插件安装失败检查网络连接
构建失败检查 Docker 权限
内存不足增加 JVM 内存

相关文档