Docker实战 | 第二篇:IDEA集成Docker插件实现一键自动打包部署微服务项目,一劳永逸的技术手段值得一试

简介: Docker实战 | 第二篇:IDEA集成Docker插件实现一键自动打包部署微服务项目,一劳永逸的技术手段值得一试

一. 前言

大家在自己玩微服务项目的时候,动辄十几个服务,每次修改逐一部署繁琐不说也会浪费越来越多时间,所以本篇整理通过一次性配置实现一键部署微服务,实现真正所谓的一劳永逸。


二. 配置服务器

1. Docker安装

服务器需要安装Docker,如未安装参考这篇文章安装即可 Docker实战 | 第一篇:Linux 安装 Docker


2. Docker开启远程访问

vim /usr/lib/systemd/system/docker.service

# 在ExecStart=/usr/bin/dockerd追加

-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

微信图片_20230709225944.png



# 重新启动

systemctl daemon-reload

systemctl restart docker


# 开放2375端口

firewall-cmd --zone=public --add-port=2375/tcp --permanent

firewall-cmd --reload

3. 远程访问测试

# 查看端口监听是否开启

netstat -nlpt

# curl测试是否生效

curl http://127.0.0.1:2375/info


二. 配置IDEA

IDEA安装Docker插件,打开插件市场(File->Settings->Plugins)


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rq9I9HAF-1607829076364)(https://i.loli.net/2020/12/02/twmD13ReHbFTiA6.png)]


安装Docker插件后,配置Docker远程链接


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dJBKuFSl-1607829076366)(https://i.loli.net/2020/12/02/otZXbuYAlciwUPQ.png)]


三. Maven插件构建Docker镜像

1. Maven构建Docker镜像方式

IDEA中基于maven构建docker镜像有两种方式,分别docker-maven-plugin和dockerfile-maven,都是出自Spotify公司之手。


进入项目 https://github.com/spotify/docker-maven-plugin


其中有个很显眼的提示:

微信图片_20230709225959.png微信图片_20230709230002.png





docker-maven-plugin可以不用Dockerfile,纯粹通过pom.xml的配置自动生成Dockerfile来构建Docker镜像。


dockerfile-maven依赖Dockerfile文件,需放到项目根目录下,也就是和pom.xml同级。


显然官方推荐的是 dockerfile-maven 这种依赖Dockerfile的方式,但是在部署 youlai-mall 项目使用 docker-maven-plugin 只要配置好 pom.xml 便无需修改外置配置了,所以更为方便省心,下面就这两种方式如何实现镜像构造进行逐一说明。其中统一以 youlai-mall 的 youlai-gateway 网关模块进行构建。


2. docker-maven-plugin方式构造镜像

(1). 配置pom.xml


<plugin>

       <groupId>org.springframework.boot</groupId>

       <artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

<plugin>

   <groupId>com.spotify</groupId>

   <artifactId>docker-maven-plugin</artifactId>

   <version>1.0.0</version>

   <executions>

       <!--执行mvn package,即执行 mvn clean package docker:build-->

       <execution>

           <id>build-image</id>

           <phase>package</phase>

           <goals>

               <goal>build</goal>

           </goals>

       </execution>

   </executions>

   <configuration>

       <!-- 镜像名称 -->

       <imageName>${project.artifactId}</imageName>

       <!-- 指定标签 -->

       <imageTags>

           <imageTag>latest</imageTag>

       </imageTags>

       <!-- 基础镜像-->

       <baseImage>openjdk:8-jdk-alpine</baseImage>

       <!-- 切换到容器工作目录-->

       <workdir>/ROOT</workdir>

       <entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint>

       <!-- 指定远程 Docker API地址  -->

       <dockerHost>http://192.168.1.111:2375</dockerHost>

       <!-- 复制 jar包到docker容器指定目录-->

       <resources>

           <resource>

               <targetPath>/ROOT</targetPath>

               <!-- 用于指定需要复制的根目录,${project.build.directory}表示target目录 -->

               <directory>${project.build.directory}</directory>

               <!-- 用于指定需要复制的文件,${project.build.finalName}.jar就是打包后的target目录下的jar包名称 -->

               <include>${project.build.finalName}.jar</include>

           </resource>

       </resources>

   </configuration>

</plugin>

(2). maven打包制作镜像


项目是聚合工程,先全局执行 mvn install -DskipTests=true 完成安装模块jar包到本地仓库,不然模块之间的依赖会报错。


切到文件夹 youlai-gateway 执行项目的打包 mvn package -DskipTests=true, 在 package 生命周期完成镜像的生成。




(3). idea创建和启动容器

微信图片_20230709230020.png微信图片_20230709230023.png


(4). 容器启动测试

微信图片_20230709230042.png



3. dockerfile-maven方式构造镜像

(1). 创建Dockerfile


按照dockerfile-maven插件的使用说明,创建Dockerfile放置到项目根目录下(pom.xml同级)


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gTnRT2wC-1607829076388)(https://i.loli.net/2020/12/04/CjVMrqefbFi2G5v.png)]


FROM openjdk:8-jdk-alpine

VOLUME /tmp

ARG JAR_FILE

ADD target/${JAR_FILE} /app.jar

EXPOSE 9999

ENTRYPOINT ["java","-jar","/app.jar"]


Dockerfile参考Spring官方,参考链接 https://spring.io/guides/gs/spring-boot-docker/

指令

说明

FROM openjdk:8-jdk-alpine

基础镜像JDK,无则自动拉取镜像

VOLUME /tmp

挂载容器/tmp目录至宿主机,SpringBoot使用内置Tomcat,默认工作目录/tmp;VOLUME不能指定挂载目录,默认挂载到宿主机/var/lib/docker目录。

ARG JAR_FILE

变量声明,对应pom.xml的JAR_FILE标签的变量

ADD target/${JAR_FILE} /app.jar

复制jar包至容器并重命名为app.jar

EXPOSE 9999

声明容器暴露端口,仅仅声明无实际作用

ENTRYPOINT [“java”,"-jar","/app.jar"]

设定容器启动时第一个运行的命令及其参数


(2). 配置pom.xml


<build>

   <plugins>

       <plugin>

           <groupId>com.spotify</groupId>

           <artifactId>dockerfile-maven-plugin</artifactId>

           <version>1.4.13</version>

           <executions>

               <execution>

                   <id>default</id>

                   <goals>

                       <goal>build</goal>

                       <goal>push</goal>

                   </goals>

               </execution>

           </executions>

           <configuration>

               <repository>${project.artifactId}</repository>

               <tag>latest</tag>

               <buildArgs>

                   <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>

               </buildArgs>

           </configuration>

       </plugin>

   </plugins>

</build>

(3). 设置环境变量


dockerfile-maven插件默认的DOCKER_HOST=localhost:2375,如果需要构建镜像到服务器,需要修改DOCKER_HOST系统环境变量


微信图片_20230709230058.png


如果DOCKER_HOST不固定的也可以设置临时变量方便灵活切换


set DOCKER_HOST=tcp://192.168.1.111:2375

1

(4). idea创建和启动容器


和 docker-maven-plugin 一致,请参考上文。


四. 结语

本文旨在使用IDEA搭配Docker插件快速构建Docker镜像实现一键部署SpringBoot项目,其中讲到两种方式,虽然 docker-maven-plugin 已被官方抛弃,但是在我这里部署 youlai-mall 使用优于 dockerfile-maven , 因为 dockerfile-maven 除了配置 pom.xml 、编写 DockerFile 文件之外还要配置系统环境变量。如果你的服务器不只一台呢,环境变量如何处理,切来切去吗?所以这两种插件如何选择,真要看自己的使用场景,不能盲目的人云亦云。尤其会在下一篇介绍如何避免Docker远程2375端口暴露被挖矿做改动时更能体现 docker-maven-plugin的优势。


最后再推荐一下自己的开源项目 youlai-mall,前后端分离 + 微服务的一套完整的OAuth2统一认证鉴权全栈商城系统,有兴趣的朋友可以联系我,能让你有一个很不错的开源项目经验和能力提升的机会。微信号(haoxianrui)。


相关文章
|
1月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
80 0
|
1月前
|
NoSQL Java 关系型数据库
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
本文介绍在 Spring Boot 中集成 Redis 的方法。Redis 是一种支持多种数据结构的非关系型数据库(NoSQL),具备高并发、高性能和灵活扩展的特点,适用于缓存、实时数据分析等场景。其数据以键值对形式存储,支持字符串、哈希、列表、集合等类型。通过将 Redis 与 Mysql 集群结合使用,可实现数据同步,提升系统稳定性。例如,在网站架构中优先从 Redis 获取数据,故障时回退至 Mysql,确保服务不中断。
107 0
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
|
1月前
|
JSON Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的使用
本文详细介绍了Swagger2的使用方法,包括在Spring Boot项目中的配置与应用。重点讲解了Swagger2中常用的注解,如实体类上的`@ApiModel`和`@ApiModelProperty`,Controller类上的`@Api`、`@ApiOperation`以及参数上的`@ApiParam`等。通过示例代码展示了如何为实体类和接口添加注解,并在页面上生成在线接口文档,实现接口测试。最后总结了Swagger的优势及其在项目开发中的重要性,提供了课程源代码下载链接供学习参考。
72 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的使用
|
1月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
85 0
|
1月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
63 0
|
1月前
|
前端开发 Java 数据库
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 介绍
本课介绍Spring Boot集成Thymeleaf模板引擎。Thymeleaf是一款现代服务器端Java模板引擎,支持Web和独立环境,可实现自然模板开发,便于团队协作。与传统JSP不同,Thymeleaf模板可以直接在浏览器中打开,方便前端人员查看静态原型。通过在HTML标签中添加扩展属性(如`th:text`),Thymeleaf能够在服务运行时动态替换内容,展示数据库中的数据,同时兼容静态页面展示,为开发带来灵活性和便利性。
64 0
|
4天前
|
Ubuntu Linux Docker
Docker容器的实战讲解
这只是Docker的冰山一角,但是我希望这个简单的例子能帮助你理解Docker的基本概念和使用方法。Docker是一个强大的工具,它可以帮助你更有效地开发、部署和运行应用。
57 27
|
1月前
|
消息中间件 存储 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
本教程介绍ActiveMQ的安装与基本使用。首先从官网下载apache-activemq-5.15.3版本,解压后即可完成安装,非常便捷。启动时进入解压目录下的bin文件夹,根据系统选择win32或win64,运行activemq.bat启动服务。通过浏览器访问`http://127.0.0.1:8161/admin/`可进入管理界面,默认用户名密码为admin/admin。ActiveMQ支持两种消息模式:点对点(Queue)和发布/订阅(Topic)。前者确保每条消息仅被一个消费者消费,后者允许多个消费者同时接收相同消息。
67 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
|
1月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 的使用
本文介绍了 Thymeleaf 在 Spring Boot 项目中的使用方法,包括访问静态页面、处理对象和 List 数据、常用标签操作等内容。通过示例代码展示了如何配置 404 和 500 错误页面,以及如何在模板中渲染对象属性和列表数据。同时总结了常用的 Thymeleaf 标签,如 `th:value`、`th:if`、`th:each` 等,并提供了官方文档链接以供进一步学习。
93 0
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 的使用
|
1月前
|
消息中间件 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——发布/订阅消息的生产和消费
本文详细讲解了Spring Boot中ActiveMQ的发布/订阅消息机制,包括消息生产和消费的具体实现方式。生产端通过`sendMessage`方法发送订阅消息,消费端则需配置`application.yml`或自定义工厂以支持topic消息监听。为解决点对点与发布/订阅消息兼容问题,可通过设置`containerFactory`实现两者共存。最后,文章还提供了测试方法及总结,帮助读者掌握ActiveMQ在异步消息处理中的应用。
88 0
下一篇
oss创建bucket