最近又發現了一款好用的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
還在手動部署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 IMAG
E 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