利用Docker快速安装Jenkins

文章目录

前提自己先安装好Docker

CentOS安装Docker以及常用命令

官方文档https://www.jenkins.io/doc/book/installing/docker/

将之前的3篇内容来哦快速安装整合

使用Docker Hub 存储库中推荐的官方jenkins/jenkins镜像。此映像包含Jenkins 当前的长期支持 (LTS) 版本,该版本已做好生产准备。但是,该映像不包含 Docker CLI,并且未与常用的 Blue Ocean 插件及其功能捆绑在一起。

1.在Docker中创建桥接网络

sh 复制代码
docker network create jenkins

Docker 网络是一种用于连接 Docker 容器的虚拟网络。这允许容器之间进行通信,同时也能与外部网络进行交互。

应用场景:

容器通信: 当你有多个容器需要相互通信时,可以将它们连接到同一个 Docker 网络。通过创建一个专用的网络,容器可以使用容器名称进行通信,而无需暴露真实的 IP 地址。

bash 复制代码
docker network create mynetwork
docker run --name container1 --network mynetwork myimage
docker run --name container2 --network mynetwork myimage

外部访问控制: 通过将容器连接到特定网络,你可以更好地控制哪些容器可以与外部进行通信,哪些容器被隔离在内部网络中。

bash 复制代码
docker network create internal
docker network create external

# 内部容器
docker run --name internal-container --network internal internal-image

# 外部容器
docker run --name external-container --network external -p 8080:80 external-image

2.在宿主机上创建文件夹

sh 复制代码
# 创建Jenkins目录文件夹
mkdir -p /var/jenkins_home
# 设置权限
chmod 777 -R /var/jenkins_home

mkdir -p /certs/client
chmod 777 -R /certs/client

用于卷挂载在容器中保留 Jenkins 数据,以便在容器重新启动时保留 Jenkins 的配置和状态。

通过将宿主机上的目录挂载到容器中,容器内的数据可以持久化存储在主机上。

这种做法对于一些需要保存状态的应用程序(比如数据库、持久化存储配置的应用程序等)非常常见,因为容器本身是临时的,挂载卷可以确保数据的持久性和在容器之间的共享。

--volume /var/jenkins_home:/var/jenkins_home 选项在你的 Docker 命令中表示将主机上的 /var/jenkins_home 目录挂载到容器内部/var/jenkins_home 目录,用于存储 Jenkins 的数据和配置。

3.实现在Jenkins Docker节点内执行Docker命令

sh 复制代码
# 拉取 Docker in Docker 镜像
docker image pull docker:dind
# 启动一个名为 jenkins-docker 的容器,该容器包含 Docker in Docker。
# 该容器与 Jenkins 容器共享网络,并设置了一些环境变量和卷,以便在 Jenkins 中连接到 Docker。
docker run --name jenkins-docker --rm --detach \
  --privileged --network jenkins --network-alias docker \
  --env DOCKER_TLS_CERTDIR=/certs \
  --volume /certs/client:/certs/client \
  --volume /var/jenkins_home:/var/jenkins_home \
  --publish 2376:2376 \
  docker:dind --storage-driver overlay2
  • --name jenkins-docker:给容器指定一个名称为 jenkins-docker
  • --rm:当容器停止运行时,自动删除容器。
  • --detach:在后台运行容器。
  • --privileged:授予容器特权,允许它在其中运行 Docker 容器。
  • --network jenkins:将容器连接到名为 jenkins 的 Docker 网络。
  • --network-alias docker:为容器指定一个网络别名为 docker,这样 Jenkins 容器可以使用这个别名连接到这个容器。
  • --env DOCKER_TLS_CERTDIR=/certs:设置容器中 Docker 引擎 TLS 证书的目录。
  • --volume /certs/client:/certs/client:将主机上的目录 /certs/client 挂载到容器内部的 /certs/client,用于存储 TLS 证书。
  • --volume /var/jenkins_home:/var/jenkins_home:将主机上的目录 /var/jenkins_home 挂载到容器内部的 /var/jenkins_home,用于持久化存储 Jenkins 的数据和配置。
  • --publish 2376:2376:将容器的 2376 端口映射到主机的 2376 端口,这是 Docker 守护进程的 TLS 端口。
  • docker:dind:使用的 Docker in Docker 镜像。
  • --storage-driver overlay2:指定 Docker 存储驱动为 overlay2。

docker:dind 是 Docker in Docker(DinD)的缩写,它是一个特殊的 Docker 镜像,设计用于在容器内运行 Docker 守护进程。这允许你在容器内部执行 Docker 命令,并且该容器本身具有运行其他容器的能力,实现了在容器中运行 Docker 的特性。

Docker in Docker 镜像通常用于 CI/CD(持续集成/持续部署)流水线中,其中构建和测试需要在 Docker 容器中进行。通过在容器中运行 Docker 引擎,你可以方便地创建、启动和管理其他容器,实现更灵活的构建和测试环境。

4.定制官方Jenkins Docker 镜像

创建一个Dockerfile文件

更改了阿里云源的版本

dockerfile 复制代码
# 使用了 jenkins/jenkins:2.440.1-jdk17 作为基础镜像
# 这是 Jenkins 官方提供的基于 OpenJDK 17 的 Jenkins 镜像。FROM 关键字用于指定基础镜像。
FROM jenkins/jenkins:2.440.1-jdk17
# 切换用户到 root:
USER root

# 安装 lsb-release(Debian 系统中的包)和 curl
# 使用 apt-get 更新包列表并安装 lsb-release。
RUN apt-get update && apt-get install -y lsb-release curl

# 下载 Docker GPG 密钥
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc https://mirrors.aliyun.com/docker-ce/linux/debian/gpg

# 设置 Docker APT 源:
# 使用阿里云的源,可以根据需要选择其他镜像源
RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.asc] https://mirrors.aliyun.com/docker-ce/linux/debian $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list

# 安装 Docker CLI
RUN apt-get update && apt-get install -y docker-ce-cli

#将用户切换回 jenkins 用户
# USER jenkins
# 安装 Jenkins 插件
# 使用 jenkins-plugin-cli 工具安装 Jenkins 插件,包括 "blueocean" 和 "docker-workflow"
# RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"

blueocean docker-workflow 这2个插件也可以启动jenkins后再安装。

这是官网命令

shell 复制代码
FROM jenkins/jenkins:2.440.1-jdk17
USER root
RUN apt-get update && apt-get install -y lsb-release
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
  https://download.docker.com/linux/debian/gpg
RUN echo "deb [arch=$(dpkg --print-architecture) \
  signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
  https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"

构建docker镜像

从该 Dockerfile 构建一个新的 docker镜像,镜像名称为"laker-jenkins":

sh 复制代码
docker build -t laker-jenkins .

5.运行定制镜像

sh 复制代码
docker run --name jenkins-laker-docker --detach \
  --network jenkins --env DOCKER_HOST=tcp://docker:2376 \
  --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 \
  --publish 8080:8080 --publish 50000:50000 \
  --volume /var/jenkins_home:/var/jenkins_home \
  --volume /certs/client:/certs/client:ro \
  laker-jenkins

--name jenkins-laker-docker

  • 指定容器的名称为 jenkins-laker-docker

--detach

  • 让容器在后台运行(detached 模式)。

--network jenkins

  • 将容器连接到名为 jenkins 的 Docker 网络。这是为了确保 Jenkins 容器和之前提到的 Docker in Docker 容器可以相互通信。

--env DOCKER_HOST=tcp://docker:2376

  • 设置环境变量 DOCKER_HOST,指定 Docker 客户端连接的 Docker 守护进程地址。这里使用了 Docker in Docker 容器的别名 docker 和端口 2376

--env DOCKER_CERT_PATH=/certs/client

  • 设置环境变量 DOCKER_CERT_PATH,指定 Docker TLS 证书的路径。

--env DOCKER_TLS_VERIFY=1

  • 设置环境变量 DOCKER_TLS_VERIFY,启用 Docker 客户端的 TLS 验证。

--publish 8080:8080

  • 将 Jenkins 容器的 8080 端口映射到主机的 8080 端口,使得可以通过主机的 8080 端口访问 Jenkins Web UI。

--publish 50000:50000

  • 将 Jenkins 容器的 50000 端口映射到主机的 50000 端口,这是 Jenkins 使用的 Agent 的通信端口。

--volume /var/jenkins_home:/var/jenkins_home

  • 将主机上的 /var/jenkins_home 目录挂载到容器内部的 /var/jenkins_home,用于持久化存储 Jenkins 数据和配置。

--volume /certs/client:/certs/client:ro

  • 将主机上的 /certs/client 目录挂载到容器内部的 /certs/client,用于存储 Docker TLS 证书。:ro 表示挂载为只读,以增加安全性。

laker-jenkins

  • 指定要运行的镜像,这里假设你之前使用 docker build 命令构建了一个名为 laker-jenkins 的 Jenkins 镜像。

查看docker容器日志,看是否启动成功。

复制代码
docker ps -a
docker logs jenkins-laker-docker

6.浏览器访问Jenkins

在浏览器访问:http://localhost:8080

7.获取管理员密码

查看initialAdminPassword文件,把密码输入登录中的密码即可,开始使用。

sh 复制代码
cat /var/jenkins_home/secrets/initialAdminPassword

登录进去后,安装插件这里先别选,先配置插件镜像加速,否则下载太慢。

8.配置插件镜像加速

sh 复制代码
vi /var/jenkins_home/hudson.model.UpdateCenter.xml

将 url 修改为 清华大学官方镜像:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

保存后,重启jenkins-laker-docker实例。

sh 复制代码
docker restart jenkins-laker-docker

9.新建Jenkins任务

在企业环境中,常见的 Jenkins 任务类型取决于具体的 CI/CD需求和项目特点,请根据你的具体情况选择最适合的类型:

自由风格项目(Freestyle Project):

  • 适用场景:
    • 适用于灵活性较高的项目,例如构建简单的代码库、运行测试、打包发布等。
    • 对于小型项目或需要手动触发的任务,自由风格项目可能是更简单的选择。

流水线项目(Pipeline):

  • 适用场景:
    • 复杂的 CI/CD 流程,包括构建、测试、部署等多个阶段。
    • 需要可维护、可版本控制的构建脚本。
  • 优势:
    • 可以将整个 CI/CD 流程定义为代码,易于版本控制和维护。
    • 支持流程中断、并行执行等高级特性。

多分支流水线(Multibranch Pipeline):

  • 适用场景:
    • 项目有多个分支,每个分支可能有不同的构建和部署要求。
    • 自动化创建和管理分支对应的流水线。
  • 优势:
    • 自动创建分支对应的流水线,减少手动配置工作。

GitHub 分支源(GitHub Branch Source):

  • 适用场景:
    • 项目使用 GitHub 作为版本控制,并有多个分支。
    • 想要通过 GitHub 仓库中的事件自动触发 Jenkins 流水线。
  • 优势:
    • 自动创建和管理 GitHub 仓库中的分支对应的流水线。

构建其他项目(Build Other Projects):

  • 适用场景:
    • 有多个项目之间存在依赖关系,构建完成一个项目后需要触发其他项目的构建。
    • 设置项目间的构建顺序和依赖关系。
  • 优势:
    • 管理项目之间的依赖关系,实现自动触发构建。

多配置项目(Multi-configuration Project):

  • 适用场景:
    • 需要在不同的配置下进行构建和测试。
    • 例如,支持多个操作系统、不同版本的依赖库等。
  • 优势:
    • 支持并行构建多个配置,提高构建效率。

构建 Maven 项目(Maven Project):

  • 适用场景:
    • 项目使用 Maven 进行构建。
  • 优势:
    • 集成 Maven 构建的相关功能,方便 Maven 项目的构建和部署。

以上类型并非互斥,可以根据实际需求组合使用。例如,可以在主项目中使用多分支流水线,同时使用构建其他项目触发子项目的构建。在选择时,考虑项目结构、团队熟悉度、自动触发需求等方面。

流水线任务

先根据用Docker Compose启动依赖的Mysql Redis章节,安装相关依赖中间件。

这里以比较常用的流水线任务举例。例子内容为部署https://gitee.com/lakernote/easy-admin开源项目。

groovy 复制代码
pipeline {
    agent any
    stages {
        stage('Back-end') {
            agent {
                docker { 
                    image 'maven:3.9.6-eclipse-temurin-8-alpine' 
                    args '-v $HOME/.m2:/root/.m2'
                }
            }
            steps {
                 // 从Gitee仓库获取代码
                git 'https://gitee.com/lakernote/easy-admin.git'  
                sh 'mvn --version'
                sh 'mvn clean install'
                 // 将构建产物存储到一个命名为 'backend-build' 的存储区域
                stash name: 'backend-build', includes: 'target/*.jar,Dockerfile,web/**/*'
            }
        }
        
       stage('Start') {
   		   // 定义并使用 JDK 工具
   		  	// tools {
        		// 前提在jenkins全局配置中 定义 JDK 工具的名称和版本
        		//	jdk 'jdk8'

        		// 或者使用默认的 JDK
        		// jdk 'default'
           	//}
           steps {
                // 恢复构建产物,路径相对于工作目录
                unstash 'backend-build'
                
                sh "echo 'Running Java version'"
                sh "java -version"
                // 执行 Java 项目的 JAR 文件
                sh "nohup java -jar target/easyAdmin.jar &"
            }        
        }
        
        stage('Front-end') {
            agent {
                docker { image 'node:20.11.1-alpine3.19' }
            }
            steps {
                sh 'node --version'
            }
        }
    }
}
  • 镜像
    • maven:3.9.6-eclipse-temurin-17-alpine JDK17
    • maven:3.9.6-eclipse-temurin-8-alpine JDK8

扩展:用Docker Compose启动依赖的Mysql Redis

在 Linux 上安装 Docker Compose

下载 Docker Compose:

bash 复制代码
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

授予执行权限:

bash 复制代码
sudo chmod +x /usr/local/bin/docker-compose

验证安装:

bash 复制代码
docker-compose --version

如果你已经安装好了 Docker Compose,但在执行时遇到问题,可能有一些原因导致。以下是一些建议:

确认路径是否在系统的 PATH 中: 确保 /usr/local/bin 在你的系统 PATH 环境变量中。这样,系统才能找到 docker-compose 命令。你可以运行以下命令检查:

bash 复制代码
echo $PATH

如果没有包含 /usr/local/bin,可以将其添加到 PATH 中。在你的 shell 配置文件(例如 ~/.bashrc~/.zshrc)中添加以下行:

bash 复制代码
export PATH="/usr/local/bin:$PATH"

然后重新加载配置文件或打开一个新的终端窗口。

docker-compose.yml

使用Docker Compose来定义和管理多个容器的服务,包括MySQL、Redis等,并确保它们在同一个网络中以便相互通信。

docker-compose.yml

yaml 复制代码
version: '3'

services:
  mysql:
    image: mysql:5.7
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      MYSQL_DATABASE: "laker"
      MYSQL_USER: "laker"
      MYSQL_PASSWORD: "123456"
    ports:
      - "3306:3306"
    networks:
      - jenkins # 上面定义的网络
    volumes:
      - /mysql-data:/var/lib/mysql # 持久化存储到宿主机
      
  redis:
    image: redis:latest
    container_name: redis
    ports:
      - "6379:6379"
    networks:
      - jenkins # 上面定义的网络
      
networks:
  jenkins:
    external: true # 声明了 jenkins 网络是一个外部网络,也就是已经存在的

mkdir -p /mysql-data

chmod 777 -R /mysql-data

运行以下命令启动 Docker Compose 服务:

bash 复制代码
docker-compose up -d
相关推荐
极限实验室6 小时前
使用 Docker Compose 简化 INFINI Console 与 Easysearch 环境搭建
数据库·docker·devops
牧天白衣.7 小时前
Docker相关内容
docker·容器·eureka
2401_836836598 小时前
k8s配置管理
云原生·容器·kubernetes
一切顺势而行8 小时前
k8s 使用docker 安装教程
docker·容器·kubernetes
澜兮子8 小时前
k8s-服务发布基础
云原生·容器·kubernetes
Andy杨8 小时前
20250707-2-第二章:Kubernetes 核心概念-K8s集群架构,生产部署K8s两_笔记
docker·容器
小安运维日记8 小时前
CKS认证 | Day4 最小化微服务漏洞
安全·docker·微服务·云原生·容器·kubernetes
2401_836836598 小时前
k8s服务发布进阶
云原生·容器·kubernetes
bigFish啦啦啦10 小时前
docker proxy
docker
果子⌂11 小时前
容器技术入门之Docker环境部署
linux·运维·docker