微服務容器部署與持續整合
學習目標
- 理解Dockerfile的作用,能編寫簡單的Dockerfile指令碼完成映象的構建
- 完成Docker私有倉庫的構建,能夠運用Maven外掛完成映象的建立與上傳
- 能夠使用Jenkins完成程式碼的持續整合
1 Dockerfile
1.1 什麼是Dockerfile
Dockerfile是由一系列命令和引數構成的指令碼,這些命令應用於基礎映象並最終建立一個新的映象。
1、對於開發人員:可以為開發團隊提供一個完全一致的開發環境;
2、對於測試人員:可以直接拿開發時所構建的映象或者通過Dockerfile檔案構建一個新的映象開始工作了;
3、對於運維人員:在部署時,可以實現應用的無縫移植。
1.2 常用命令
FROM image_name:tag 定義了使用哪個基礎映象啟動構建流程
MAINTAINERuser_name宣告映象的建立者
ENV key value 設定環境變數 (可以寫多條)
RUN command 是Dockerfile的核心部分(可以寫多條)
ADD source_dir/filedest_dir/file將宿主機的檔案複製到容器內,如果是一個壓縮檔案,將會在複製後自動解壓
COPY source_dir/filedest_dir/file和ADD相似,但是如果有壓縮檔案並不能解壓
WORKDIR path_dir 設定工作目錄
EXPOSE port1 prot2用來指定埠,使容器內的應用可以通過埠和外界互動
ENTRYPOINTargument和CMD相似,但是並不會被docker run指定的引數覆蓋
VOLUME 將本地資料夾或者其他容器的檔案掛載到容器中
1.3 使用指令碼建立映象
步驟:
(1)建立目錄
mkdir –p /usr/local/dockerjdk8
(2)下載jdk-8u171-linux-x64.tar.gz並上傳到伺服器(虛擬機器)中的/usr/local/dockerjdk8目錄
(3)建立檔案Dockerfile viDockerfile
#依賴映象名稱和ID FROMcentos:7 #指定映象建立者資訊 MAINTAINERIT #切換工作目錄 WORKDIR/usr RUNmkdir/usr/local/java #ADD是相對路徑jar,把java新增到容器中 ADDjdk-8u171-linux-x64.tar.gz/usr/local/java/ #配置java環境變數 ENVJAVA_HOME/usr/local/java/jdk1.8.0_171 ENVJRE_HOME$JAVA_HOME/jre ENVCLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENVPATH$JAVA_HOME/bin:$PATH
(4)執行命令構建映象
docker build -t='jdk1.8' .
注意後邊的空格和點(指當前目錄),不要省略
(5)檢視映象是否建立完成
docker images
(6)建立容器
docker run -it --name=myjdk8 jdk1.8 /bin/bash
2 Docker私有倉庫
2.1 私有倉庫搭建與配置
(1)拉取私有倉庫映象(此步省略)
docker pull registry
(2)啟動私有倉庫容器
docker run -di --name=registry -p 5000:5000 registry
(3)開啟瀏覽器 輸入地址http://192.168.184.135:5000/v2/_catalog看到 {"repositories":[]} 表示私有倉庫搭建成功並且內容為空
(4)修改daemon.json
vi /etc/docker/daemon.json
新增以下內容,儲存退出。
{"insecure-registries":["192.168.184.135:5000"]}
此步用於讓 docker信任私有倉庫地址
(5)重啟docker 服務
systemctl restart docker
2.2 映象上傳至私有倉庫
(1)標記此映象為私有倉庫的映象
docker tag jdk1.8 192.168.184.135:5000/jdk1.8
(2)上傳標記的映象
docker push 192.168.184.135:5000/jdk1.8
2.3 DockerMaven外掛
微服務部署有兩種方法:
(1)手動部署:首先基於原始碼打包生成jar包(或war包),將jar包(或war包)上傳至虛擬機器並拷貝至JDK容器。
(2)通過Maven外掛自動部署。
對於數量眾多的微服務,手動部署無疑是非常麻煩的做法,並且容易出錯。所以我們這裡學習如何自動部署,這也是企業實際開發中經常使用的方法。
Maven外掛自動部署步驟:
(1)修改宿主機的docker配置,讓其可以遠端訪問
vi /lib/systemd/system/docker.service
其中ExecStart=後新增配置
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
修改後如下:
(2)重新整理配置,重啟服務
systemctl daemon-reload
systemctl restart docker
docker start registry
(3)在maven工程pom.xml 增加配置
<build> <finalName>app</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!--docker的maven外掛,官網:https://github.com/spotify/docker‐maven‐plugin --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.13</version> <configuration> <imageName>49.232.194.201:5000/${project.artifactId}:${project.version}</imageName> <baseImage>jdk1.8</baseImage> <entryPoint>["sh", "-c", "java -jar /${project.build.finalName}.jar ${BOOT_OPTIONS}"]</entryPoint> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> <dockerHost>http://49.232.194.201:2375</dockerHost> </configuration> </plugin> </plugins> </build>
以上配置會自動生成Dockerfile
FROM jdk1.8
ADD /app.jar //
ENTRYPOINT ["sh", "-c", "java -jar /app.jar ${BOOT_OPTIONS}"]
(5)在windows的命令提示符下,進入maven工程所在的目錄,輸入以下命令,進行打包和上傳映象
mvn clean package docker:build -DpushImage
執行後,會有如下輸出,正在構建
程式碼正在上傳
瀏覽器訪問 http://192.168.184.135:5000/v2/_catalog ,輸出
{"repositories":["app"]}
(6)進入宿主機 , 檢視映象
docker images
(7) 啟動容器:
docker run -e BOOT_OPTIONS="--spring.profiles.active=prod" --name=music-manager -p 8888:8888 49.232.194.201:5000/aaron911-music:0.0.1-SNAPSHOT
3 理解持續整合
3.1 什麼是持續整合
持續整合 Continuous integration ,簡稱CI
隨著軟體開發複雜度的不斷提高,團隊開發成員間如何更好地協同工作以確保軟體開發的質量已經慢慢成為開發過程中不可迴避的問題。尤其是近些年來,敏捷(Agile)在軟體工程領域越來越紅火,如何能再不斷變化的需求中快速適應和保證軟體的質量也顯得尤其的重要。
持續整合正是針對這一類問題的一種軟體開發實踐。它倡導團隊開發成員必須經常整合他們的工作,甚至每天都可能發生多次整合。而每次的整合都是通過自動化的構建來驗證,包括自動編譯、釋出和測試,從而儘快地發現整合錯誤,讓團隊能夠更快的開發內聚的軟體。
3.2 持續整合的特點
- 它是一個自動化的週期性的整合測試過程,從檢出程式碼、編譯構建、執行測試、結果記錄、測試統計等都是自動完成的,無需人工干預;
- 需要有專門的整合伺服器來執行整合構建;
- 需要有程式碼託管工具支援
3.3 持續整合作用
- 保證團隊開發人員提交程式碼的質量,減輕了軟體釋出時的壓力;
- 持續整合中的任何一個環節都是自動完成的,無需太多的人工干預,有利於減少重複過程以節省時間、費用和工作量;
4 Gogs
4.1 什麼是Gogs
Gogs 是一款極易搭建的自助 Git 服務。
Gogs 的目標是打造一個最簡單、最快速和最輕鬆的方式搭建自助 Git 服務。使用 Go 語言開發使得 Gogs 能夠通過獨立的二進位制分發,並且支援 Go 語言支援的所有平臺,包括 Linux、Mac OS X、Windows 以及 ARM 平臺。地址:https://gitee.com/Unknown/gogs
4.2 Gogs安裝與配置
4.2.1 安裝
(1)下載映象
docker pull gogs/gogs
(2)建立容器
docker run -d --name=gogs -p 10022:22 -p 3000:3000 -v /var/gogsdata:/data gogs/gogs
4.2.2 配置
假設我的centos虛擬機器IP為192.168.184.135 完成以下步驟
(1)在位址列輸入http://192.168.184.135:3000 會進入首次執行安裝程式頁面,我們可以選擇一種資料庫作為gogs資料的儲存,最簡單的是選擇SQLite3。如果對於規模較大的公司,可以選擇MySQL
設定“域名”“應用URL”兩項後,點選“立即安裝”
(2)註冊
(3)登入
(4)建立倉庫
4.3 IDEA配置Git
步驟:
(1)在本地安裝git(Windows版本)
(2)在IDEA中選擇選單 : File -- settings , 在視窗中選擇Version Control -- Git
4.4 將十次方程式碼提交到Git
(1)選擇選單VCS --> Enable Version Control Integration...
選擇Git
(2)設定遠端地址: 右鍵點選工程選擇選單 Git --> Repository -->Remotes...
(3)右鍵點選工程選擇選單 Git --> Add
(4)右鍵點選工程選擇選單 Git --> Commit Directory...
(5)右鍵點選工程選擇選單 Git --> Repository --> Push ...
5 運用Jenkins實現持續整合
5.1 Jenkins簡介
Jenkins,原名Hudson,2011年改為現在的名字,它是一個開源的實現持續整合的軟體工具。官方網站:http://jenkins-ci.org/。 Jenkins 能實施監控整合中存在的錯誤,提供詳細的日誌檔案和提醒功能,還能用圖表的形式形象地展示專案構建的趨勢和穩定性。
特點:
易安裝:僅僅一個java -jar jenkins.war,從官網下載該檔案後,直接執行,無需額外的安裝,更無需安裝資料庫;
易配置:提供友好的GUI配置介面;
變更支援:Jenkins能從程式碼倉庫(Subversion/CVS)中獲取併產生程式碼更新列表並輸出到編譯輸出資訊中;
支援永久連結:使用者是通過web來訪問Jenkins的,而這些web頁面的連結地址都是永久連結地址,因此,你可以在各種文件中直接使用該連結;
整合E-Mail/RSS/IM:當完成一次整合時,可通過這些工具實時告訴你整合結果(據我所知,構建一次整合需要花費一定時間,有了這個功能,你就可以在等待結果過程中,幹別的事情);
JUnit/TestNG測試報告:也就是用以圖表等形式提供詳細的測試報表功能;
支援分散式構建:Jenkins可以把整合構建等工作分發到多臺計算機中完成;
檔案指紋資訊:Jenkins會儲存哪次整合構建產生了哪些jars檔案,哪一次整合構建使用了哪個版本的jars檔案等構建記錄;
支援第三方外掛:使得 Jenkins 變得越來越強大
5.2 Jenkins安裝
5.2.1 JDK安裝
(1)將jdk-8u171-linux-x64.rpm上傳至伺服器(虛擬機器)
(2)執行安裝命令
rpm -ivh jdk-8u171-linux-x64.rpm
RPM方式安裝JDK,其根目錄為:/usr/java/jdk1.8.0_171t
5.2.2 Jenkins安裝與啟動
(1)下載jenkins
wget https://pkg.jenkins.io/redhat/jenkins‐2.83‐1.1.noarch.rpm
(2)安裝jenkins
rpm ‐ivh jenkins‐2.83‐1.1.noarch.rpm
(3)配置jenkins
vi /etc/sysconfig/jenkins
修改使用者和埠
JENKINS_USER="root" JENKINS_PORT="8888"
(4)啟動服務
systemctl start jenkins
(5)訪問連結 http://192.168.184.135:8888
從/var/lib/jenkins/secrets/initialAdminPassword中獲取初始密碼串
(6)安裝外掛
(7)新建使用者
完成安裝進入主介面
5.3 Jenkins外掛安裝
5.3.1 安裝Maven外掛
(1)點選左側的“系統管理”選單 ,然後點選
(2)選擇“可選外掛”選項卡,搜尋maven,在列表中選擇Maven Integration ,點選“直接安裝”按鈕
5.3.2 安裝Git外掛
步驟如上圖,搜尋git
5.4 全域性工具配置
5.4.1 安裝Maven與本地倉庫
(1)將Maven壓縮包上傳至伺服器(虛擬機器)
(2)解壓
tar zxvf apache‐maven‐3.3.9‐bin.tar.gz
(3)移動目錄
mv apache‐maven‐3.3.9 /usr/local/maven
(4)編輯setting.xml配置檔案 vi/usr/local/maven/conf/settings.xml ,配置本地倉庫目錄,內容如下
<localRepository>/usr/local/repository</localRepository>
(5)將開發環境的本地倉庫上傳至伺服器(虛擬機器)並移動到/usr/local/repository 。
mv reponsitory_boot /usr/local/repository
執行此步是為了以後在打包的時候不必重新下載,縮短打包的時間。
(6)編輯setting.xml配置檔案,可不做
vi /usr/local/maven/conf/settings.xml
<pluginGroups> <pluginGroup>com.spotify</pluginGroup> </pluginGroups>
5.4.2 全域性工具配置
選擇系統管理,全域性工具配置
(1)JDK配置
設定javahome
(2)Git配置 (本地已經安裝了Git軟體)
(3)Maven配置
5.5 持續整合
5.5.1 建立任務
(1)回到首頁,點選新建按鈕 .如下圖,輸入名稱,選擇建立一個Maven專案,點選OK
(2)原始碼管理,選擇Git
(3)Build
命令:
clean package docker:build -DpushImage
用於清除、打包,構建docker映象,最後點選“儲存”按鈕
5.5.2 執行任務
返回首頁,在列表中找到我們剛才建立的任務
點選右邊的綠色箭頭按鈕,即可執行此任務。
點選正在執行的任務可以看到實時輸出的日誌
這就是映象做好了在上傳,如果你之前沒有將你的本地倉庫上傳到伺服器,會首先下載依賴的jar包,接下來就是漫長的等待了。
在瀏覽器看一下docker私有倉庫http://192.168.184.135:5000/v2/_catalog ,會看到tensquare_eureka已經上傳成功了
{"repositories":["jdk1.8","tensquare_eureka"]}