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
首次访问
- 打开
http://localhost:9000 - 获取初始密码:
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword - 安装推荐插件
- 创建管理员账户
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 | 流水线 |
| Git | Git 集成 |
| Docker | Docker 支持 |
| 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 内存 |