docker | jenkins 實現自動化部署項目,后端躺着把運維的錢掙了!(上)


前言

背景

最近在幫學校導師寫項目,團隊有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,所以寫了這篇文章,那我們下期見~

建了一個春秋招備戰/內推/閑聊群,歡迎大家加入。

image-20220212231622599

關注公眾號【程序員白澤】,帶你走近一個有點話癆的程序員/學生黨。

image-20220110183620835


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM