學習目標
- 理解Dockerfile的作用,能編寫簡單的Dockerfile腳本完成鏡像的構建
- 完成Docker私有倉庫的構建,能夠運用Maven插件完成鏡像的創建與上傳
- 能夠使用Jenkins完成代碼的持續集成
1 Dockerfile
1.1 什么是Dockerfile
Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終創建一個新的鏡像。
1、對於開發人員:可以為開發團隊提供一個完全一致的開發環境;
2、對於測試人員:可以直接拿開發時所構建的鏡像或者通過Dockerfile文件構建一個新的鏡像開始工作了;
3、對於運維人員:在部署時,可以實現應用的無縫移植。
1.2 常用命令
FROM image_name:tag 定義了使用哪個基礎鏡像啟動構建流程
MAINTAINER user_name 聲明鏡像的創建者
ENV key value 設置環境變量 (可以寫多條)
RUN command 是Dockerfile的核心部分(可以寫多條)
ADD source_dir/file dest_dir/file 將宿主機的文件復制到容器內,如果是一個壓縮文件,將會在復制后自動解壓
COPY source_dir/file dest_dir/file 和ADD相似,但是如果有壓縮文件並不能解壓
WORKDIR path_dir 設置工作目錄
EXPOSE port1 prot2 用來指定端口,使容器內的應用可以通過端口和外界交互
CMD argument 在構建容器時使用,會被docker run 后的argument覆蓋
ENTRYPOINT argument 和CMD相似,但是並不會被docker run指定的參數覆蓋
VOLUME 將本地文件夾或者其他容器的文件掛載到容器中
1.3 使用腳本創建鏡像
步驟:
(1)創建目錄
mkdir –p /usr/local/dockerjdk8
(2)下載jdk-8u171-linux-x64.tar.gz並上傳到服務器(虛擬機)中的/usr/local/dockerjdk8目錄
(3)創建文件Dockerfile vi Dockerfile
#依賴鏡像名稱和ID FROM centos:7 #指定鏡像創建者信息 MAINTAINER IT #切換工作目錄 WORKDIR /usr RUN mkdir /usr/local/java #ADD 是相對路徑jar,把java添加到容器中 ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/ #配置java環境變量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_171 ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENV PATH $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"]}