最近又发现了一款好用的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
fabric8io出品的docker-maven-plugin是一款集Docker镜像管理和容器管理于一身的插件,动动手指就能够把咱们的SpringBoot应用部署到Docker容器中了,很是好用,下面来说讲它的用法。
通常咱们若是没有使用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
推荐学习Spring Boot超牛教程: 2020年B站最好的Spring Boot入门到进阶教程,吊打面试官不是事!