找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 656|回复: 3

Centos / Docker / Nginx / Node / Jenkins 操作

[复制链接]

35

主题

9

回帖

214

积分

中级会员

积分
214
发表于 2022-2-25 13:53:54 | 显示全部楼层 |阅读模式
本帖最后由 20000 于 2022-2-25 14:08 编辑

ssh -p 端口 用户名@服务器IP
yum 切换为阿里源
cd /etc/yum.repos.d/
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
# 重新生成缓存--查看执行结果,如果有aliyun 字样就算成功
yum makecache
# 检查端口被哪个进程占用
netstat -lnp|grep 88   #88请换为你需要的端口,如:80
执行netstat -lnp|grep 端口号之后会打印出被占用的进程及其编号
查看当前 Centos 操作系统发行版信息
cat /etc/redhat-release=====================
安装与配置 Docker
在开始安装之前,需要安装 device-mapper-persistent-data 和 lvm2 两个依赖。
device-mapper-persistent-data 是 Linux 下的一个存储驱动, Linux 上的高级存储技术。
Lvm的作用则是创建逻辑磁盘分区。这里我们使用 CentOS 的 Yum 包管理器安装两个依赖:
yum install -y yum-utils device-mapper-persistent-data lvm2
依赖安装完毕后,我们将阿里云的 Docker 镜像源添加进去。可以加速 Docker 的安装。

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce -y
安装完毕,我们就可以使用 systemctl 启动来启动 Docker 了。systemctl 是 Linux的进程管理服务命令,他可以帮助我们启动 docker
systemctl start docker
systemctl enable docker
接着执行一下 docker -v,这条命令可以用来查看 Docker 安装的版本信息。当然也可以帮助我们查看 docker 安装状态。如果正常展示版本信息,代表 Docker 已经安装成功。
docker -v
设置开机启动
chkconfig docker on
其他
显示所有容器
docker ps
显示本地镜像列表
docker images
删除本地一个或多个镜像
docker rmi imageID
容器的启动/关闭/重启
docker stop containerID
docker start containerID
docker restart  containerID
删除一个或多个容器
docker rm containerID

配置阿里云镜像源
在 Docker 安装完毕后,之后我们去拉取 docker 镜像时,一般默认会去 docker 官方源拉取镜像。但是国内出海网速实在是太慢,所以选择我们更换为阿里云镜像仓库源进行镜像下载加速。
登录阿里云官网,打开 阿里云容器镜像服务。点击左侧菜单最下面的镜像加速器 ,选择 CentOS (如下图)。按照官网的提示执行命令,即可更换 docker 镜像源地址。
Docker 内配置 Nginx 方式一(推荐)
docker container run -d -p 4030:80 --rm --name mynginx nginx
上面命令的各个参数含义如下。
-d:在后台运行
-p :容器的 80 端口映射到 127.0.0.1:4030
--rm:容器停止运行后,自动删除容器文件
--name:容器的名字为 mynginx
末尾的nginx:表示根据 nginx 镜像运行容器。
如果没有报错,就可以打开浏览器访问 IP:4030 了。正常情况下,显示 Nginx 的欢迎页。
然后,把这个容器终止,由于--rm参数的作用,容器文件会自动删除。
docker container stop mynginx
Docker 内配置 Nginx 方式二
下载一个官方的 Nginx 镜像到本地
docker pull nginx
下载好的镜像就会出现在镜像列表里
docker images
运行容器
docker run --name=nginx -d -p 4030:80 nginx

上面命令的解释如下:
--name:设置容器的名称;
-d:表示在后台运行容器;
-p:指定端口映射。4030是宿主机的端口,80是 Nginx 容器内部的端口;
末尾的nginx:表示根据 nginx 镜像运行容器。
然后在浏览器里面访问 http://47.93.242.155:4030/

给 Docker 内的 Nginx 配置反向代理
要修改 Nginx 的配置文件,首先需要进入 Nginx 容器里面,使用下面的命令进入容器里面
docker exec -it nginx /bin/bash
上面命令的解释说明:
-it:表示分配一个伪终端。
nginx:表示容器的名称,这里也可以使用容器 ID。
/bin/bash:表示对容器执行 bash 操作。
我们使用ls查看一下文件结构,发现里面其实就是一个 Linux 操作系统。
再查看一下详细的操作系统发行版信息
cat /etc/issue

可以发现是一个Debian系统
Debian系统
顺便介绍一些 Debian系统的基本操作
# 首先需要更新一下
apt-get update
# 安装vim
apt-get install vim

修改为清华源镜像
参考Debian 镜像使用帮助[10]
如果遇到无法拉取 https 源的情况,请先使用 http 源并安装:
sudo apt install apt-transport-https ca-certificates
查看 Debian 版本,以便选择对应的镜像源
cat /etc/os-release
修改镜像文件
vi /etc/apt/sources.list
修改内容如下
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
查看所有的容器信息,能获取容器的 id,如下图
docker ps -a
在服务器终端把资源文件传递给 docker下的nginx容器
docker cp /data/cert 6ba3901beac9:/data/cert
保存容器
然后执行如下命令,保存镜像:
docker commit -m="备注" 你的CONTAINER_ID 你的IMAGE
请自行将 -m 后面的信息改成自己的容器的信息



















回复

使用道具 举报

35

主题

9

回帖

214

积分

中级会员

积分
214
 楼主| 发表于 2022-2-25 14:11:15 | 显示全部楼层
本帖最后由 20000 于 2022-2-25 14:26 编辑

Centos 下安装 Jenkins
Jenkins 是一个基于 Java 语言开发的持续构建工具平台,主要用于持续、自动的构建/测试你的软件和项目。它可以执行你预先设定好的设置和构建脚本,也可以和 Git 代码库做集成,实现自动触发和定时触发构建。
这部分内容大多内容是对从 0 到 1 实现一套 CI/CD 流程 掘金小册的搬运,更详细的内容可以学习这本小册安装 OpenJDK
因为 Jenkins 是 Java 编写的持续构建平台,所以安装 Java 必不可少。
在这里,我们选择安装开源的 openjdk 。在这我们直接使用 yum 包管理器安装 openjdk 即可。
yum install -y java
使用国内镜像加速安装 Jenkins
官方教程[12] 安装速度太慢。因此我们选择国内镜像安装
下面是(2021/04)的 jenkins LTS 版本: 可以在去 清华大学镜像站[13] 看一下,替换成最新的链接
下载 Jenkins 到/data 目录
cd  /data
wget https://mirrors.tuna.tsinghua.ed ... 77.2-1.1.noarch.rpm
sudo yum install jenkins-2.277.2-1.1.noarch.rpm
启动 Jenkins
Jenkins 安装后,会将启动命令注册到系统 Service 命令中。所以我们直接使用系统 service 命令启动 Jenkins 即可。
在这里,有三个命令可以使用,分别对应 启动 / 重启 / 停止 三个命令。
在这里,我们直接调用 service jenkins start 启动 Jenkins 即可
service jenkins start
# service jenkins restart restart 重启 Jenkins
# service jenkins restart stop 停止 Jenkins
服务启动后,访问 IP:8080 。如果能够看到以下界面,代表正在启动。Jenkins 第一次的启动时间一般比较长(视服务器性能而看)
初始化 Jenkins 配置
解锁 Jenkins
在 Jenkins 启动完成后,会自动跳转至这个界面(下方二图)。这是 Jenkins 的解锁界面,你需要输入存放在服务器的初始解锁密码才能进行下一步操作。
Jenkins 启动后,会生成一个初始密码。该密码在服务器的文件内存放,我们可以进入服务器查看密码内容,将密码填写在 Jenkins 的管理员密码输入框内:
cat /var/lib/jenkins/secrets/initialAdminPassword
点击 继续 按钮,解锁 Jenkins。
下载插件
解锁后就来到了插件下载页面,这一步要下载一些 Jenkins 的功能插件。因为 Jenkins 插件服务器在国外,所以速度不太理想。我们需要更换为清华大学的 Jenkins 插件源后,再安装插件,所以先不要点安装插件。
更换方法很简单。进入服务器,将 /var/lib/jenkins/updates/default.json 内的插件源地址替换成清华大学的源地址,将 google 替换为 baidu 即可。
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' /var/lib/jenkins/updates/default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' /var/lib/jenkins/updates/default.json
接着点击 安装推荐的插件 即可。稍等一会插件安装完毕
完成安装
插件安装完毕后,接着是注册管理员账号。

按照提示一路配置后,直到看到以下界面代表安装成功
测试安装
到这里,我们的 Jenkins 算是启动成功了。但是,我们还需要对 Jenkins 做一点点简单的配置,才可以让它可以构建 docker 镜像。
我们点击 Jenkins 首页 -> 左侧导航 -> 新建任务 -> Freestyle project(构建一个自由风格的软件项目)

新建完毕后,找到 构建 一项,选择 增加构建步骤,选择 执行 shell ,输入以下命令
docker -v
docker pull node:latest
该命令会去拉取一个 nodejs 稳定版的镜像,我们可以来测试 Docker 的可用性

保存后,我们点击左侧菜单的立即构建, Jenkins 就会开始构建。选择左侧历史记录第一项(最新的一项),点击控制台输出,查看构建日志。
执行后,我们发现提示无访问权限。这又是什么情况呢?这里就不得不提到 Linux 下的 Unix Socket 权限问题了
在 Linux 中, Unix socket 属于 root 用户,因此需要 root 权限才能访问
但是在 docker 中, docker 提供了一个 用户组 的概念。我们可以将执行 Shell 的用户添加到名称为 docker 的用户组,则可以正常执行 docker 命令。
而在 Jenkins 中执行的终端用户做 jenkins ,所以我们只需要将 jenkins 加入到 docker 用户组即可:
sudo groupadd docker          #新增docker用户组
sudo gpasswd -a jenkins docker  #将当前用户添加至docker用户组
newgrp docker                 #更新docker用户组
加入后,重启 Jenkins :
sudo service jenkins restart
重启 Jenkins 后,再次执行脚本。此时执行成功:

回过头来查看 docker 镜像
docker images
会发现多了一个docker的node镜像,这就是我们通过Jenkins 自动安装的

进入此docker镜像
docker run -it node /bin/bash
做一些配置(如何做参考前文的说明)
npm 配置淘宝源
全局安装 yarn 并配置配置淘宝源
npm config set registry https://registry.npm.taobao.org
npm get registry
# 可能提示已安装,就不用再安装了
npm install yarn -g
yarn config set registry http://registry.npm.taobao.org/
yarn config get registry
exit

回复

使用道具 举报

35

主题

9

回帖

214

积分

中级会员

积分
214
 楼主| 发表于 2022-2-25 14:26:55 | 显示全部楼层
本帖最后由 20000 于 2022-2-25 14:34 编辑

使用 SSH 协议集成 Git 仓库源
这一步,我们使用 Jenkins 集成外部 Git 仓库,实现对真实代码的拉取和构建。在这里,我们选用 Gitee(Github 太慢了) 作为我们的代码源。这里准备一个 UmiJS 项目来演示构建。
生成公钥私钥
首先,我们先来配置公钥和私钥。这是 Jenkins 访问 Git 私有库的常用认证方式。我们可以使用 ssh-keygen 命令即可生成公钥私钥。在本地机器执行生成即可。这里的邮箱可以换成你自己的邮箱:
ssh-keygen -t rsa -C "642178633@qq.com"
执行后,会遇到第一步骤:Enter file in which to save the key 。
这一步是询问你要将公钥私钥文件放在哪里。默认是放在 ~/.ssh/id_rsa 下,当然也可以选择输入你自己的路径。一路回车即可。
结束后,你会得到两个文件。分别是 id_rsa 和 id_rsa.pub。
其中,id_rsa 是私钥文件,id_rsa.pub 是对应的公钥文件。
我们需要在 Git 端配置公钥,在 Jenkins 端使用私钥与 Git 进行身份校验。
在 Gitee 配置公钥
在 Gitee 中,如果你要配置公钥有 2 种方式:仓库公钥 和 个人公钥。其中,如果配置了仓库公钥,则该公钥只能对配置的仓库进行访问。如果配置了个人公钥,则账号下所有私有仓库都可以访问。
这里我们就以配置个人公钥为例子。首先打开右上角的设置 ,点击下面的 设置 => SSH 公钥

在下方有个添加公钥,填入信息即可。
其中的标题为公钥标题,这里可以自定义标题;公钥则为刚才生成的 id_rsa.pub 文件。使用 cat 命令查看下文件内容,将内容填入输入框并保存。接着去 Jenkins 端配置私钥
cat ~/.ssh/id_rsa.pub

在 Jenkins 配置私钥
回到 Jenkins。在 Jenkins 中,私钥/密码 等认证信息都是以 凭证 的方式管理的,所以可以做到全局都通用。我们可以在配置任务时,来添加一个自己的凭证。点击项目的 配置,依次找到 源码管理 => Git => Repositories这里的 Repository URL 则是我们的仓库地址, SSH 地址格式为 git@gitee.com:xxx/xxx.git 。可以从仓库首页中的 克隆/下载 => SSH 中看到
重点是 Credentials 这一项,这里则是我们选择认证凭证的地方。我们可以点击右侧 添加 => Jenkins 按钮添加一条新的凭证认证信息。
点击后会打开一个弹窗,这是 Jenkins 添加凭证的弹窗。选择类型中的 SSH Username with private key 这一项。接着填写信息即可:
ID:这条认证凭证在 Jenkins 中的名称是什么
描述:描述信息
Username:用户名(邮箱)
Private Key:这里则是我们填写私钥的地方。
在命令行窗口,查看私钥文件内容,并复制它
cat ~/.ssh/id_rsa
点击 Add 按钮,将 xxx 私钥文件内所有文件内容全部复制过去(包含开头的 BEGIN OPENSSH PRIVATE KEY 和结尾的 END OPENSSH PRIVATE KEY)
接着点击添加按钮,保存凭证。

保存后,在 Credentials 下拉列表中选择你添加的凭证。
如果没有出现红色无权限提示,则代表身份校验成功,可以正常访问。

如果出现下图的问题,则说明服务器上没有安装 Git
安装结束后,刷新界面就正常了
yum -y install git
构建镜像
在我们将环境准备就绪后,就可以开始构建镜像了。不过,我们需要先准备个 DockerFile 才可以构建镜像。那什么是 DockerFile 呢?编写 Dockerfile
什么是 Dockerfile
Dockerfile 是一个 Docker 镜像的基础描述文件,里面描述了生成一个镜像所需要的执行步骤。我们也可以自定义一份 Dockerfile 来创建一个自己的镜像。
例如下面的步骤,使用 Dockerfile 可描述为:
基于 nginx:1.15 镜像做底座。
拷贝本地 html 文件夹内的文件,到镜像内 /etc/nginx/html 文件夹。
拷贝本地 conf 文件夹内的文件,到镜像内 /etc/nginx/ 文件夹。
FROM nginx:1.15-alpine
COPY html /etc/nginx/html
COPY conf /etc/nginx/
WORKDIR /etc/nginx/html
编写完成后,怎么生成镜像呢?我们只需要使用 docker build 命令就可以构建一个镜像了:
docker build -t imagename:version .
-t: 声明要打一个镜像的 Tag 标签,紧跟着的后面就是标签。
标签格式为 镜像名:版本 . :声明要寻找dockerfile文件的路径. .代表当前路径下寻找。默认文件名为 Dockerfile。
关于更多 DockerFile 的语法,详细可以看这里
因为我们的镜像只包含一个 nginx,所以 dockerfile 内容比较简单。我们只需要在代码根目录下新建一个名为 Dockerfile 的文件,输入以下内容,并将其提交到代码库即可。

vi Dockerfile
FROM nginx:1.15-alpine
COPY html /etc/nginx/html
COPY conf /etc/nginx/
WORKDIR /etc/nginx/html
git add ./Dockerfile
git commit -m "chore: add dockerfile"
git push
Jenkins 端配置
在代码源和 DockerFile 准备就绪后。在服务器的/data目录下新建一个jenkins-shll.sh 脚本文件
touch /data/jenkins-shll.sh
vi /data/jenkins-shll.sh
并加入如下内容
#!/bin/sh -l
yarn
yarn run build
docker build -t jenkins-test .
这里脚本很简单,主要是作用是安装依赖 => 构建文件 => 构建镜像。
#!/bin/sh -l的作用是:如果在服务器中的shell命令可以执行,但到了jenkins中却无法执行,这是因为jenkins没有加载服务器中的全局变量/etc/profile导致的
最后只需在 Jenkins 端配置下要执行的 Shell 脚本即可。找到项目的配置,依次找到构建 => Execute shell。输入以下脚本:
sh /data/jenkins-shll.sh
手动执行任务
保存后我们去手动触发执行下任务。当未抛出错误时,代表任务执行成功

回过头来查看 docker
docker images
可以发现,又多了一个名叫jenkins-test 的 docker 镜像
自动执行任务
安装插件
安装 Generic Webhook Trigger Plugin 插件(系统管理-插件管理-可用插件-搜索 Generic Webhook)
选中并点击Install without restart

如果可选插件列表为空,点击高级标签页,替换升级站点的 URL 为:http://mirror.xmission.com/jenkins/updates/update-center.json并且点击提交和立即获取。
添加触发器
Generic Webhook Trigger Plugin 插件功能很强大,可以根据不同的触发参数触发不同的构建操作,比如我向远程仓库提交的是 master 分支的代码,就执行代码部署工作,我向远程仓库提交的是某个 feature分支,就执行单元测试,单元测试通过后合并至 dev 分支。
灵活性很高,可以自定义配置适合自己公司的方案,这里方便演示我们不做任何条件判断,只要有push就触发。
在任务配置->触发构建起->里勾选 Generic Webhook Trigger ,然后保存即可

Git 仓库配置钩子
此处以码云为例,github 的配置基本一致,进入码云项目主页后,点击管理-webhooks-添加,会跳出一个这样的框来。

上图中的 URL 格式为 http://<User ID>:<API Token>@<Jenkins IP 地址>:端口/generic-webhook-trigger/invoke
下面的几个选项是你在仓库执行什么操作的时候触发钩子,这里默认用 push。
获取User ID
进入 jenkin 的系统管理->管理用户 界面, 可以看到一个用户列表。在此列表中就找到User ID.获取API Token
接下来点击工具图标 进入详情界面后找到API Token->添加新Token->生成->找个你喜欢的地方将此 token 保存好
获取端口
Jenkins IP 地址和端口是你部署 jenkins 服务器的 ip 地址,端口号没改过的话就是 8080。
获取密码
密码就是你登录 jenkins 的密码
点击提交完成配置。我们还需要测试一下钩子是否生效

点击测试,如果配置是成功的,你的 Jenkins 左侧栏构建执行状态里将会出现一个任务。
实现邮件提醒-todo
批量删除构建历史
进入系统配置->脚本命令运行

输入脚本
# "test"是项目名称,100是指(0~·100)全删除,就是构建历史前面的ID
def jobName = "test"
def maxNumber = 100
Jenkins.instance.getItemByFullName(jobName).builds.findAll {it.number <= maxNumber}.each { it.delete() }
点击运行






回复

使用道具 举报

35

主题

9

回帖

214

积分

中级会员

积分
214
 楼主| 发表于 2022-2-25 14:35:00 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|魅力松滋 ( 鄂ICP备2024076975号-1 )

GMT+8, 2025-5-4 02:04 , Processed in 0.051464 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表