扯淡:
前面章节,使用 Dockerfile 构建了自己的镜像,但是在企业微服务开发中,微服务的数量是非常多的,如果将服务一个一个的上传到宿主机、编写Dockerfile,然后使用 docker build 命令构建镜像,效率是非常低的。本章将介绍使用 Maven 插件构建镜像。
个人学习总结:
链接:【springboot、springcloud、docker 等,学习目录】
准备工作:
maven构建docker镜像,需要远程连接到docker所在的宿主机,其默认端口是 2375,远程连接 docker 需要修改 docker 的配置文件。
1、修改docker.service
vi /lib/systemd/system/docker.service
在 ExecStart= 后添加配置 ‐H tcp://0.0.0.0:2375 ‐H unix:///var/run/docker.sock ,0.0.0.0 代表所有 ip ,也可指定 ip。
2、刷新、重启:
systemctl daemon-reload
systemctl restart docker
3、启动 私有仓库 docker start 私有仓库容器
Maven 插件构建镜像:
maven插件构建镜像有:全pom标签和读取Dockerfile两种方式。
方式一:全pom方式:
此种方式由于标签的限制,较模板化。
1、pom 依赖添加docker-maven插件
<build>
<!-- jar包的名字,也可不指定,默认为artifactId和version组合-->
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docker的maven插件,官网:https://github.com/spotify/docker‐maven‐plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<!-- 镜像名称 -->
<!--<imageName>${project.artifactId}:${project.version}</imageName>-->
<imageName>192.168.25.131:4000/${project.artifactId}:${project.version}</imageName>
<!-- 基础镜像 -->
<baseImage>java</baseImage>
<!-- entrypoint:类似于Dockerfile的ENTRYPOINT指令 -->
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<!-- 用于指定需要复制的根目录,${project.build.directory}表示target目录。 -->
<directory>${project.build.directory}</directory>
<!-- 用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar包文件。 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<dockerHost>http://192.168.25.131:2375</dockerHost>
<!-- 如需重复构建相同标签名称的镜像,可将forceTags设为true,这样就会覆盖构建相同标签的镜像。 -->
<forceTags>true</forceTags>
</configuration>
</plugin>
</plugins>
</build>
2、到工程目录cmd 执行mvn 打包:
# 打包命令
mvn clean package docker:build ‐DpushImage
看到如下构建步骤信息:
上传信息:
查看私有仓库:
执行docker images 同样可以看到构建的镜像。
方式二:引入 Dockerfile 构建镜像:
1、项目 src/main 下创建docker 目录,新建 Dockerfile:
2、编写 Dockerfile:
# 基础镜像
FROM java:8
# 作者
MAINTAINER Ron
# 数据卷
VOLUME /tmp
# 复制工程打包后 target 目录下的jar 到容器中
ADD app.jar app.jar
# 端口
EXPOSE 12000
# 创建容器执行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
3、修改 pom 依赖:
主要添加了<dockerDirectory> 指定 Dockerfile 的位置
<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docker的maven插件,官网:https://github.com/spotify/docker‐maven‐plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<!-- 镜像名称 -->
<!--<imageName>${project.artifactId}:${project.version}</imageName>-->
<imageName>192.168.25.131:4000/${project.artifactId}:${project.version}</imageName>
<!-- 插件读取Dockerfile进行构建 不再指定baseImage和entrypoint,而是使用dockerDirectory指定Dockerfile所在的路径 -->
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<!-- 用于指定需要复制的根目录,${project.build.directory}表示target目录。 -->
<directory>${project.build.directory}</directory>
<!-- 用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar包文件。 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!-- 远程 docker 宿主机地址 -->
<dockerHost>http://192.168.25.131:2375</dockerHost>
</configuration>
</plugin>
</plugins>
</build>
4、同方式一,到工程目录cmd 执行mvn 打包:
# 打包命令
mvn clean package docker:build ‐DpushImage
可在控制台看到构建及上传的日志信息。
至此,全pom 和引入Dockerfile 两种方式都已实现镜像的构建。
总结:
1、远程连接 docker 需暴露宿主机2375端口。
2、需修改 docker.service 配置支持远程连接。
3、maven 构建镜像的两种方式,全 pom 配置、引入Dockerfile,后者更灵活。
TIPS:
1、maven基本是解压即安装,要使用 maven 命令需配置环境变量。
2、若构建的镜像不想传到私有仓库,只需将pom标签镜像名称的 ip:port 去掉。
3、2375 为宿主机docker默认端口,若使用的是公网服务器,尽量不要直接暴露,我之前暴露了阿里云的2375端口,造成服务器被攻击,运行非常慢。
个人学习分享
更多 springboot、springcloud、docker 文章,关注微信公众号吧: