启动

用 LTS 版本(推荐):

docker run -d \
  --name jenkins \
  --restart unless-stopped \
  -u root \
  -p 8080:8080 \
  -p 50000:50000 \
  -v jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkins/jenkins:2.452.3-lts

两个端口含义:

  • 8080:Web UI
  • 50000:JNLP agent 端口(如启用分布式构建)

两个挂载含义:

  • jenkins_home:所有配置 / 凭据 / Job 都在这里,必须命名卷或宿主机目录
  • /var/run/docker.sock:让 Jenkins Job 里能调用宿主机 docker 命令(DooD 模式)
docker.sock 是一把双刃剑。它给 Jenkins 完全的 docker 控制权,相当于让 Jenkins 容器"穿透"到宿主机。安全做法是用 DinD(独立 Docker-in-Docker)sidecar 替代;先这样跑也没问题,但权限范围要清楚。

首次访问与解锁

首次启动会打印管理员密码:

docker logs jenkins | grep -A1 "Please use the following"
# 或
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

浏览器打开 http://localhost:8080,粘贴密码,按提示装推荐插件。装完后建第一个管理员账号。

插件镜像加速

国内环境下默认 updates.jenkins.io 慢,改成清华源:

docker exec jenkins bash -c '
  sed -i "s|updates.jenkins.io|mirrors.tuna.tsinghua.edu.cn/jenkins|g" \
    /var/jenkins_home/hudson.model.UpdateCenter.xml
  sed -i "s|www.google.com|www.nju.edu.cn|g" \
    /var/jenkins_home/updates/default.json
'

重启生效:

docker restart jenkins
也可以挂一个自管的 updates.json 进容器,避免每次都改。生产环境建议在内网搭一个 Jenkins 更新代理。

Pipeline 示例

新建 Pipeline Job,把以下脚本粘进去——演示构建、测试、镜像打 tag 三步:

pipeline {
    agent any

    environment {
        IMAGE = "registry.example.com/myapp"
        TAG   = "${BUILD_NUMBER}"
    }

    stages {
        stage('Checkout') {
            steps { checkout scm }
        }

        stage('Build & Test') {
            steps {
                sh '''
                  dotnet restore
                  dotnet build --no-restore -c Release
                  dotnet test  --no-build -c Release --logger trx
                '''
            }
        }

        stage('Docker Build & Push') {
            steps {
                sh '''
                  docker build -t ${IMAGE}:${TAG} .
                  docker push  ${IMAGE}:${TAG}
                '''
            }
        }
    }

    post {
        always { junit '**/TestResults/*.trx' }
        failure { echo '构建失败:' + currentBuild.currentResult }
    }
}

三个阶段对应最常见的 CI 流程:拿代码 → 编译测试 → 镜像推送。后续接 CD 时再加 stage。

备份与升级

备份最简单的方式:备份 jenkins_home 命名卷:

docker run --rm \
  -v jenkins_home:/source:ro \
  -v $(pwd):/backup \
  alpine tar czf /backup/jenkins-$(date +%F).tar.gz -C /source .

升级到新 LTS:

docker pull jenkins/jenkins:2.462.3-lts
docker stop jenkins
docker rename jenkins jenkins-old
docker run -d --name jenkins ... jenkins/jenkins:2.462.3-lts
# 验证 OK 后:docker rm jenkins-old
升级前必须做完整备份;同时检查 官方升级指南,有些大版本需要先升到中间的过渡版本。

常见问题

  • Job 内 docker 命令权限被拒:确保容器以 -u root 启动,并挂载了 docker.sock。
  • 插件装一半失败:多半是网络问题。装镜像源后重试,或把 Job 调度到闲置时。
  • 磁盘满:Manage Jenkins → System Log → /var/jenkins_home/logs 看一下,旧的构建日志 / 制品可以定期清理。

使用准则

  1. 永远用 LTS 版本,每周自动发版的 weekly 留给测试尝鲜。
  2. jenkins_home 必须挂命名卷或宿主机目录,重建容器不丢数据。
  3. 把 docker.sock 视为权限提升:能用就别给,权限边界要清楚。
  4. 国内环境第一时间换插件镜像源,否则首次安装几乎必卡。
参考资料