還在手動(dòng)部署SpringBoot應(yīng)用?試試這個(gè)自動(dòng)化插件

最近又發(fā)現(xiàn)了一款好用的Maven插件,fabric8io出品的docker-maven-plugin,可以把SpringBoot應(yīng)用方便的部署到Docker容器中去。該插件可以實(shí)現(xiàn)打包鏡像、推送到鏡像倉(cāng)庫(kù)、運(yùn)行應(yīng)用等一系列操作,本文將對(duì)其用法進(jìn)行詳細(xì)介紹,希望對(duì)大家有所幫助!

安裝私有鏡像倉(cāng)庫(kù)

由于之后我們需要推送到私有鏡像倉(cāng)庫(kù),我們預(yù)先安裝好,使用的是Docker公司開(kāi)發(fā)的私有鏡像倉(cāng)庫(kù)Registry。

  • 下載Registry的Docker鏡像;
docker pull registry:2
  • 使用Docker容器運(yùn)行Registry服務(wù),需要添加環(huán)境變量REGISTRY_STORAGE_DELETE_ENABLED=true開(kāi)啟刪除鏡像的功能;
docker run -p 5000:5000 --name registry2 \
--restart=always \-e REGISTRY_STORAGE_DELETE_ENABLED="true" \
-d registry:2
  • 修改Docker Daemon的配置文件,文件位置為/etc/docker/daemon.json,由于Docker默認(rèn)使用HTTPS推送鏡像,而我們的鏡像倉(cāng)庫(kù)沒(méi)有支持,所以需要添加如下配置,改為使用HTTP推送;
{
  "insecure-registries": ["192.168.3.101:5000"]
}
  • 最后使用如下命令重啟Docker服務(wù)。
systemctl daemon-reload && systemctl restart docker

鏡像倉(cāng)庫(kù)可視化

由于私有鏡像倉(cāng)庫(kù)管理比較麻煩,而docker-registry-ui有專(zhuān)門(mén)的頁(yè)面可以方便地管理鏡像,所以我們安裝它來(lái)管理私有鏡像倉(cāng)庫(kù)。

  • 下載docker-registry-ui的Docker鏡像;
docker pull joxit/docker-registry-ui:static
  • 使用Docker容器運(yùn)行docker-registry-ui服務(wù);
docker run -p 8280:80 --name registry-ui \
--link registry2:registry2 \-e REGISTRY_URL="http://registry2:5000" \
-e DELETE_IMAGES="true" \
-e REGISTRY_TITLE="Registry2" \
-d joxit/docker-registry-ui:static
  • 我們先來(lái)試試私有鏡像倉(cāng)庫(kù)是否可用,首先下載一個(gè)測(cè)試用的鏡像busybox;
docker pull busybox
  • 給鏡像busybox打上私有倉(cāng)庫(kù)的標(biāo)簽,并設(shè)置版本為v1.0;
docker tag busybox 192.168.3.101:5000/busybox:v1.0
  • 之后推送到私有鏡像倉(cāng)庫(kù)去;
docker push 192.168.3.101:5000/busybox:v1.0
  • 訪(fǎng)問(wèn)docker-registry-ui管理界面,即可查看到busybox鏡像,地址:http://192.168.3.101:8280
還在手動(dòng)部署SpringBoot應(yīng)用?試試這個(gè)自動(dòng)化插件

插件使用

fabric8io出品的docker-maven-plugin是一款集Docker鏡像管理和容器管理于一身的插件,動(dòng)動(dòng)手指就可以把我們的SpringBoot應(yīng)用部署到Docker容器中了,非常好用,下面來(lái)講講它的用法。

在IDEA中正確使用Maven插件

  • 一般我們?nèi)绻麤](méi)有使用IDEA,都是手敲Maven命令來(lái)執(zhí)行,在IDEA中我們只要雙擊右側(cè)面板中的Maven命令即可執(zhí)行,非常方便。
還在手動(dòng)部署SpringBoot應(yīng)用?試試這個(gè)自動(dòng)化插件
  • 如果你想使用自定義命令的話(huà),可以使用Execute Maven Goal這個(gè)功能,這里我使用的是mvn clean package命令。
還在手動(dòng)部署SpringBoot應(yīng)用?試試這個(gè)自動(dòng)化插件

構(gòu)建鏡像

  • 要想使用docker-maven-plugin,需要在pom.xml中添加該插件;
<build>
    <plugins>
        <plugin>
            <groupId>io.fabric8</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>0.33.0</version>
            <configuration>
                <!-- Docker 遠(yuǎn)程管理地址-->
                <dockerHost>http://192.168.3.101:2375</dockerHost>
                <!-- Docker 推送鏡像倉(cāng)庫(kù)地址-->
                <pushRegistry>http://192.168.3.101:5000</pushRegistry>
                <images>
                    <image>
                        <!--由于推送到私有鏡像倉(cāng)庫(kù),鏡像名需要添加倉(cāng)庫(kù)地址-->
                        <name>192.168.3.101:5000/mall-tiny/${project.name}:${project.version}</name>
                        <!--定義鏡像構(gòu)建行為-->
                        <build>
                            <!--定義基礎(chǔ)鏡像-->
                            <from>java:8</from>
                            <args>
                                <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
                            </args>
                            <!--定義哪些文件拷貝到容器中-->
                            <assembly>
                                <!--定義拷貝到容器的目錄-->
                                <targetDir>/</targetDir>
                                <!--只拷貝生成的jar包-->
                                <descriptorRef>artifact</descriptorRef>
                            </assembly>
                            <!--定義容器啟動(dòng)命令-->
                            <entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
                            <!--定義維護(hù)者-->
                            <maintainer>macrozheng</maintainer>
                        </build>
                    </image>
                </images>
            </configuration>
        </plugin>
    </plugins>
</build>
  • 我們構(gòu)建鏡像之前需要先將項(xiàng)目打包,然后再構(gòu)建,否則會(huì)出錯(cuò),直接使用如下命令即可;
mvn package docker:build
  • 打包完成后就可以在我們的服務(wù)器上看到這個(gè)鏡像了;
[root@linux-local mydata]# docker images
REPOSITORY                                     TAG                 IMAG
E ID            CREATED             SIZE
192.168.3.101:5000/mall-tiny/mall-tiny-fabric   0.0.1-SNAPSHOT      6b8bc6faeb0b        
9 seconds ago       680MB
  • 當(dāng)然我們也可以設(shè)置使用package命令時(shí)直接打包鏡像,修改pom.xml,在<plugin>節(jié)點(diǎn)下添加<executions>配置即可;
<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.33.0</version>
    <executions>
        <!--如果想在項(xiàng)目打包時(shí)構(gòu)建鏡像添加-->
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
</plugin>
  • 使用不同的Maven插件構(gòu)建Docker鏡像時(shí)方法往往不同,這時(shí)候直接使用Dockerfile來(lái)構(gòu)建會(huì)比較好,我們先寫(xiě)好Dockerfile文件并放到項(xiàng)目根目錄下;
# 該鏡像需要依賴(lài)的基礎(chǔ)鏡像
FROM java:8
# 將當(dāng)前maven目錄生成的文件復(fù)制到docker容器的/目錄下COPY maven /# 聲明服務(wù)
運(yùn)行在8080端口
EXPOSE 8080
# 指定docker容器啟動(dòng)時(shí)運(yùn)行jar包ENTRYPOINT ["java", "-jar","/mall-tiny-
fabric-0.0.1-SNAPSHOT.jar"]
# 指定維護(hù)者的名字MAINTAINER macrozheng
  • 然后修改pom.xml文件,將<build>節(jié)點(diǎn)配置替換為如下內(nèi)容,僅需配置Dockerfile所在目錄即可。
<build>
     <dockerFileDir>${project.basedir}</dockerFileDir>
</build>

推送到鏡像倉(cāng)庫(kù)

  • 接下來(lái)我們使用docker:push命令即可把鏡像推送到私有鏡像倉(cāng)庫(kù);
mvn docker:push
  • 之后在我們的私有鏡像倉(cāng)庫(kù)就可以看到鏡像了;
還在手動(dòng)部署SpringBoot應(yīng)用?試試這個(gè)自動(dòng)化插件

操作容器

  • docker-maven-plugin不僅可以操作鏡像,還可以操作容器,比如我們以前需要使用如下Docker命令來(lái)運(yùn)行容器;
docker run -p 8080:8080 --name mall-tiny-fabric \
--link mysql:db \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/mall-tiny-fabric/logs:/var/logs \
-d 192.168.3.101:5000/mall-tiny/mall-tiny-fabric:0.0.1-SNAPSHOT
  • 現(xiàn)在我們只需在插件中配置即可,在<image>節(jié)點(diǎn)下添加<run>節(jié)點(diǎn)可以定義容器啟動(dòng)的行為:
<!--定義容器啟動(dòng)行為-->
<run>
    <!--設(shè)置容器名,可采用通配符-->
    <containerNamePattern>${project.artifactId}</containerNamePattern>
    <!--設(shè)置端口映射-->
    <ports>
        <port>8080:8080</port>
    </ports>
    <!--設(shè)置容器間連接-->
    <links>
        <link>mysql:db</link>
    </links>
    <!--設(shè)置容器和宿主機(jī)目錄掛載-->
    <volumes>
        <bind>
            <volume>/etc/localtime:/etc/localtime</volume>
            <volume>/mydata/app/${project.artifactId}/logs:/var/logs</volume>
        </bind>
    </volumes>
</run>
  • 之后直接使用docker:start命令即可啟動(dòng)了;
mvn docker:start
[root@linux-local mydata]# docker ps
CONTAINER ID        IMAGE  
           COMMAND                  CREATED             STATUS              
     PORTS                                            NAMES
95ce77c0394b        192.168.3.101:5000/mall-tiny/mall-tiny-
fabric:0.0.1-SNAPSHOT   "java -jar /mall-
tin…"   32 seconds ago      Up 31 seconds       0.0.0.0:8080-
>8080/tcp                           mall-tiny-fabric
  • 停止容器使用docker:stop命令即可;
mvn docker:stop
  • 刪除容器使用docker:remove命令,是不是很方便!
mvn docker:remove
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容