前言
背景
最近在帮学校导师写项目,团队有4个人,项目前后端分离。如果是选择瀑布式开发:(在约定好接口的情况下)A、B同学写前端,C、D同学写后端,然后约定一个时间统一联调,最后将项目交付安装到客户机器上。
结合学校的背景,开发过程中会有几个问题:
- 项目需求可能会不定发生变化,客户希望能阶段性看到成果
- 等前后端开发完成之后再联调工作量大,容易出错,且开发bug容易堆积,愈演愈烈
如果前后端可以实现一边开发一边联调,一个小功能实现后就能立刻看到效果并且进行相应测试,这样即使中途遇到需求变动,也能较快作出修改,客户也能预览阶段性成果,并且在需求调整时更加有针对性。
既然如此,我能不能后端开发完一个功能就push到git仓库中,然后去部署,让前端可以使用接口,然后做一些测试工作呢?这样不就实现我的目的了?只是一开发一个小功能就要手动部署项目工作量略大...但我可以肝!
当然,讲到这就要引出本文的主角:docker jenkins
了,使用jenkins监听git仓库的变化,一旦发生变化就自动拉取git仓库代码,构建docker镜像,然后自动部署,运行容器。后端只要push了代码,则新一版的项目就会由jenkins自动部署到指定服务器(前端同理),这样后端一个功能开发完(jenkins自动部署),前端就能使用接口进行开发(前端push后,也自动部署),并完成后续相关测试。
当然,上面讲的jenkins使用与真实工作中使用相比不够规范,在工作中jenkins的部署环境会更多细分:开发环境、测试环境、生产环境等。但是基本原理流程相同。
计划
打算分两篇文章讲解,这篇文章讲解使用docker将我们的项目文件构建为镜像,然后部署到腾讯云的服务器上(相当于手动完成一次部署),然后进行外网访问测试。
下一篇文章讲解使用 jenkins docker
完成自动化部署项目的功能,如果写第三篇文章就是 docker jenkins k8s
将项目部署到集群当中,并且完成自动化部署的过程(这就很大程度上偏向于运维工程师的工作了)。
当然我本身也是在学习这些技术,因此如果行文当中有所纰漏,请指出~
docker
安装
- 在自己电脑上安装Docker Desktop:https://www.docker.com/get-started,选择适合自己主机系统的版本,安装运行之后就可以在命令行窗口使用docker命令了,mac运行Docker Desktop会有一个docker的logo显示。
- 在腾讯云主机上安装docker:https://dockerdocs.cn/engine/install/centos/index.html,参考docker中文文档,即可快速完成安装(这个文档也是大家学习docker最好的参考书)。
项目目录
项目是由python的flask微框架构建的,编辑器是PyCharm,只是这个项目要求用python,换做是go、java都是一样的,这里可以完全忽略,因为项目本身也只有一个app.py文件,它定义了一个接口,访问 http://主机IP:5000/
,就可以返回 HelloWorld
。
Docker Hub
首先请大家到Docker Hub上注册一个账号,这个平台就像GitHub一样,是所有人发布Docker镜像的平台。然后在自己的主页创建一个Repository,这里我创建了一个名为wood-app-backend的Repository,用于后面我本地构建镜像之后,将镜像上传到自己的Docker Hub,然后再登录腾讯云主机,从Docker Hub上拉取镜像,就可以部署到云服务器上了。
Dockerfile
这里重点关注Dockerfile文件内容,要将你的项目文件构建成docker镜像,先在项目中建立Dockerfile文件,然后编写构建镜像的逻辑,这里是一行一行执行的。每行都是一个关键字 若干参数,具体可以参考菜鸟教程:https://www.runoob.com/docker/docker-dockerfile.html,了解每个关键字作用。
代码语言:javascript复制# 一个镜像都是从一个原始镜像基础上构建的,这里我去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上创建的仓库)
代码语言:javascript复制docker build -t baize1998/wood-app-backend:1.0 .
输入命令查看是否构建镜像成功(现在还是在本地处理docker命令,即Docker Desktop)
代码语言:javascript复制docker images
上传docker镜像
登录Docker Hub
代码语言:javascript复制docker login -u 用户名 -p 密码
上传docker镜像(因为在构建镜像的时候已经将名称对应我们的Docker Hub仓库名称,所以直接push即可)
代码语言:javascript复制docker push baize1998/wood-app-backend:1.0
查看Docker Hub的wood-app-backend仓库中已经显示有一个1.0的tag(同理push一个tag为2.0的镜像也将出现在这个仓库中)
云服务器拉取镜像
(先保证你已经在云服务器上安装了docker,参考上面我给的文档)同样需要先登录Docker Hub
代码语言:javascript复制docker login -u 用户名 -p 密码
拉取刚刚上传到我们自己的Docker Hub中的镜像
代码语言:javascript复制docker pull baize1998/wood-app-backend:1.0
查看是否拉取docker镜像成功
代码语言:javascript复制docker images
借助镜像文件运行容器
代码语言:javascript复制# 有-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镜像并且部署使用的流程演示完毕
结束语
这篇文章算是抛砖引玉,因为后面要用的jenkins服务本身也是使用docker镜像部署的,所以为了平滑使用jenkins,所以写了这篇文章,那我们下期见~