千家信息网

详解Docker+Jenkins+Gitlab+Django应用部署实践

发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,一、背景介绍在互联网应用快速更新迭代的大背景下,传统的人工手动或简单脚本已经不能适应此变化,此时Devops为我们提供了良好的解决方案,应用好CI/CD可以大大的方便我们的日常工作,自动化快速的持续集
千家信息网最后更新 2025年02月08日详解Docker+Jenkins+Gitlab+Django应用部署实践

一、背景介绍

在互联网应用快速更新迭代的大背景下,传统的人工手动或简单脚本已经不能适应此变化,此时Devops为我们提供了良好的解决方案,应用好CI/CD可以大大的方便我们的日常工作,自动化快速的持续集成/持续交付为我们带来了应用开放的更快速度、更好的稳定性和更强的可靠性。

二、拓扑环境

2.1 架构拓扑

如上图实例,简单花了下流程拓扑:

  • 当研发push本地代码到gitlab-server后,webhook自动触发jenkins构建应用
  • 在docker host上部署应用git clone来自gitlabserver源码,并启动应用
  • 前端可以放置lb来做高可用
  • 数据库连接云数据库
  • 可将日志存储在log后期投递到elk实现日志可视化
  • 构建完成邮件通知相关人员(测试或开放)

2.2 系统软件版本

名称版本
Linux系统CentOS7.3 64位
Docker1.13
Django2.0

三、安装部署

3.1 Jenkins安装部署

Jenkins安装部署可参考:jenkins笔记

安装完成后添加Docker目标服务器

配置邮件发送服务器

3.2 Docker安装部署

Docker安装部署及Dockerfile编写可参考:容器Docker详解

3.3 Gitlab安装部署

GitLab安装在公网Linux服务器运行一些命令即可,如果没有公网需要手动修改 /etc/gitlab/gitlab.rb 文件的 external_url 'http://自己的内网IP'

yum install -y libsemanage-static libsemanage-devel policycoreutils openssh-server openssh-clients postfixsystemctl enable postfix && systemctl start postfixwget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-8.0.0-ce.0.el7.x86_64.rpmrpm -i gitlab-ce-8.0.0-ce.0.el7.x86_64.rpm# 获取公网IPPUBLICIP=$(curl http://ipv4.icanhazip.com)# 修改sed -i "s/gitlab-server/${PUBLICIP}/g" /etc/gitlab/gitlab.rbgitlab-ctl reconfiguregitlab-ctl restartecho "Username:root"echo "Password:5iveL!fe"

3.4 配置发布流程

Jenkins新建构建一个自由风格的软件项目

利用参数化构建方便后续部署Docker传入映射的源端口和release

源代码来自gitlab的django项目

利用webhook关联gitlab和jenkins

jenkins安装插件:

生成随机token值

将jenkins生成的GitLab webhook URL配置到gitlab

当开发者在本地push代码后自动触发jenkins构建项目,有Dockerfile内写的git pull代码,再次不用将代码由jenkins分发到docker宿主机,jenkins作为触发docker构建使用

配置构建完成后的邮件

邮件模版,邮件类型选择:

内容类型选择:HTML

邮件主题填写: 构建通知:${BUILD_STATUS} - ${PROJECT_NAME} - Build # ${BUILD_NUMBER} !

构建通知模版:

${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志 
(本邮件是程序自动下发的,请勿回复!)

构建结果 - ${BUILD_STATUS}


构建信息
Changes Since Last Successful Build:
${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:
%c
",showPaths=true,changesFormat="
[%a]
%m
",pathFormat=" %p"}
Failed Test Results
$FAILED_TESTS

构建日志 (最后 100行):

触发类型可根据自身需要填写,这里填写always无论成功还是失败都发送邮件

查看远程Docker服务器内的文件

django部署已经利用conda打包好了项目的Python3.6的环境包自制了Docker镜像

之前利用的是纯净的Python3.6系统,在每次构建的时候利用pip安装requirements.txt的模块,但是长此以往由于环境变化很少,每次需要pip安装耗时,所以利用conda将打包好的Python环境自制成定制化环境,以此来减少环境部署时间,也可以通过docker镜像制作是-v参数将本地磁盘挂载在环境内,每次构建本地的conda即可,完成快速环境部署。

查看Dockerfile

FROM 87a69025db6aMAINTAINER kaliarch# 定义docker中工作目录ENV WORK_DIR /work/# 创建docker内工作目录RUN mkdir $WORK_DIR# 定义映射端口EXPOSE 80WORKDIR $WORK_DIR RUN git clone http://123.xxxx.xxxxx.245/Devops/go2cloud.git# 添加启动服务脚本ADD *.sh ${WORK_DIR}CMD `which bash` /work/start_all.sh && tail -f /work/logs/server-$(date +%F).log

查看Django启动脚本

#!/bin/bashBASEPATH=$(cd `dirname $0`;pwd)PY_CMD=/python3/bin/python# 服务入口文件#MAIN_APP=${BASEPATH}/go2cloud/manage.py # 迁移脚本入口文件SCRIPTS_APP=${BASEPATH}/go2cloud/scripts/migrate_task_schdule.py# 删除脚本入口文件DELETE_APP=${BASEPATH}/go2cloud/scripts/delete_transfer_server.py# 日志目录LOG_DIR=${BASEPATH}/logs/[ ! -d ${LOG_DIR} ] && mkdir ${LOG_DIR}# 启动服务#nohup ${PY_CMD} -u ${MAIN_APP} runserver 0.0.0.0:80 >> ${LOG_DIR}server-$(date +%F).log 2>&1 &# 启动脚本迁移调度脚本echo "---------$0 $(date) excute----------" >> ${LOG_DIR}task-script-$(date +%F).lognohup ${PY_CMD} -u ${SCRIPTS_APP} >> ${LOG_DIR}script-$(date +%F).log 2>&1 &# 启动迁移删除脚本echo "---------$0 $(date) excute----------" >> ${LOG_DIR}delete-script-$(date +%F).lognohup ${PY_CMD} -u ${DELETE_APP} >> ${LOG_DIR}delete-script-$(date +%F).log 2>&1 &

查看jenkins部署脚本

#!/bin/bashrelease=$1port=$2BASEPATH=$(cd `dirname $0`;pwd)# 构建go2cloud-platform 镜像cd /dockerworkdocker build -t go2cloud-platform-mini:$release .IMGNAME=$(docker images|awk -v release=$release '{if($1=="go2cloud-platform-mini" && $2==release) print $3}')echo $IMGNAME# 启动容器docker run -d -p ${port}:80 -v /testlog/:/work/logs ${IMGNAME}

利用-v参数将日志持续化存储到docker 宿主机之上

四、测试展示

4.1 测试构建

手动构建测试

4.2 查看log

4.3 查看docker容器

4.4 测试app

五、反思改进

  • 目前数据库连接的为云服务器搭建的数据库,后期数据库也利用docker,多组采用docker-compose统一部署管理
  • 后期可以利用利用公有云k8s集群进行方便测试
  • 目前docker容器产生的日志在docker宿主机上,后期可以将其存储在cos上,再投递到elk集群日志可视化处理
  • 将镜像统一管理制作本地镜像仓库
  • gitlab添加code review并结合自动测试

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

日志 脚本 环境 邮件 服务 测试 应用 项目 数据 数据库 文件 服务器 镜像 代码 容器 目录 配置 入口 参数 宿主 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 惠州软件开发薪资 数据库 计算列 公安部信息网络安全保密 福州联豪网络技术有限公司招聘 怎样保持帝国cms数据库 未尽信息网络安全管理义务 广东综合软件开发定做价格 网络安全问题都有什么原因 通信网络技术基础课程标准 网络安全公益讲座观后感200 易捷通怎么导入数据库数据 软件开发公司业务去哪里找 同一服务器安装两个网管系统 学生网络安全竞赛 聊天软件开发前景怎么样 字节跳动服务器内存采购额 阿尔比恩电脑版未能连接服务器 gis软件开发 安徽清溪镇服务器 中小学生教育网络安全怎么写 如何导入本地数据库文件 韶华网络技术(广州)有限公司怎么样 僵尸毁灭工程开服务器一直初始化 国家安全概论网络安全 上海洋码头网络技术有限公 网络安全小报内容字要清楚 ora删除数据库 小蚁网络安全靠谱吗 计算机网络技术分文理科吗 网络安全机构设置自查报告
0