Linux 上 Jenkins 与 Docker 的集成应用
一 架构与方案选型
二 快速落地步骤
三 示例 Jenkinsfile
pipeline {
agent any
environment {
DOCKER_REGISTRY = 'your-registry.com' // 私有仓库或 Docker Hub
IMAGE_NAME = 'microservice-app'
IMAGE_TAG = "${env.BUILD_ID}"
REMOTE_USER = 'deploy'
REMOTE_HOST = '192.168.10.20'
CONTAINER_NAME = 'microservice-app'
APP_PORT = '8080'
}
stages {
stage('Checkout') {
steps {
git branch: 'main',
url: 'https://gitee.com/your-org/your-repo.git',
credentialsId: 'git-credentials'
}
}
stage('Build') {
steps {
sh 'mvn clean package -DskipTests'
}
}
stage('Build Image') {
steps {
script {
docker.build("${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}", '-f Dockerfile .')
}
}
}
stage('Push Image') {
steps {
script {
docker.withRegistry("https://${DOCKER_REGISTRY}", 'docker-registry-credentials') {
docker.image("${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}").push()
}
}
}
}
stage('Deploy') {
steps {
sshagent(['ssh-credentials']) {
sh """
ssh ${REMOTE_USER}@${REMOTE_HOST} '
docker pull ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} && \
docker stop ${CONTAINER_NAME} || true && \
docker rm ${CONTAINER_NAME} || true && \
docker run -d --name ${CONTAINER_NAME} \
-p ${APP_PORT}:${APP_PORT} \
${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}
'
"""
}
}
}
}
post {
success {
echo "Deployed ${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} to ${REMOTE_HOST}:${APP_PORT}"
}
failure {
echo "Deployment failed. To rollback, run on ${REMOTE_HOST}: docker run ... ${DOCKER_REGISTRY}/${IMAGE_NAME}:<PREV_TAG>"
}
}
}
四 安全与连通性要点
五 常见问题与排查