最近又发现了一款好用的Maven插件,fabric8io出品的docker-maven-plugin
,能够把SpringBoot利用不便的部署到Docker容器中去。该插件能够实现打包镜像、推送到镜像仓库、运行利用等一系列操作,本文将对其用法进行具体介绍,心愿对大家有所帮忙!
SpringBoot实战电商我的项目mall(40k+star)地址:https://github.com/macrozheng/mall
装置公有镜像仓库
因为之后咱们须要推送到公有镜像仓库,咱们事后装置好,应用的是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 imagesREPOSITORY TAG IMAGE ID CREATED SIZE192.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 psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES95ce77c0394b 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...
本文 GitHub https://github.com/macrozheng/mall-learning 曾经收录,欢送大家Star!