〇、准备工作
这里我们将使用fabric8平台提供的docker-maven-plugin
插件,用于构建Docker镜像并自动推送到远程Docker服务器和私有仓库.
首先编写一个简单的SpringBoot项目,项目结构如下所示:
- 父项目名称为
boot-docker-initial
,版本为1.0-SNAPSHOT
- 子项目只有一个,名称为
docker-helloworld
,版本为1.0
该Boot项目的功能很简单:用户使用浏览器访问http://localhost:8080/hello ,此时浏览器页面将会显示"你好,这是Docker容器当中的一个SpringBoot项目测试样例"
字样. 具体编写过程从略.
随后,来到子项目docker-helloworld
的pom.xml
文件当中,在dependencies
域下方添加打包插件:
xml
<build>
<plugins>
<!--将boot项目打包-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.2.RELEASE</version>
<configuration>
<!--将本地jar包也一并打包,强烈建议设置该选项-->
<includeSystemScope>true</includeSystemScope>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
插件spring-boot-maven-plugin
的作用就是将当前Boot项目打包为jar包,最终在项目根路径/target
目录下生成文件:docker-helloworld-1.0.jar
. 这里说的项目根路径
指pom.xml
文件所在的目录,可使用{project.basedir}
来表示.
接下来在plugins
域当中,添加一个坐标:
xml
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.37.0</version>
</plugin>
如果Maven并没有自动下载该插件,而是傻乎乎地报错,那么请将下列坐标放入子项目的dependencies
域当中:
xml
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.37.0</version>
</dependency>
此时Maven将会自动下载该插件. 下载完毕,plugins
域就不再出现红线警告了. 届时读者可从dependencies
域当中移除依赖io.fabric8: docker-maven-plugin:0.37.0
,但为了方便我们建议读者不要移除.
一、使用示例
Step 1
已知
- 我的虚拟机在通信子网当中的IP地址为
192.168.174.101
,主机域名为broker01
- Docker服务的连接地址为
tcp://192.168.174.101:2375
- 私有仓库部署在broker01上,
https://192.168.174.101:5000
或者http://192.168.174.101:5000
在docker-helloworld
的pom.xml
文件当中添加插件
第一种写法
xml
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.37.0</version>
<configuration>
<!--指定远程服务器的Docker服务访问地址-->
<dockerHost>tcp://192.168.174.101:2375</dockerHost>
<!--指定私有仓库的访问路径-->
<pushRegistry>http://192.168.174.101:5000</pushRegistry>
<!--指定私有仓库的用户名与密码-->
<authConfig>
<username>root</username>
<password>abc123</password>
</authConfig>
<images>
<image>
<!--指定私有仓库访问地址/镜像名称-->
<name>192.168.174.101:5000/${project.build.finalName}:${project.version}</name>
<build>
<!--指定Dockerfile的路径-->
<dockerFileDir>${project.basedir}</dockerFileDir>
</build>
<!--指定docker run命令的参数-->
<run>
<!--指定容器名称-->
<containerNamePattern>${project.artifactId}</containerNamePattern>
<ports>
<!--指定端口映射关系-->
<port>3344:8080</port>
</ports>
<volumes>
<!--挂载目录-->
<bind>
<volume>/home/docker/boot/helloworld:/ROOT</volume>
</bind>
</volumes>
</run>
</image>
</images>
</configuration>
<!--指定在每次打包或者重新打包的时候运行该插件的build, push, run目标-->
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
<goal>push</goal>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
点击package插件之后,Maven将会自动执行本插件的build, push, run目标.
第二种写法
如果不想执行run目标,那么可以精简为
xml
<!--将jar包打包为镜像-->
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.37.0</version>
<configuration>
<!--指定远程服务器的Docker服务访问地址-->
<dockerHost>tcp://192.168.174.101:2375</dockerHost>
<!--指定私有仓库的访问路径-->
<pushRegistry>http://192.168.174.101:5000</pushRegistry>
<!--指定私有仓库的用户名与密码-->
<authConfig>
<username>root</username>
<password>abc123</password>
</authConfig>
<images>
<image>
<!--指定私有仓库访问地址/镜像名称-->
<name>192.168.174.101:5000/${project.build.finalName}:${project.version}</name>
<build>
<!--指定Dockerfile的路径-->
<dockerFileDir>${project.basedir}</dockerFileDir>
</build>
</image>
</images>
</configuration>
<!--指定在每次打包或者重新打包的时候运行该插件的build, push, run目标-->
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
</plugin>
Step 2
在docker-helloworld
项目根路径下创建文件Dockerfile
,写上
bash
#基于openjdk:8-jre-slim构建镜像. 这是一个精简过的jre镜像,适合服务端程序使用
FROM openjdk:8-jre-slim
#将target目录下的jar文件复制到镜像根路径当中
COPY target/*.jar /app.jar
#对外暴露端口
EXPOSE 8080
#执行命令,不要使用CMD,必须使用ENTRYPOINT
ENTRYPOINT ["java","-jar","/app.jar"]
Step 3
打开IDEA当中的Maven菜单,展开boot-docker-initial
,点击Lifecycle
-package
,如图所示
或者打开IDEA终端`Terminal`,输入
go
mvn package
此时Maven将会自动构建工程、将工程打包为jar包、构建镜像、将镜像发布到远程Docker服务器和私有仓库.
Step 4
执行成功之后,在虚拟机当中执行命令
perl
docker images | grep docker-helloworld
可以看到命令行显示
bash
192.168.174.101:5000/docker-helloworld-1.0 1.0 7e1fea54a81c 3 minutes ago 223MB
Step 5
执行
arduino
docker run -d -p 3344:8080 --name docker-hwlloworld 192.168.174.101:5000/docker-helloworld-1.0:1.0
或者使用IDEA当中的Docker插件启动一个容器实例.
Step 6
确保虚拟机已经对物理机开放了3344
、2375
端口,使用物理机浏览器访问http://192.168.174.101:3344/hello ,可以看到浏览器页面显示"你好,这是Docker容器当中的一个SpringBoot项目测试样例"
字样. 如果读者采用第一种写法,那么可以看到控制台显示