1. 程式人生 > >詳解Dockerfile,並構建docker私有庫,通過maven自動構建映象和部署,達到持續整合

詳解Dockerfile,並構建docker私有庫,通過maven自動構建映象和部署,達到持續整合

上篇給大家簡單的介紹了一下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遠端連線,個人認為此處有坑