前提自己先安装好Docker
官方文档:https://www.jenkins.io/doc/book/installing/docker/
将之前的3篇内容来哦快速安装整合
使用Docker Hub 存储库中推荐的官方jenkins/jenkins
镜像。此映像包含Jenkins 当前的长期支持 (LTS) 版本,该版本已做好生产准备。但是,该映像不包含 Docker CLI,并且未与常用的 Blue Ocean 插件及其功能捆绑在一起。
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
# 创建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 的数据和配置。
# 拉取 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 引擎,你可以方便地创建、启动和管理其他容器,实现更灵活的构建和测试环境。
更改了阿里云源的版本
# 使用了 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"
从该 Dockerfile 构建一个新的 docker镜像,镜像名称为“laker-jenkins”:
docker build -t laker-jenkins .
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
:
--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
:
--publish 50000:50000
:
--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
在浏览器访问:http://localhost:8080
查看initialAdminPassword文件,把密码输入登录中的密码即可,开始使用。
cat /var/jenkins_home/secrets/initialAdminPassword
登录进去后,安装插件这里先别选,先配置插件镜像加速,否则下载太慢。
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
在企业环境中,常见的 Jenkins 任务类型取决于具体的 CI/CD需求和项目特点,请根据你的具体情况选择最适合的类型:
自由风格项目(Freestyle Project):
流水线项目(Pipeline):
多分支流水线(Multibranch Pipeline):
GitHub 分支源(GitHub Branch Source):
构建其他项目(Build Other Projects):
多配置项目(Multi-configuration Project):
构建 Maven 项目(Maven Project):
以上类型并非互斥,可以根据实际需求组合使用。例如,可以在主项目中使用多分支流水线,同时使用构建其他项目触发子项目的构建。在选择时,考虑项目结构、团队熟悉度、自动触发需求等方面。
先根据用Docker Compose启动依赖的Mysql Redis章节,安装相关依赖中间件。
这里以比较常用的流水线任务举例。例子内容为部署https://gitee.com/lakernote/easy-admin
开源项目。
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
JDK17maven:3.9.6-eclipse-temurin-8-alpine
JDK8下载 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
- 1
如果没有包含
/usr/local/bin
,可以将其添加到PATH
中。在你的 shell 配置文件(例如~/.bashrc
或~/.zshrc
)中添加以下行:export PATH="/usr/local/bin:$PATH"
- 1
然后重新加载配置文件或打开一个新的终端窗口。
使用Docker Compose来定义和管理多个容器的服务,包括MySQL、Redis等,并确保它们在同一个网络中以便相互通信。
docker-compose.yml
:
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 服务:
docker-compose up -d