完整示例:创建、打包和离线部署 Jenkins Docker 容器

一、在云服务器上创建并运行 Jenkins 容器

  1. 创建并启动基础容器

    bash

    # 创建并启动一个 Ubuntu 容器,映射 Jenkins 端口
    docker run -itd \
    --name jenkins-builder \
    -p 8080:8080 \
    -v jenkins-data:/var/jenkins_home \
    ubuntu:20.04 /bin/bash
  2. 进入容器并安装 Jenkins

    bash

    # 进入容器
    docker exec -it jenkins-builder /bin/bash
    
    # 在容器内执行以下命令
    apt-get update
    apt-get install -y openjdk-11-jre wget
    
    # 下载 Jenkins WAR 包
    wget https://get.jenkins.io/war/2.541.3/jenkins.war -P /usr/share/jenkins/
    #上面不行的话
    #使用 wget https://get.jenkins.io/war-stable/latest/jenkins.war -P /usr/share/jenkins/
    
    # 创建启动脚本
    echo '#!/bin/bash
    java -Duser.timezone=Asia/Shanghai -jar /usr/share/jenkins/jenkins.war --httpPort=8080' > /usr/local/bin/start-jenkins.sh
    
    chmod +x /usr/local/bin/start-jenkins.sh
    
    # 设置环境变量
    echo 'export JENKINS_HOME=/var/jenkins_home' >> /etc/environment
    source /etc/environment
    
    # 创建 Jenkins 数据目录
    mkdir -p $JENKINS_HOME
    
    # 退出容器
    exit
  3. 启动 Jenkins 服务

    bash

    docker exec -d jenkins-builder /usr/local/bin/start-jenkins.sh

二、将运行中的容器打包为镜像

  1. 提交容器为新镜像

    bash

    docker commit jenkins-builder my-jenkins:2.541.3-offline
  2. 验证新镜像

    bash

    docker images | grep my-jenkins

三、导出镜像以便离线使用

  1. 保存镜像为 tar 文件

    bash

    docker save -o my-jenkins-2.541.3.tar my-jenkins:2.541.3-offline
  2. 压缩镜像文件(可选,减小体积)

    bash

    gzip my-jenkins-2.541.3.tar
  3. 将文件传输到离线电脑

    bash

    # 使用 scp 或其他方式传输
    scp my-jenkins-2.541.3.tar.gz user@offline-pc:/path/to/destination

四、在离线电脑上导入并运行 Jenkins

  1. 导入镜像

    bash

    # 解压(如果之前压缩了)
    gunzip my-jenkins-2.541.3.tar.gz
    
    # 导入镜像
    docker load -i my-jenkins-2.541.3.tar
  2. 运行 Jenkins 容器

    bash

    docker run -itd \
    --name jenkins \
    -p 8080:8080 \
    -v jenkins-data:/var/jenkins_home \
    my-jenkins:2.541.3-offline \
    /usr/local/bin/start-jenkins.sh
  3. 获取初始密码

    bash

    docker logs jenkins | grep "initialAdminPassword"
  4. 访问 Jenkins

    • 在浏览器中打开 http://localhost:8080
    • 输入初始密码完成设置

五、关键注意事项

  1. 数据持久化

    • 必须使用 -v jenkins-data:/var/jenkins_home 参数
    • 这确保了即使容器被删除,Jenkins 配置和任务数据依然保存
  2. 镜像大小优化

    • 基础镜像使用 ubuntu:20.04 会包含很多不必要的软件包
    • 优化建议:使用 openjdk:11-jre-slim 作为基础镜像,可减少 50% 以上的体积
  3. 时区设置

    • 在启动命令中添加 -Duser.timezone=Asia/Shanghai 确保时间正确
    • 也可在 Dockerfile 中设置环境变量 ENV TZ=Asia/Shanghai
  4. 离线环境验证

    • 在离线电脑上运行前,确保 Docker 服务已启动
    • 检查端口 8080 是否被占用
  5. 备份与恢复

    • 定期备份 jenkins-data 卷中的内容
    • 可使用 docker volume inspect jenkins-data 查看卷位置

六、完整脚本示例

bash

#!/bin/bash

# 云服务器上执行
echo "=== 创建 Jenkins 容器 ==="
docker run -itd --name jenkins-builder -p 8080:8080 -v jenkins-data:/var/jenkins_home ubuntu:20.04 /bin/bash

echo "=== 安装 Jenkins ==="
docker exec jenkins-builder apt-get update
docker exec jenkins-builder apt-get install -y openjdk-11-jre wget
docker exec jenkins-builder wget https://get.jenkins.io/war/2.541.3/jenkins.war -P /usr/share/jenkins/
docker exec jenkins-builder bash -c 'echo "#!/bin/bash\njava -Duser.timezone=Asia/Shanghai -jar /usr/share/jenkins/jenkins.war --httpPort=8080" > /usr/local/bin/start-jenkins.sh'
docker exec jenkins-builder chmod +x /usr/local/bin/start-jenkins.sh
docker exec jenkins-builder bash -c 'echo "export JENKINS_HOME=/var/jenkins_home" >> /etc/environment'
docker exec jenkins-builder mkdir -p $JENKINS_HOME

echo "=== 启动 Jenkins ==="
docker exec -d jenkins-builder /usr/local/bin/start-jenkins.sh

echo "=== 打包为镜像 ==="
docker commit jenkins-builder my-jenkins:2.541.3-offline

echo "=== 导出镜像 ==="
docker save -o my-jenkins-2.541.3.tar my-jenkins:2.541.3-offline
gzip my-jenkins-2.541.3.tar

echo "=== 完成!请将 my-jenkins-2.541.3.tar.gz 传输到离线电脑 ==="

# 离线电脑上执行
echo "=== 离线电脑导入镜像 ==="
gunzip my-jenkins-2.541.3.tar.gz
docker load -i my-jenkins-2.541.3.tar

echo "=== 运行 Jenkins ==="
docker run -itd --name jenkins -p 8080:8080 -v jenkins-data:/var/jenkins_home my-jenkins:2.541.3-offline /usr/local/bin/start-jenkins.sh

echo "=== 获取初始密码 ==="
docker logs jenkins | grep "initialAdminPassword"

此方案确保了 Jenkins 环境的完整性和可移植性,同时保持了数据持久化离线可用性

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐