使用docker-maven-plugin部署SpringBoot應用

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

安裝私有鏡像倉庫 由於之後我們需要推送到私有鏡像倉庫,我們預先安裝好,使用的是Docker公司開發的私有鏡像倉庫Registry。

下載Registry的Docker鏡像; docker pull registry:2 使用Docker容器運行Registry服務,需要添加環境變量REGISTRY_STORAGE_DELETE_ENABLED=true開啓刪除鏡像的功能; 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服務。 systemctl daemon-reload && systemctl restart docker 鏡像倉庫可視化 由於私有鏡像倉庫管理比較麻煩,而docker-registry-ui有專門的頁面可以方便地管理鏡像,所以我們安裝它來管理私有鏡像倉庫。

下載docker-registry-ui的Docker鏡像; 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

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

在IDEA中正確使用Maven插件 一般我們如果沒有使用IDEA,都是手敲Maven命令來執行,在IDEA中我們只要雙擊右側面板中的Maven命令即可執行,非常方便。

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

構建鏡像 要想使用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 之後在我們的私有鏡像倉庫就可以看到鏡像了;

操作容器 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 項目源碼地址 https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-fabric

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