詳解Dockerfile,並構建docker私有庫,通過maven自動構建映象和部署,達到持續整合
阿新 • • 發佈:2018-12-26
上篇給大家簡單的介紹了一下docker的架構,已經常用命令.
今天帶大家通過Dockerfile構建docker映象,並構建docker私有倉庫,通過maven進行打包自動構建映象自動部署,達到持續整合目的
廢話不多說,首先介紹下Dockerfile中常用的命令
FROM
格式為: FROM name
指依賴的基礎映象是....
RUN
指要執行的命令
ADD
複製檔案 格式為:
ADD ['src', 'dksrc']
注意: src可以是一個路徑,也可以是一個url,還可以是一個壓縮包,如果dksrc不是以/結尾將被識別為一個檔案,如果以/結尾將識別為一個目錄
ARG
是用於構建引數
容器的啟動命令,只會執行一條.如果有多個,最後一條會被執行 目前支援三種格式:CMD
CMD ["executable","param1","param2"] (推薦使用)
CMD ["param1","param2"] (為ENTRYPOINT指令提供預設引數)
CMD command param1 param2 (在shell中執行)
COPY
複製檔案 格式為:
COPY src dksrc
COPY ["src","dksrc"]
COPY 不支援url和壓縮包
ENTRYPOINT
用於構建引數和CMD相似 可以設定多條只有最後一條會被執行
這個命令很重要,只用來設定環境變數 格式為:ENV
ENV KEY VALUE
ENV KEY=VALUE
EXPOSE
用於宣告暴露的埠 格式為:
EXPOSE PORT
EXPOSE PORT1 PORT2 PORT3
注意:並不是聲明後容器就會開啟響應的埠,只是告訴使用者
MAINTAINER
這個用處不大,用來指定維護者資訊,VOLUME
指定掛在點大概常用的幾個命令介紹完了,下面帶大家構建一下
FROM java:8 VOLUME /home/gang ADD gang-spring-cloud-eureka-1.0-SNAPSHOT.jar /app.jar RUN bash -c 'touch /app.jar' EXPOSE 8761 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
這是我的Dockerfile 在home目錄下面, 下面我們通過docker build -t name . 進行構建,其中最後的點代表Dockerfile在本目錄.
docker build -t test/testeureka:0.1 .
如圖所示出現
Successfully built f0acb0fed231
即表示構建成功,我們在看下本地的映象 通過docker images
docker images
此時本地已經有了testeureka這個映象了 但是我們從dockerGub上pull映象的時候太慢了.所有我推薦自己建立私有倉庫,我們可以吧這個私有倉庫看做是maven的私服.倉庫中的映象看做是jar.這樣或許好理解多了. 現在我們構建私有倉庫
很簡單,
docker run -d -p 5000:5000 --restart=always --name registry2 registry:2
預設啟動的是5000埠 這個時候我們就可以吧剛剛創建立的映象push到我們的私有倉庫上了.
docker push name
但是我們會發現執行失敗,因為預設是docker hub,所以我們要設定映象標籤
docker tag name localhost:5000/name
這個時候在執行push就可以了.docker push name localhost:5000/name
但是我們怎麼檢視私有倉庫中的映象呢?
# curl -XGET http://registry:5000/v2/_catalog
# curl -XGET http://registry:5000/v2/image_name/tags/list
通過這兩個命令就可以檢視,當我們需要pull映象時候就可以從私有倉庫中直接拉去,這樣方便許多 現在微服務流行,一個微服務可能有成百上千的服務,這時候,如果通過人為一一去部署......後果可想而知, 這個時候結合docker git maven 就可以快速的部署,以及持續整合, 下面咱們通過docker部署一個spring-cloud-eureka 的微服務,經過查詢資料,找到一個maven外掛
docker-maven-plugin
當然也是看了周立大神的著作,學到的.
下面是我的pom.xml
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.3</version>
<configuration>
<!--映象名稱-->
<imageName>eurak1</imageName>
<!--相當於from基於父映象-->
<baseImage>java</baseImage>
<entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
這時候我們在ideal中執行mvn clean package docker:build 發現報錯
發現需要連線docker服務,於是改pom.xml為下
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.3</version>
<configuration>
<!--映象名稱-->
<imageName>eurak1</imageName>
<!--相當於from基於父映象-->
<baseImage>java</baseImage>
<!--遠端docker服務地址-->
<!--<dockerHost>http://192.168.68.128:2375</dockerHost>-->
<entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
但是發現還是不行,還是報錯,連線192.168.68.128超時,怎麼回事呢,明明開著docker服務的????
後來發現,就像redis一樣需要開啟遠端訪問,其實好多技術思想都是一樣的.只不過每個技術的實施方式不同而已
於是設定docker開啟遠端連線.以後再進行打包部署
已經構建成功了,我們再看192.168.68.128上的docker映象,
已經有這個映象了.其實是docker-maven-plugin這個外掛幫我們寫了一個Dockerfile 然後去遠端docker上執行的構建,我們也可以指定自己的Dockerfile,達到自動部署目的
通過配置
<dockerDirectory>
即可載入自定義的Dockerfile
我們也可以通過配置maven中的settings檔案,達到構建完成後自動上傳到docker倉庫中.即可持續整合
個人能力有限,只能介紹這麼多了,有錯誤之處望見諒.下篇為大家介紹如何開啟docker遠端連線,個人認為此處有坑