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