Jenkins——使用Docker部署Jenkins详解

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Jenkins——使用Docker部署Jenkins详解

前言

  • 系统版本Centos7.8 X64
  • Docker版本18.09+
  • 安装docker-compose
  • RSA格式的ssh密钥对一个,用来拉取gitlab代码和ssh到各个应用服务器上部署,可以使用ssh-keygen -t rsa来生成

步骤

Docker安装

  1. 安装Docker服务
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
  1. 启动Docker服务
systemctl start docker
systemctl enable docker
  1. 验证docker是否安装成功
docker run hello-world

  1. 安装Docker-composer服务
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. 授予执行权限
chmod +x /usr/local/bin/docker-compose
  1. 验证docker-composer是否安装成功
docker-compose --version

Jenkins安装

整体目录结构如下

app
└── data
    ├── deploy
    │   └── jenkins
    │       ├── config
    │       ├── docker-composer.yml
    │       └── Dockerfile
    └── jenkins
        ├── certs
        └── data

创建部署目录和数据目录

# 存放docker-compose相关配置文件
mkdir -p /app/data/deploy/jenkins 
# 存放Jenkins证书相关文件
mkdir -p /app/data/jenkins/certs 
# 存放Jenkins数据文件
mkdir -p /app/data/jenkins/data 
# 修改权限
cd /app/data
chmod 775 -R jenkins/
chown -R 1000:1000 jenkins/

创建相应文件配置

进入目录

cd /app/data/deploy/jenkins/

docker-composer.yml

version: "2"
services:
  jenkins-blueocean:
    build:
      context: .
    container_name: jenkins-blueocean
    network_mode: bridge
    ports:
      - 8088:8080
      # - 50000:50000
    environment:
    # - DOCKER_HOST=tcp://docker:2376
    # - DOCKER_CERT_PATH=/certs/client
    # - DOCKER_TLS_VERIFY=1
    - TZ=Asia/Shanghai
    - JENKINS_UC="https://mirrors.tuna.tsinghua.edu.cn/jenkins/"
    - JENKINS_UC_DOWNLOAD="https://mirrors.tuna.tsinghua.edu.cn/jenkins/"
    - JENKINS_OPTS="-Dhudson.model.UpdateCenter.updateCenterUrl=https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json"
    volumes:
    - /app/data/jenkins/certs:/certs/client:ro
    - /app/data/jenkins/data:/var/jenkins_home
    depends_on:
    - jenkins-docker
    links:
    - jenkins-docker:docker
  jenkins-docker:
    image: docker:19.03.14-dind
    container_name: jenkins-docker
    privileged: true
    network_mode: bridge
    command: --config-file /etc/docker/daemon.json
    ports:
    - 2376:2376
    environment:
    - DOCKER_TLS_CERTDIR=/certs
    volumes:
    - ./config/daemon.json:/etc/docker/daemon.json:ro
    - /app/data/jenkins/certs:/certs/client
    - /app/data/jenkins/data:/var/jenkins_home

Dockerfile

FROM jenkins/jenkins:2.263.1-lts-slim
USER root
COPY config/sources.list /etc/apt/sources.list
RUN apt-get update && apt-get install -y apt-transport-https \
       ca-certificates curl gnupg2 \
       software-properties-common \
       vim \
       rsync \
       tree \
       default-mysql-client
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN apt-key fingerprint 0EBFCD88
RUN add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/debian \
       $(lsb_release -cs) stable"
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
# RUN jenkins-plugin-cli --plugins blueocean:1.24.3

config配置

daemon.json

请将加速地址替换为自己的阿里云加速地址

{
  "registry-mirrors": [
    # 阿里云镜像加速地址,请修改为自己的阿里云加速地址
    "https://xxxx.mirror.aliyuncs.com"
  ],
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "live-restore": true
}
sources.list
deb http://mirrors.aliyun.com/debian/ buster main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib
deb http://mirrors.aliyun.com/debian-security buster/updates main
deb-src http://mirrors.aliyun.com/debian-security buster/updates main
deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib

构建启动Jenkins镜像

#构建镜像
docker-compose -f docker-composer.yml build
#启动服务
docker-compose -f docker-composer.yml up -d
#查看日志获取首次登录密码
docker logs -f jenkins-blueocean

Jenkins初始化

Jenkins完全启动时会打印一条Jenkins is fully up and running日志,看到此日志就可以开始配置Jenkins了。

登录Jenkins

输入刚才在日志中得到的密码来激活Jenkins

安装社区推荐插件

等待插件自动安装完成,若因网络问题安装失败则重试即可

设置admin账户和密码

邮箱可以随便填写

设置Jenkins URL

URL会被用来做Webhook等用途等地址

部署完成

安装Jenkins插件

Jenkins自动化部署依赖一系列插件的协作,所以我们要提前安装好。

配置升级站点

Manage Jenkins->Manage Plugins->高级

#开源镜像
https://mirrors.huaweicloud.com/jenkins/updates/update-center.json
#开源地址
https://jenkins-zh.cn/tutorial/management/plugin/update-center/

配置插件

可选插件下搜索以下插件并安装

Blue Ocean (可选,如果想用Blue Ocean视图的话)
SSH Pipeline Steps
Pipeline Utility Steps
NodeJS
ansiColor

重启Jenkins

插件安装完成的时候重启Jenkins

配置maven工具

安装maven
# ssh进入Jenkins服务器
# 进入Jenkins容器
docker exec -it jenkins-blueocean bash
# 进入用户主目录,用户主目录中的内容被挂载到数据盘上,可以把安装程序放心放入其中
cd ~
mkdir -p tools && cd tools
# 下载安装包
curl https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip -o apache-maven-3.6.3-bin.zip
# 解压
unzip apache-maven-3.6.3-bin.zip
# 删除安装包
rm apache-maven-3.6.3-bin.zip
# 配置maven settings.xml
cd ~
mkdir -p .m2
# 将项目中maven配置文件settings.xml文件内容写入.m2/settings.xml文件中
配置maven

在Jenkins Server Web界面上系统管理->全局工具配置->Maven->新增maven安装

  • 名称为M3(名称很重要,我们的流水线配置中需要使用这个名字)
  • 勾选掉自动安装复选框
  • 并设置MAVEN_HOME地址为/var/jenkins_home/tools/apache-maven-3.6.3
  • 点击保存

配置NodeJS

上述安装Jenkins插件过程中已经安装了NodeJS插件,因为NodeJS有很多版本,所以我们需要手动配置NodeJS安装,这样才可以在流水线中使用它。

在Jenkins Server Web界面上系统管理->全局工具配置->NodeJS->新增NodeJS安装

  • 别名设置为NODEJS10(名称很重要,我们的流水线配置中需要使用这个名字)
  • 选择版本NodeJS10.23.0(可以根据需要选择)
  • 点击保存

配置Jenkins

配置Jenkins凭据

Jenkins提供凭据管理的功能来帮助我们存放涉密账号密码、私钥等信息,在配置Pipeline前我们需要创建好相关凭据。

  • 生成ssh密钥对
# ssh进入Jenkins服务器
# 进入Jenkins容器
docker exec -it jenkins-blueocean bash
# 进入主目录
cd ~
# 生成RSA密钥对
ssh-keygen -m PEM -t rsa

在Jenkins界面上系统管理->管理凭据`中创建以下全局ssh密钥对凭据,填写好ID、描述、用户名和私钥信息

  • jenkins-ssh-deploy 用于ssh部署,用户名填写目标运维账号,如root

  • jenkins-ssh-gitlab 用于从gitlab拉代码,用户名填写jenkins

  • gitlab上jenkins用户下添加此ssh key

为了Jenkins能正常执行部署任务,各个应用服务器运维账号要信任上述生成的密钥对。

可参考该文章[https://www.cnblogs.com/wangyang0210/p/14361954.html]

创建共享类库

Jenkins Pipeline支持共享类库来减少冗余代码,我们通过这种方法来复用代码并且管理部署相关配置。

系统管理->系统配置->Global Pipeline Libraries中点击新增来创建共享类库,其基本信息如下:

安全配置

系统管理->全局安全配置->项目矩阵授权策略

根据自己需求进行授权就好了

流水线配置

创建流水线

新建任务->输入名称->流水线->确定

配置流水线

  1. general->丢弃旧的构建

  1. 参数化构建过程->字符参数

  1. 流水线
@Library('pipeline-deploy-library') _
properties([parameters([string(defaultValue: 'pa-dev', description: '部署代码分支', name: 'git_branch', trim: true)])])
node {
    ansiColor('xterm') {
        deployProject('pa_dev.yml', 'admin-web', params)
    }
}

流水线需要依赖响应的共享库的,这个是需要开发的,这里就不详说了

报错

构建报错

这里只是做一个记录,上方的步骤均已是修改为正确的步骤。

ERROR: 
        Can't find a suitable configuration file in this directory or any
        parent. Are you in the right directory?
        Supported filenames: docker-compose.yml, docker-compose.yaml
# 解决错误
1. docker服务没有启动
2. 使用-f指定配置文件

启动容器报错

[root@localhost jenkins]# docker logs -f jenkins-blueocean
touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
# 解决错误
1. 目录权限错误(chown -R 1000:1000 <本地映射目录>)

学无止境,谦卑而行.

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3天前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
140 91
|
4天前
|
存储 NoSQL Redis
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
|
19天前
|
存储 关系型数据库 MySQL
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
|
11天前
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
71 44
|
1月前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
58 23
|
23天前
|
SQL Java Maven
docker部署apollo
docker部署apollo步骤
|
1月前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
49 22
|
1月前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
66 25
|
2月前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
96 8
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
1月前
|
SQL 关系型数据库 MySQL
docker-compose部署mysql8
使用docker-compose容器化部署mysql8