docker
先删除之前旧版本
$ sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
安装必须的依赖
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
// 添加stable的Docker-ce的源
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装docker-ce
$ sudo yum install docker-ce docker-ce-cli containerd.io
切换镜像安装源(加速)
$ vim /ect/docker/daemon.json
// 配置以下内容
{
"registry-mirrors": ["https://registry.docker-ce.com"]
}
$ systemctl daemon-reload
$ systemctl restart docker
jenkins
安装
// 拉取镜像
docker pull jenkins/jenkins:lts
// 创建并运行容器,需要映射内部到外部的docker,不然内部使用不了docker,映射文件后内部的docker命令作用到外部
// 这里映射docker后,可能存在在jenkins容器内部没有权限使用docker命令的情况,需要修改容器内/var/run/docker.sock
// 文件的权限给jenkins
docker run -itd --name jenkins -p 8000:8080 -p 50000:50000 -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:lts
// 查看运行信息,拿到初始密码
docker logs -f jenkins_pjm
配置jenkins
打开IP:8080,进入jenkins
输入初始密码
点击安装推荐的插件,等待完成
创建用户
配置实例,默认就行,完成后即可进入主界面
配置加速
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
安装插件
-
Generic Webhook Trigger(webhook钩子,当git或者gitlab提交触发事件)
-
Build With Parameters(参数化构建)
-
Role-based Authorization Strategy(用户-角色权限)
-
ThinBackup(备份)
添加ssh凭据(通过github拉取代码)
// 生成公密钥对
$ ssh-keygen -t rsa -b 4096 -C '728494186@qq.com'
// 公钥为生成文件夹下的id_rsa.pub,密钥为id_rsa
生成个人账户token(webhook调用使用)
nginx
安装时会在Dockerfile中设定安装镜像,安装后的访问的默认目录为/usr/share/nginx/html
关闭防火墙
// 整体关闭
systemctl stop firewalld.service
systemctl disable firewalld.service
// 关闭某个端口的防火墙
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
整体流程
代码push -> 触发webhook -> jenkins接受到开始触发流程 -> jenkins拉取代码到本地工作目录 -> 在本地工作目录执行shell -> 通过拉取到的代码的Dockerfile构建镜像 -> 判断docker是否有用该镜像正在运行的容器 -> 有的话删除,没有的话直接通过该镜像创建容器,将镜像中nginx暴露的80端口(docker中),映射到外面自定义端口 -> 完成整个流程,通过ip:端口即可访问
jenkins创建任务
shell代码
#!/bin/bash
# 根据当前目录的Dockerfile构建webapp镜像
docker build --no-cache -t webapp .
# 获取容器webapp-container的运行状态是否在运行
docker ps -a | grep webapp-container &> /dev/null
# 如果没有在运行
if [ $? -ne 0 ]; then
echo "webapp-container is not running"
# 在运行则删除之前容器
else
echo "webapp-container is running"
# 找到正在运行的webapp-container容器并停止它
matchingStarted=$(docker ps --filter="name=webapp-container" -q | xargs)
if [ -n $matchingStarted ]; then
docker stop $matchingStarted
fi
# 找到所有webapp-container容器并删除它
matching=$(docker ps -a --filter="name=webapp-container" -q | xargs)
if [ -n $matching ]; then
docker rm $matching
fi
fi
# 创建并运行镜像为webapp的webapp-container容器,内部nginx暴露的80端口映射到外部3333端口
docker run -itd --name webapp-container -p 3333:80 webapp
github配置webhook
项目配置Dockerfile
# build stage
# 创建构建依赖的基础镜像,该阶段生成的镜像命名为build-stage
# 之后COPY --FROM=<name>可以引用此阶段生成的镜像
FROM node:lts-alpine as build-stage
# 将源文件.拷贝到app下(没有则创建)
COPY . /app
# 指定app为工作目录(只有WORKDIR指定的目录会一直存在)
WORKDIR /app
# Dockerfile 的指令每执行一次都会在 docker 上新建一层
RUN npm install --registry=https://registry.npm.taobao.org
RUN npm run build
# production stage
# 拉取nginx镜像
FROM nginx:stable-alpine as production-stage
# 将上面生成镜像中构建好的文件复制到nginx内容的默认目录上
COPY --from=build-stage /app/dist /usr/share/nginx/html
# nginx暴露80端口
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
项目配置.dockerignore(生成镜像忽略)
node_modules
.DS_Store
# node-waf configuration
.lock-wscript
build/Release
.dockerignore
Dockerfile
*docker-compose*
# Logs
Logs
*.log
# Runtime data
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*
pdis
*.pdi
*.seed
.git
.hg
.svn
区分环境构建(从节点)
新服务器需要配置环境才能连接成功
// JDK环境
yum search jdk
装 1.8版本的:yum install -y java-1.8.0-openjdk
jenkins从节点配置
新服务器配置公钥
vim /root/.ssh/authorized_keys
加上配置保存即可