2021-05-27
上个月入职新公司,领导让我整理下gitlib创建项目到部署ranch的一个过程文档
发现项目工程中都会有.drone.yml和Dockerfile文件
一、CI工具drone
1、drone是一个类似jenkins的工具,下面是一个新建的项目在drone的配置项
(1)打开 http://drone.xxx.com.ph/ 地址,之前未登录会有一个授权弹窗,点击Authorize。
(2)打开 http://drone.xxx.com.ph/account/repos 地址,找到项目qa-mock,并点击右侧栏置为生效
(3)打开 http://drone.xxx.com.ph/data-qa/mock/settings 地址,勾选tag
(4)打开 http://drone.xxx.com.ph/data-qa/mock/settings/secrets 地址,设置仓库用户名和密码
Secret Name 填入 xxxxxx
Secret Value 填入 xxxxxx
2、.drone.yml文件是用来申明CI的过程
项目根目录添加.drone.yml文件,该文件主要是用来配置项目构建的流程
官方文档:https://docs.drone.io/pipeline/overview/
环境变量:https://docs.drone.io/pipeline/environment/reference/
其他参考:https://my.oschina.net/u/4172827/blog/3080817
# 注释的这个是新版本的写法
#kind: pipeline
#name: qa-mock
#steps:
# - name: aliyun # 步骤的名字
# image: plugins/docker # 每个步骤的本质都是基于这个镜像去启动一个容器
# registry: 保存镜像的仓库地址 # 保存镜像的仓库地址
# repo: 保存镜像的仓库地址/a/b # 镜像位置
# secrets: [ docker_username, docker_password ] # drone项目secrets的用户名和密码
# tags: # 将最新的tag名设置为${DRONE_TAG}
# - latest
# - ${DRONE_TAG} # 当前正在运行的构建的tag名称
# when: # when语法:https://docs.drone.io/pipeline/docker/syntax/conditions/
# branch: dev # 如果有branch,那么tag不会触发构建
# event: tag # 事件触发
# 公司drone版本比较老,所以用的是老版写法,下面的aliyun对应1个步骤,可以创建多个步骤
pipeline:
# build: 这里一个步骤是java项目编译打包用的,我们还可以在编译之前再加一些sonar检查的步骤什么的
# image: maven:3.6.0-jdk-11-slim
# commands:
# - mvn clean install -Dmaven.test.skip=true
# volumes:
# - /tmp/gaolei:/root/.m2
teststep:
image: plugins/docker
repo: 保存镜像的仓库地址/a/b
registry: 保存镜像的仓库地址
secrets: [ docker_username, docker_password ]
tags: ${DRONE_TAG=latest}
# tags:
# - latest
# - "latest"
when:
event: [ tag,push ]
二、docker概念
Docker将应用程序与该程序的依赖,打包在一个文件里面。
运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。
容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
镜像( Image) 和容器( Container) 的关系:
就像是面向对象程序设计中的 类 和 实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。
因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。
容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。
这种特性使得容器封装的应用比直接在宿主运行更加安全。
优点:
1、简化配置:虚拟机VM最大的好处是基于你的应用配置能够无缝运行在任何平台上,Docker提供同样类似VM的能力。
2、服务合并:使用Docker也能合并多个服务以降低费用
3、代码管道化管理:能够对代码以流式pipeline管道化进行管理,
4、多租户:Docker能够作为云计算的多租户容器,使用Docker能容易为每个租户创建运行应该多个实例,这得益其灵活的快速环境以及有效diff命令。
5、快速部署:Docker通过创建进程的容器,不必重新启动操作系统,几秒内能关闭。
6、开发人员的生产化:我们可以将多个Docker装载一系列服务运行在单机上最大程度模拟生产分布式部署的环境。
7、应用隔离:将多个应用服务部署在多个Docker中能轻松达到这个目的。
8、分层存储:镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。
三、docker安装和使用
参考来源:https://www.runoob.com/docker/ubuntu-docker-install.html
其他参考:https://www.huaweicloud.com/zhishi/arc-3376452.html
1、安装
我自己阿里云linux服务器的安装方式,一条命令安装完成就可以直接使用docker了:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
2、常用docker命令
(1)docker images 查看镜像
docker rmi <镜像id> 删除镜像
(2)docker ps 查看运行中的容器
docker ps -a 查看所有的容器
docker rm -f <容器 ID> 删除容器
(3)docker stop <容器 ID> 停止容器
docker start <容器 ID> 启动已经停止的容器
docker restart <容器 ID> 重启容器
(4)docker run -itd ubuntu:15.10 /bin/bash 创建一个新的容器,并运行一个命令 --name 容器名 :给新建的容器命名
-i: 交互式操作。
-t: 终端。
-d:后台运行
ubuntu: ubuntu 镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入
docker exec -it <容器 ID> /bin/bash 使用exec不会在exit退出容器时导致容器停止
(5) 创建命令
docker build -t 镜像名称:镜像tag . 这里的.就是Dockerfile文件所在的目录
Dockerfile文件是一个把项目打包成镜像的过程,示例如下,后面有空把docker和drone从安装到应用实践一遍
# 基于镜像基础 FROM python:3.6-slim-stretch RUN apt-get update # 创建目录 RUN mkdir -p /opt/data-qa/qa-mock # 复制指令,从上下文目录中文件复制到指定路径,这里的表示当前路径的内容复制到上面创建出来的目录 COPY . /opt/data-qa/qa-mock # 工作目录 WORKDIR /opt/data-qa/qa-mock # 安装qa-mock目录下requirements的依赖包 RUN pip install -r requirements.txt # 申明使用的端口 EXPOSE 9000