文章目录
- 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
JDK17maven: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