利用Docker快速安装Jenkins

文章目录

    • 1.在Docker中创建桥接网络
    • 2.在宿主机上创建文件夹
    • 3.实现在Jenkins Docker节点内执行Docker命令
    • 4.定制官方Jenkins Docker 镜像
      • 创建一个Dockerfile文件
      • 构建docker镜像
    • 5.运行定制镜像
    • 6.浏览器访问Jenkins
    • 7.获取管理员密码
    • 8.配置插件镜像加速
    • 9.新建Jenkins任务
      • 流水线任务
    • 扩展:用Docker Compose启动依赖的Mysql Redis
      • 在 Linux 上安装 Docker Compose
      • docker-compose.yml

前提自己先安装好Docker

CentOS安装Docker以及常用命令

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

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

  • Ubuntu上Jenkins自动化部署Gitee上SpringBoot项目
  • Ubuntu上Jenkins自动化部署Gitee上VUE项目
  • Jenkins自动化部署之流水线模式部署

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

1.在Docker中创建桥接网络

docker network create jenkins

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

应用场景:

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

docker network create mynetwork
docker run --name container1 --network mynetwork myimage
docker run --name container2 --network mynetwork myimage

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

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.在宿主机上创建文件夹

# 创建Jenkins目录文件夹
mkdir -p /var/jenkins_home
# 设置权限
chmod 777 -R /var/jenkins_homemkdir -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命令

# 拉取 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文件

更改了阿里云源的版本

# 使用了 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后再安装。

这是官网命令

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”:

docker build -t laker-jenkins .

5.运行定制镜像

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文件,把密码输入登录中的密码即可,开始使用。

cat /var/jenkins_home/secrets/initialAdminPassword

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

8.配置插件镜像加速

vi /var/jenkins_home/hudson.model.UpdateCenter.xml

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

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

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开源项目。

pipeline {agent anystages {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:

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

授予执行权限:

sudo chmod +x /usr/local/bin/docker-compose

验证安装:

docker-compose --version

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

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

echo $PATH

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

export PATH="/usr/local/bin:$PATH"

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

docker-compose.yml

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

docker-compose.yml

version: '3'services:mysql:image: mysql:5.7container_name: mysqlenvironment: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:latestcontainer_name: redisports:- "6379:6379"networks:- jenkins # 上面定义的网络networks:jenkins:external: true # 声明了 jenkins 网络是一个外部网络,也就是已经存在的

mkdir -p /mysql-data
chmod 777 -R /mysql-data

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

docker-compose up -d

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IM聊天交友APP源码IM带音视频Uniapp即时通讯安卓苹果APP修改二开

前端开发语言:VUE( 安卓,IOS,WEB为一套前端代码) 服务器端开发语言: PHPWebSocket 数据库:MySql mongodb 前端打包工具:Hbuilder 服务器搭建工具:宝塔 Xshell 短信接口: 支持…

【Django】聚合查询——连接和聚合

还是以下面的模型为例进行讨论,给出示例代码和示例结果 from django.db import modelsclass Author(models.Model):name models.CharField(max_length100)age models.IntegerField()class Publisher(models.Model):name models.CharField(max_length300)class B…

虚拟机 CentOS 7 安装

1. 新建虚拟机 2. 选择ISO映像文件 3. 开启虚拟机 进入后回车 等待至此页面,进行配置 软件选择 图形化界面(可选择是否安装) 系统分区 按需求分配大小 4. 开始安装 配置完毕后开始安装 ROOT密码 创建用户 安装完重启即可 5. 启动虚拟机 输入刚…

ARM-v7 GCC 环境下的大小端转换实现

1.前言 什么是大小端转换?为什么叫大小端转换? Jonathan Swift的《格列佛游记》中记载,有两国因为剥鸡蛋的方式不同,即一国要求将熟鸡蛋的较大的一端(大端,big endian)敲碎然后剥壳,…

在CentOS上使用Gunicorn和systemd完整部署Flask应用:详细指南

在现代Web开发中,选择合适的技术栈对于确保应用的稳定性、性能和易于管理至关重要。本篇博客将深入探讨如何在CentOS系统上利用Flask、Gunicorn和systemd的强大组合来部署Web应用。这个全面的流程不仅包括应用的创建和运行,还涉及到如何利用系统服务来管理应用的生命周期,确…

jmeter 业务顺序执行(串行、并行)

简介 当我们在应对某些性能需求时,比如要求测试单个业务串行或并行的响应时间。如果直接设定线程组业务的话,jmeter 会将某个线程组下面的全部业务一起执行,在这种情况下的响应时间是不符合要求的,所以需要勾选指定参数或设置其他…

器件选型【电容,电阻篇】

电阻篇: 一句话先做总结:电阻的选型主要考虑额定电压和过流能力(基于封装大小) 电阻封装规格越大功率越大。但其功率也与温度有关,如果温度超过 70℃,其额定功率是会下降的。并且,R01005 和 R0…

VUE3项目学习系列--element-plus集成(三)

1、安装依赖 Element-plus官网:快速开始 | Element Plus (element-plus.org) pnpm i element-plus 在项目main.ts中引入element-plus: import { createApp } from "vue"; import App from "./App.vue"; // 从Element官网上参考,…

数据挖掘实战 —— 抖音用户浏览行为数据分析与挖掘(代码部分)

文章: 数据挖掘实战 —— 抖音用户浏览行为数据分析与挖掘(一) 数据挖掘实战 —— 抖音用户浏览行为数据分析与挖掘(二) 数据挖掘实战 —— 抖音用户浏览行为数据分析与挖掘(总) 代码: 数据挖掘实战 —— 抖音用户浏览行为数据分析与挖掘(代码…

代码随想录Day37:单调递增的数字、监控二叉树

单调递增的数字 思路:将数字转换为字符串进行操作;从后往前处理; class Solution { public:int monotoneIncreasingDigits(int n) {string strNum to_string(n);int flag strNum.size();for(int i strNum.size() - 1; i > 0; i--){if…

python识别并控制操作已打开的浏览器进行自动化测试

前提:已安装python和selenium 一、将浏览器以debugger模式打开 打开方法: 1.右击浏览器,选择属性: 2.在目标中加上 --remote-debugging-port9222 --user-data-dir"C:\selenum\AutomationProfile" 二、识别代码 from…

MYSQL的sql性能优化技巧

在编写 SQL 查询时,有一些技巧可以帮助你提高性能、简化查询并避免常见错误。以下是一些 MySQL 的写 SQL 技巧: 1. 使用索引 确保经常用于搜索、排序和连接的列上有索引。避免在索引列上使用函数或表达式,这会导致索引失效。使用 EXPLAIN 关…

Java基础(5) 泛型 日期和时间 线程 File-输入流

泛型 java的泛型有点像ts的泛型 public class ArrayList<T> {private T[] array;private int size;public void add(T e) {...}public void remove(int index) {...}public T get(int index) {...} }// 创建可以存储String的ArrayList: ArrayList<String> strLis…

codeTop01:LRU (最近最少使用) 缓存的实现

问题 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; ● LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 ● int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;…

opencart3 添加速卖通商品脚本

非爬虫&#xff0c;只能把速卖通商品信息拿下来解析插入到自己的项目里。 刚接触opencart3没多久&#xff0c;有一些新项目需要添加商品&#xff0c;每次手动从速卖通复制信息又很慢&#xff0c;就自己写了一个脚本。 思路&#xff1a;速卖通商品详情页有一段数据包含了几乎所…

初识Hive

官网地址为&#xff1a; Design - Apache Hive - Apache Software Foundation 一、架构 先来看下官网给的图&#xff1a; 图上显示了Hive的主要组件及其与Hadoop的交互。Hive的主要组件有&#xff1a; UI&#xff1a; 用户向系统提交查询和其他操作的用户界面。截至2011年&…

c++树状数组(超多例题讲解)适合有相应基础的

树状数组&#xff08;Fenwick Tree&#xff09;是一种用于高效计算前缀和的数据结构&#xff0c;具有较小的内存占用和较快的查询、更新操作。它广泛应用于解决一维数组的区间查询问题。 树状数组的原理基于二进制的思想。假设有一个长度为n的数组A&#xff0c;树状数组就是用…

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的按键扫描、数码管显示按键值、显示按键LED应用

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的按键扫描、数码管显示按键值、显示按键LED应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍TM1638键盘…

C# WinForm AndtUI第三方库 Tree控件使用记录

环境搭建 1.在NuGet中搜索AndtUI并下载至C# .NetFramework WinForm项目。 2.添加Tree控件至窗体。 使用方法集合 1.添加节点、子节点 using AntdUI; private void UpdateTreeView() {Tree tvwTestnew Tree();TreeItem rootTreeItem;TreeItem subTreeItem;Dictionary<str…

高级软件开发知识点

流程 算法题简历上项目用到技术、流程、遇到问题HR 准备 常考的题型和回答思路刷100算法题&#xff0c;理解其思想&#xff0c;不要死记最近一家公司所负责的业务和项目&#xff1a; 项目背景、演进之路&#xff0c;有哪个阶段&#xff0c;每个阶段主要做什么项目中技术选型…