使用Maven來構建Docker鏡像並上傳到私服倉庫

使用Maven來構建Docker鏡像並上傳到私服倉庫

    maven是一個強大的項目管理與構建工具,使用maven來構建docker鏡像,並自動上傳到私服倉庫,那麼就大大簡化了工作。

看到網上大部分都是使用的Spotify公司的插件,這裏我也選則此插件進行學習。

一 pom.xml中添加docker的插件

 <build>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.13</version>
                <configuration>
                   <forceTags>true</forceTags>    <!--覆蓋相同標籤鏡像-->
                    <imageName>my/eureka:0.0.1</imageName>  <!--指定鏡像名稱 倉庫/鏡像名:標籤-->
                    <baseImage>lwieske/java-8</baseImage>    <!--指定基礎鏡像,相當於dockerFile中的FROM<image> -->
                    <dockerHost>http://192.168.10.72:2375</dockerHost>  <!-- 指定倉庫地址 -->
                    <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint> <!-- 容器啓動執行的命令,相當於dockerFile的ENTRYPOINT -->
                    <resources>
                        <resource>                                             <!-- 指定資源文件 -->
                            <targetPath>/</targetPath>                         <!-- 指定要複製的目錄路徑,這裏是當前目錄 -->
                            <directory>${project.build.directory}</directory>  <!-- 指定要複製的根目錄,這裏是target目錄 -->
                            <include>${project.build.finalName}.jar</include>  <!-- 指定需要拷貝的文件,這裏指最後生成的jar包 -->
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

二 docker開啓遠程api端口

修改 /etc/sysconfig/docker文件

vi /etc/sysconfig/docker

在最下面添加一行

DOCKER_OPTS='-H unix:///var/run/docker.sock -H 0.0.0.0:2375'

再修改 /usr/systemd/system/docker.service

vi /usr/systemd/system/docker.service
在ExecStart後面添加 $DOCKER_OPTS \

重新加載配置文件

systemctl daemon-reload 

重啓docker

systemctl restart docker

三 開啓防火牆端口

firewall-cmd --zone=public --add-port=2375/tcp --permanent    (--permanent永久生效,沒有此參數重啓後失效)

重新載入配置

irewall-cmd --reload

四 執行mvn命令來構建docker鏡像


運行命令


查看服務器上鏡像列表


運行鏡像


查看結果


可以看到我們的項目已經成功啓動了,並且在主機可以直接訪問,這說明docker自動幫我們開啓了防火牆的端口訪問。

如果要使用dockerfile構建鏡像


FROM lwieske/java-8
VOLUME /tmp
ADD discovery-1.0-SNAPSHOT.jar discovery.jar
EXPOSE 8002
CMD ["java","-Djava.security.egd=file:/dev/./urandom","-jar","discovery.jar"]
 <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.13</version>
                <configuration>
                    <forceTags>true</forceTags>    <!--覆蓋相同標籤鏡像-->
                    <imageName>my/eureka:0.0.2</imageName>  <!--指定鏡像名稱 倉庫/鏡像名:標籤-->
                    <dockerHost>http://192.168.10.73:2375</dockerHost>  <!-- 指定倉庫地址 -->
                    <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>   <!--dockerfile文件路徑-->
                    <resources>
                        <resource>                                             <!-- 指定資源文件 -->
                            <targetPath>/</targetPath>                         <!-- 指定要複製的目錄路徑,這裏是當前目錄 -->
                            <directory>${project.build.directory}</directory>  <!-- 指定要複製的根目錄,這裏是target目錄 -->
                            <include>${project.build.finalName}.jar</include>  <!-- 指定需要拷貝的文件,這裏指最後生成的jar包 -->
                        </resource>
                    </resources>
                </configuration>
            </plugin>



測試運行dockerfile構建的鏡像




五 將docker綁定到mvn其它命令執行

比如我們想在項目mvn package的時候同時構建docker上傳到服務器。

<build>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.13</version>
                <executions>
                    <execution>
                        <id>build-image</id>     <!--定義一個執行命令的id-->
                        <phase>package</phase>   <!--綁定mvn的哪個命令-->
                        <goals>
                            <goal>build</goal>   <!--要執行的命令 -->
                        </goals>
                    </execution>
                </executions>               
                 <configuration>
                   <forceTags>true</forceTags>    <!--覆蓋相同標籤鏡像-->
                    <imageName>my/eureka:0.0.1</imageName>  <!--指定鏡像名稱 倉庫/鏡像名:標籤-->
                    <baseImage>lwieske/java-8</baseImage>    <!--指定基礎鏡像,相當於dockerFile中的FROM<image> -->
                    <dockerHost>http://192.168.10.72:2375</dockerHost>  <!-- 指定倉庫地址 -->
                    <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint> <!-- 容器啓動執行的命令,相當於dockerFile的ENTRYPOINT -->
                    <resources>
                        <resource>                                             <!-- 指定資源文件 -->
                            <targetPath>/</targetPath>                         <!-- 指定要複製的目錄路徑,這裏是當前目錄 -->
                            <directory>${project.build.directory}</directory>  <!-- 指定要複製的根目錄,這裏是target目錄 -->
                            <include>${project.build.finalName}.jar</include>  <!-- 指定需要拷貝的文件,這裏指最後生成的jar包 -->
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

可以看到,我們在原來的基礎上只是新增了<executions/>標籤內容,運行測試結果



六  mvn構建docker後並push到私服倉庫

<build>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.13</version>
                <executions>
                    <execution>
                        <id>build-image</id>     <!--定義一個執行命令的id-->
                        <phase>package</phase>   <!--綁定mvn的哪個命令-->
                        <goals>
                            <goal>build</goal>   <!--要執行的命令 -->
                        </goals>
                    </execution>
                     <execution>
                       <id>image-tag</id>
                       <phase>package</phase>
                       <goals>
                           <goal>tag</goal>      <!--tag命令,相當於docker的tag命令-->
                       </goals>
                       <configuration>
                           <image>my/eureka:0.0.1</image>   <!--鏡像名-->
                           <newName>192.168.10.73:5000/my/eureka:0.0.1</newName>   <!--打的標籤名-->
                       </configuration>
                   </execution>
                   <execution>
                       <id>package-push</id>
                       <phase>package</phase>
                       <goals>
                           <goal>push</goal>    <!--相當於docker的push命令-->
                       </goals>
                       <configuration>
                           <imageName>192.168.10.73:5000/my/eureka:0.0.1</imageName>  <!--要push的鏡像名-->
                       </configuration>
                   </execution>

                </executions>               
                 <configuration>
                   <forceTags>true</forceTags>    <!--覆蓋相同標籤鏡像-->
                    <imageName>my/eureka:0.0.1</imageName>  <!--指定鏡像名稱 倉庫/鏡像名:標籤-->
                    <baseImage>lwieske/java-8</baseImage>    <!--指定基礎鏡像,相當於dockerFile中的FROM<image> -->
                    <dockerHost>http://192.168.10.73:2375</dockerHost>  <!-- 指定倉庫地址 -->
                    <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint> <!-- 容器啓動執行的命令,相當於dockerFile的ENTRYPOINT -->
                    <resources>
                        <resource>                                             <!-- 指定資源文件 -->
                            <targetPath>/</targetPath>                         <!-- 指定要複製的目錄路徑,這裏是當前目錄 -->
                            <directory>${project.build.directory}</directory>  <!-- 指定要複製的根目錄,這裏是target目錄 -->
                            <include>${project.build.finalName}.jar</include>  <!-- 指定需要拷貝的文件,這裏指最後生成的jar包 -->
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>
可以看到,又綁定了兩個命令,類似於在docker中先給鏡像打標籤後再push到倉庫

測試運行

 將鏡像推送到私有庫,報協議錯誤
error:Get https://192.168.10.73:5000/v1/_ping: http: server gave HTTP response to HTTPS client
在/etc/docker下,創建daemon.json文件,寫入:
{ "insecure-registries":["192.168.10.73:5000"]}  
或者
1.修改/etc/sysconfig/docker文件,在最後增加一行DOCKER_OPTS
DOCKER_OPTIONS="--insecure-registry 192.168.10.73:5000"
2.修改/usr/lib/systemd/system/docker.service
在[Service]的ExexStart=下面增加一行$DOCKER_OPTIONS 

注意:改成自己服務器ip地址

重啓docker後,再次執行


push成功,我們看一下遠程倉庫是否有這個鏡像



七 push鏡像到docker hub 上

在maven的 settings.xml 中添加

<servers>
    <server>
        <id>docker-hub</id>
        <username>DockerHub 的賬號</username>
        <password>DockerHub 的密碼</password>
        <configuration>
            <email>你的eamil</email>
        </configuration>
    </server>
</servers>

pom.xml中修改如下

<plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.13</version>
                <configuration>
                    <forceTags>true</forceTags>    <!--覆蓋相同標籤鏡像-->
                    <imageName>my/eureka:0.0.2</imageName>  <!--指定鏡像名稱 倉庫/鏡像名:標籤-->
                    <dockerHost>http://192.168.10.73:2375</dockerHost>  <!-- 指定倉庫地址 -->
                    <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>   <!--dockerfile文件路徑-->
                    <resources>
                        <resource>                                             <!-- 指定資源文件 -->
                            <targetPath>/</targetPath>                         <!-- 指定要複製的目錄路徑,這裏是當前目錄 -->
                            <directory>${project.build.directory}</directory>  <!-- 指定要複製的根目錄,這裏是target目錄 -->
                            <include>${project.build.finalName}.jar</include>  <!-- 指定需要拷貝的文件,這裏指最後生成的jar包 -->
                        </resource>
                    </resources>
                <serverId>docker-hub</serverId>   <!--mvn setting.xml配置的那個id-->
                </configuration>
            </plugin>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章