docker | jenkins 实现自动化部署项目,后端躺着把运维的钱挣了!(上)

简介: 打算分两篇文章讲解,这篇文章讲解使用docker将我们的项目文件构建为镜像,然后部署到腾讯云的服务器上(相当于手动完成一次部署),然后进行外网访问测试。

前言

背景

最近在帮学校导师写项目,团队有4个人,项目前后端分离。如果是选择瀑布式开发:(在约定好接口的情况下)A、B同学写前端,C、D同学写后端,然后约定一个时间统一联调,最后将项目交付安装到客户机器上。

结合学校的背景,开发过程中会有几个问题:

  1. 项目需求可能会不定发生变化,客户希望能阶段性看到成果
  2. 等前后端开发完成之后再联调工作量大,容易出错,且开发bug容易堆积,愈演愈烈

如果前后端可以实现一边开发一边联调,一个小功能实现后就能立刻看到效果并且进行相应测试,这样即使中途遇到需求变动,也能较快作出修改,客户也能预览阶段性成果,并且在需求调整时更加有针对性。

既然如此,我能不能后端开发完一个功能就push到git仓库中,然后去部署,让前端可以使用接口,然后做一些测试工作呢?这样不就实现我的目的了?只是一开发一个小功能就要手动部署项目工作量略大...但我可以肝!

image-20220212230402982

当然,讲到这就要引出本文的主角:docker + jenkins了,使用jenkins监听git仓库的变化,一旦发生变化就自动拉取git仓库代码,构建docker镜像,然后自动部署,运行容器。后端只要push了代码,则新一版的项目就会由jenkins自动部署到指定服务器(前端同理),这样后端一个功能开发完(jenkins自动部署),前端就能使用接口进行开发(前端push后,也自动部署),并完成后续相关测试。

当然,上面讲的jenkins使用与真实工作中使用相比不够规范,在工作中jenkins的部署环境会更多细分:开发环境、测试环境、生产环境等。但是基本原理流程相同。

计划

打算分两篇文章讲解,这篇文章讲解使用docker将我们的项目文件构建为镜像,然后部署到腾讯云的服务器上(相当于手动完成一次部署),然后进行外网访问测试。

下一篇文章讲解使用jenkins + docker完成自动化部署项目的功能,如果写第三篇文章就是docker + jenkins + k8s将项目部署到集群当中,并且完成自动化部署的过程(这就很大程度上偏向于运维工程师的工作了)。

当然我本身也是在学习这些技术,因此如果行文当中有所纰漏,请指出~

docker

安装

  1. 在自己电脑上安装Docker Desktop:https://www.docker.com/get-started,选择适合自己主机系统的版本,安装运行之后就可以在命令行窗口使用docker命令了,mac运行Docker Desktop会有一个docker的logo显示。

  1. 在腾讯云主机上安装docker:https://dockerdocs.cn/engine/install/centos/index.html,参考docker中文文档,即可快速完成安装(这个文档也是大家学习docker最好的参考书)。

image-20220212203327261

项目目录

项目是由python的flask微框架构建的,编辑器是PyCharm,只是这个项目要求用python,换做是go、java都是一样的,这里可以完全忽略,因为项目本身也只有一个app.py文件,它定义了一个接口,访问http://主机IP:5000/,就可以返回Hello World

image-20220212204002284

Docker Hub

首先请大家到Docker Hub上注册一个账号,这个平台就像GitHub一样,是所有人发布Docker镜像的平台。然后在自己的主页创建一个Repository,这里我创建了一个名为wood-app-backend的Repository,用于后面我本地构建镜像之后,将镜像上传到自己的Docker Hub,然后再登录腾讯云主机,从Docker Hub上拉取镜像,就可以部署到云服务器上了。

image-20220212205725119

Dockerfile

这里重点关注Dockerfile文件内容,要将你的项目文件构建成docker镜像,先在项目中建立Dockerfile文件,然后编写构建镜像的逻辑,这里是一行一行执行的。每行都是一个关键字+若干参数,具体可以参考菜鸟教程:https://www.runoob.com/docker/docker-dockerfile.html,了解每个关键字作用。

# 一个镜像都是从一个原始镜像基础上构建的,这里我去Docker Hub上找了一个python3.6的镜像作为基本镜像
FROM quoinedev/python3.6-pandas-alpine:latest
# 工作目录
WORKDIR /usr/src/app
# 复制文件
COPY requirements.txt ./
# 构建镜像过程中可以执行命令,这里是为了下载对应的python依赖包(其他语言同理,导包)
RUN pip install --no-cache-dir -r requirements.txt
# 将当前目录下文件拷贝到工作目录
COPY . .
# 运行python的项目(容器运行时的命令要先定义好)
CMD ["python", "./app.py"]

然后在Dockerfile同级目录下执行下面的命令就可以将当前项目文件所有内容构建成一个docker镜像,至于baize1998/wood-app-backend:1.0,表明了该image所属的仓库以及对应的Tag版本(注意对应自己的Docker Hub上创建的仓库)

docker build -t baize1998/wood-app-backend:1.0 .

输入命令查看是否构建镜像成功(现在还是在本地处理docker命令,即Docker Desktop)

docker images

image-20220212211411884

上传docker镜像

登录Docker Hub

docker login -u 用户名 -p 密码

上传docker镜像(因为在构建镜像的时候已经将名称对应我们的Docker Hub仓库名称,所以直接push即可)

docker push baize1998/wood-app-backend:1.0

查看Docker Hub的wood-app-backend仓库中已经显示有一个1.0的tag(同理push一个tag为2.0的镜像也将出现在这个仓库中)

image-20220212210846893

云服务器拉取镜像

(先保证你已经在云服务器上安装了docker,参考上面我给的文档)同样需要先登录Docker Hub

docker login -u 用户名 -p 密码

拉取刚刚上传到我们自己的Docker Hub中的镜像

docker pull baize1998/wood-app-backend:1.0

查看是否拉取docker镜像成功

docker images

image-20220212210233712

借助镜像文件运行容器

# 有-d参数表示后台运行
docker run -d -p 5000:5000 镜像ID
# 补充几个常用命令
# 进入运行中的docker容器(因为一个容器可能是后台运行的,可以进入去了解容器运行情况)
docker exec -it 镜像ID sh 
# 或者
docker exec -it 镜像ID bash
# 或者
docker exec -it 镜像ID /bin/bash
# 从容器中退出
exit
# 也可以通过命令查看容器中端口占用情况去分析容器是否成功运行,自行搜索了解~

外网访问测试

访问成功,手动使用Dockerfile构建docker镜像并且部署使用的流程演示完毕

image-20220212212430571

结束语

这篇文章算是抛砖引玉,因为后面要用的jenkins服务本身也是使用docker镜像部署的,所以为了平滑使用jenkins,所以写了这篇文章,那我们下期见~

关注公众号【程序员白泽】,带你走近一个有点话痨的程序员/学生党。

相关文章
|
8天前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
1天前
|
机器学习/深度学习 人工智能 运维
智能运维:未来趋势下的自动化与人工智能融合
【8月更文挑战第18天】 在数字化浪潮中,智能运维(AIOps)作为一股不可逆转的力量,正逐步改写传统运维的脚本。本文将探讨AIOps的核心要素、实施路径和面临的挑战,同时分享个人从新手到专家的心路历程,旨在启发读者思考如何在这一领域内持续成长并作出贡献。
11 6
|
3天前
|
运维 持续交付 网络安全
自动化运维:Ansible与Terraform的比较
【8月更文挑战第16天】Ansible和Terraform都是自动化运维领域的重要工具,它们各自以其独特的功能和优势在市场中占据了一席之地。在选择使用哪个工具时,用户应根据自己的实际需求和应用场景进行综合考虑。如果主要关注系统配置管理和应用程序部署,那么Ansible可能是一个更好的选择;如果主要关注基础设施的自动化部署和管理,那么Terraform可能更适合您的需求。
|
4天前
|
机器学习/深度学习 人工智能 运维
自动化运维的新篇章:从脚本到智能化管理
在数字化浪潮中,运维领域迎来了前所未有的挑战与机遇。本文将通过一个运维专家的视角,讲述他如何从一个刚毕业的迷茫青年成长为行业内的佼佼者。文章不仅分享技术成长之路,更深入探讨自动化运维的演变历程,以及它如何重塑IT行业的未来。
|
6天前
|
运维 监控 Devops
构建高效自动化运维体系:DevOps与容器化实践
【7月更文挑战第44天】在现代IT基础设施管理中,自动化运维已成为提升效率、降低成本、确保系统稳定性的关键。本文将探讨如何通过结合DevOps理念和容器化技术来构建一个高效的自动化运维体系。我们将分析这一体系对提高软件交付速度、优化资源利用率以及增强系统可靠性的积极影响,并提供一系列实施策略和最佳实践,帮助企业实现运维自动化转型。
|
8天前
|
运维 监控 持续交付
构建高效自动化运维体系:Ansible与Docker的协同实践
【7月更文挑战第42天】 在当今快速发展的云计算和微服务架构时代,自动化运维已成为提升效率、确保系统稳定性的关键。本文将探讨如何利用Ansible这一强大的自动化工具与Docker容器技术相结合,搭建一个高效、可靠的自动化运维体系。文章首先简述了自动化运维的必要性和Ansible与Docker的基本概念,随后详细介绍了两者结合的优势,并通过实际案例分析展示了如何实现自动化部署、管理和扩展应用服务。通过阅读本文,读者将获得一套可行的自动化运维解决方案,以应对日益复杂的IT环境挑战。
|
6天前
|
JSON 缓存 监控
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
Viper 是一个强大的 Go 语言配置管理库,适用于各类应用,包括 Twelve-Factor Apps。相比仅支持 `.ini` 格式的 `go-ini`,Viper 支持更多配置格式如 JSON、TOML、YAML
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
|
5天前
|
Kubernetes jenkins 持续交付
Jenkins + SVN/Git + Maven + Docker + 阿里云镜像 + Kubernetes(K8S)
Jenkins + SVN/Git + Maven + Docker + 阿里云镜像 + Kubernetes(K8S)
10 0
|
5天前
|
jenkins 持续交付 网络安全
Docker Jenkins 安装配置
Docker Jenkins 安装配置
13 0
|
6天前
|
jenkins 持续交付 开发工具
自动化开发之旅:Docker携手Jenkins,与Git和Tomcat共舞持续集成
【8月更文挑战第13天】在软件开发中,持续集成(CI)通过自动化构建、测试与部署提升效率与稳定性。Docker、Jenkins、Git和Tomcat构成CI的黄金组合:`git push`触发Jenkins作业,利用Docker确保环境一致性,最终将应用部署至Tomcat。首先配置Git Webhooks以触发Jenkins;接着在Jenkins中创建作业并使用Docker插件模拟真实环境;通过Maven构建项目;最后部署至Tomcat。这套流程减少人为错误,提高开发效率,展示了技术的力量与流程的革新。
15 0