還在手動部署SpringBoot應用?試試這個自動化插件

最近又發現了一款好用的Maven插件,fabric8io出品的docker-maven-plugin,能夠把SpringBoot應用方便的部署到Docker容器中去。該插件能夠實現打包鏡像、推送到鏡像倉庫、運行應用等一系列操做,css


本文將對其用法進行詳細介紹,但願對你們有所幫助!java

安裝私有鏡像倉庫


因爲以後咱們須要推送到私有鏡像倉庫,咱們預先安裝好,使用的是Docker公司開發的私有鏡像倉庫Registry。mysql

  • 下載Registry的Docker鏡像;linux

docker pull registry:2
  • 使用Docker容器運行Registry服務,須要添加環境變量REGISTRY_STORAGE_DELETE_ENABLED=true開啓刪除鏡像的功能;nginx

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默認使用HTTPS推送鏡像,而咱們的鏡像倉庫沒有支持,因此須要添加以下配置,改成使用HTTP推送;面試

{
  "insecure-registries": ["192.168.3.101:5000"]
}
  • 最後使用以下命令重啓Docker服務。sql

systemctl daemon-reload && systemctl restart docker

鏡像倉庫可視化

因爲私有鏡像倉庫管理比較麻煩,而docker-registry-ui有專門的頁面能夠方便地管理鏡像,因此咱們安裝它來管理私有鏡像倉庫。docker

  • 下載docker-registry-ui的Docker鏡像;json

docker pull joxit/docker-registry-ui:static
  • 使用Docker容器運行docker-registry-ui服務;服務器

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
  • 咱們先來試試私有鏡像倉庫是否可用,首先下載一個測試用的鏡像busybox

docker pull busybox
  • 給鏡像busybox打上私有倉庫的標籤,並設置版本爲v1.0

docker tag busybox 192.168.3.101:5000/busybox:v1.0
  • 以後推送到私有鏡像倉庫去;

docker push 192.168.3.101:5000/busybox:v1.0
  • 訪問docker-registry-ui管理界面,便可查看到busybox鏡像,地址:http://192.168.3.101:8280

還在手動部署SpringBoot應用?試試這個自動化插件


插件使用

fabric8io出品的docker-maven-plugin是一款集Docker鏡像管理和容器管理於一身的插件,動動手指就能夠把咱們的SpringBoot應用部署到Docker容器中了,很是好用,下面來說講它的用法。

在IDEA中正確使用Maven插件

  • 通常咱們若是沒有使用IDEA,都是手敲Maven命令來執行,在IDEA中咱們只要雙擊右側面板中的Maven命令便可執行,很是方便。

還在手動部署SpringBoot應用?試試這個自動化插件


  • 若是你想使用自定義命令的話,可使用Execute Maven Goal這個功能,這裏我使用的是mvn clean package命令。

還在手動部署SpringBoot應用?試試這個自動化插件


構建鏡像

  • 要想使用docker-maven-plugin,須要在pom.xml中添加該插件;

<build>
    <plugins>
        <plugin>
            <groupId>io.fabric8</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>0.33.0</version>
            <configuration>
                <!-- Docker 遠程管理地址-->
                <dockerHost>http://192.168.3.101:2375</dockerHost>
                <!-- Docker 推送鏡像倉庫地址-->
                <pushRegistry>http://192.168.3.101:5000</pushRegistry>
                <images>
                    <image>
                        <!--因爲推送到私有鏡像倉庫,鏡像名須要添加倉庫地址-->
                        <name>192.168.3.101:5000/mall-tiny/${project.name}:${project.version}</name>
                        <!--定義鏡像構建行爲-->
                        <build>
                            <!--定義基礎鏡像-->
                            <from>java:8</from>
                            <args>
                                <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
                            </args>
                            <!--定義哪些文件拷貝到容器中-->
                            <assembly>
                                <!--定義拷貝到容器的目錄-->
                                <targetDir>/</targetDir>
                                <!--只拷貝生成的jar包-->
                                <descriptorRef>artifact</descriptorRef>
                            </assembly>
                            <!--定義容器啓動命令-->
                            <entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
                            <!--定義維護者-->
                            <maintainer>macrozheng</maintainer>
                        </build>
                    </image>
                </images>
            </configuration>
        </plugin>
    </plugins>
</build>
  • 咱們構建鏡像以前須要先將項目打包,而後再構建,不然會出錯,直接使用以下命令便可;

mvn package docker:build
  • 打包完成後就能夠在咱們的服務器上看到這個鏡像了;

[root@linux-local mydata]# docker images
REPOSITORY                                     TAG                 IMAGE ID            CREATED             SIZE
192.168.3.101:5000/mall-tiny/mall-tiny-fabric   0.0.1-SNAPSHOT      6b8bc6faeb0b        9 seconds ago       680MB
  • 固然咱們也能夠設置使用package命令時直接打包鏡像,修改pom.xml,在<plugin>節點下添加<executions>配置便可;

<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.33.0</version>
    <executions>
        <!--若是想在項目打包時構建鏡像添加-->
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
</plugin>
  • 使用不一樣的Maven插件構建Docker鏡像時方法每每不一樣,這時候直接使用Dockerfile來構建會比較好,咱們先寫好Dockerfile文件並放到項目根目錄下;

# 該鏡像須要依賴的基礎鏡像
FROM java:8
# 將當前maven目錄生成的文件複製到docker容器的/目錄下COPY maven /# 聲明服務運行在8080端口
EXPOSE 8080
# 指定docker容器啓動時運行jar包ENTRYPOINT ["java""-jar","/mall-tiny-fabric-0.0.1-SNAPSHOT.jar"]
# 指定維護者的名字MAINTAINER macrozheng
  • 而後修改pom.xml文件,將<build>節點配置替換爲以下內容,僅需配置Dockerfile所在目錄便可。

<build>
     <dockerFileDir>${project.basedir}</dockerFileDir>
</build>

推送到鏡像倉庫

  • 接下來咱們使用docker:push命令便可把鏡像推送到私有鏡像倉庫;

mvn docker:push
  • 以後在咱們的私有鏡像倉庫就能夠看到鏡像了;

還在手動部署SpringBoot應用?試試這個自動化插件


操做容器

  • docker-maven-plugin不只能夠操做鏡像,還能夠操做容器,好比咱們之前須要使用以下Docker命令來運行容器;

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
  • 如今咱們只需在插件中配置便可,在<image>節點下添加<run>節點能夠定義容器啓動的行爲:

<!--定義容器啓動行爲-->
<run>
    <!--設置容器名,可採用通配符-->
    <containerNamePattern>${project.artifactId}</containerNamePattern>
    <!--設置端口映射-->
    <ports>
        <port>8080:8080</port>
    </ports>
    <!--設置容器間鏈接-->
    <links>
        <link>mysql:db</link>
    </links>
    <!--設置容器和宿主機目錄掛載-->
    <volumes>
        <bind>
            <volume>/etc/localtime:/etc/localtime</volume>
            <volume>/mydata/app/${project.artifactId}/logs:/var/logs</volume>
        </bind>
    </volumes>
</run>
  • 以後直接使用docker:start命令便可啓動了;

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

推薦學習Spring Boot超牛教程: 2020年B站最好的Spring Boot入門到進階教程,吊打面試官不是事!