百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Docker一键部署 SpringBoot 应用的方法,贼快贼好用

wptr33 2025-05-28 20:45 17 浏览

这两天发现个Gradle插件,支持一键打包、推送Docker镜像。今天我们来讲讲这个插件,希望对大家有所帮助!

Gradle Docker Plugin 简介

一款可以通过远程API管理Docker镜像和容器的插件,专为Java应用打造,原生支持SpringBoot。

使用该插件具有如下特性:

  • 与构建工具Gradle及其DSL无缝集成。
  • 在幕后处理Docker客户端和守护程序之间的复杂通信逻辑。
  • 简化了复杂工作流程的定义。
  • 最大程度地减少构建脚本的编写逻辑。

该插件由以下三个插件组成:

  • com.bmuschko.docker-remote-api:提供自定义任务,可以通过远程API与Docker进行交互。
  • com.bmuschko.docker-java-application:为Java应用创建并推送Docker镜像。
  • com.bmuschko.docker-spring-boot-application:为SpringBoot应用创建并推送Docker镜像。

操作镜像

还是以我的脚手架项目mall-tiny为例,让我们来看看使用该插件打包推送Docker镜像是不是够快够简单!

构建镜像

  • 要使用该插件,我们需要在build.gradle中进行如下配置,这里选择使用远程API插件和SpringBoot插件;
plugins {
    id 'com.bmuschko.docker-remote-api' version '6.7.0'
    id 'com.bmuschko.docker-spring-boot-application' version '6.7.0'
}
  • 然后在ext节点下面定义一个常量,这里定义好了镜像仓库地址,方便我们之后引用;
ext{
    registryUrl='192.168.5.78:5000'
}
  • 接下来就是非常重要的插件配置了,配置好Docker远程API的访问路径,还有SpringBoot应用镜像相关配置;
docker {
    url = 'tcp://192.168.5.78:2375'
    springBootApplication {
        baseImage = 'java:8'
        maintainer = 'macrozheng'
        ports = [8080]
        images = ["${registryUrl}/mall-tiny/${rootProject.name}:${version}"]
        jvmArgs = ['-Dspring.profiles.active=prod']
    }
}

接下来我们来解读下这些配置到底有什么作用;

接下来我们直接在IDEA中使用dockerBuildImage命令,即可将应用镜像打包到远程服务器上去;

  • 让我们看下控制台输出的日志,其实就是给我们默认创建了一个Dockerfile(连Dockerfile都省的写了),然后用它来打包Docker镜像;
> Task :dockerBuildImage
Building image using context 'I:\developer\gitee\mall-tiny-gradle\build\docker'.
Using images '192.168.5.78:5000/mall-tiny/mall-tiny:1.0.0-SNAPSHOT'.
Step 1/8 : FROM java:8
 ---> d23bdf5b1b1b
Step 2/8 : LABEL maintainer=macrozheng
 ---> Running in 9a63f56a03ae
Removing intermediate container 9a63f56a03ae
 ---> ed45af8fff90
Step 3/8 : WORKDIR /app
 ---> Running in 8bd4b513eb23
Removing intermediate container 8bd4b513eb23
 ---> d27759d1d7df
Step 4/8 : COPY libs libs/
 ---> 84c3a983972a
Step 5/8 : COPY resources resources/
 ---> c8a27f3475fc
Step 6/8 : COPY classes classes/
 ---> 3a76a8efc02b
Step 7/8 : ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-cp", "/app/resources:/app/classes:/app/libs/*", "com.macro.mall.tiny.MallTinyApplication"]
 ---> Running in e56ae56fd6eb
Removing intermediate container e56ae56fd6eb
 ---> 22d73f95e756
Step 8/8 : EXPOSE 8080
 ---> Running in b21d898456cb
Removing intermediate container b21d898456cb
 ---> 73684cf8c643
Successfully built 73684cf8c643
Successfully tagged 192.168.5.78:5000/mall-tiny/mall-tiny:1.0.0-SNAPSHOT
Created image with ID '73684cf8c643'.

BUILD SUCCESSFUL in 34s
5 actionable tasks: 5 executed
10:56:15: Task execution finished 'dockerBuildImage'.
  • 在项目的build\docker文件夹下可以发现这个Dockerfile,具体内容如下:
FROM java:8
LABEL maintainer=macrozheng
WORKDIR /app
COPY libs libs/
COPY resources resources/
COPY classes classes/
ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-cp", "/app/resources:/app/classes:/app/libs/*", "com.macro.mall.tiny.MallTinyApplication"]
EXPOSE 8080
  • 打包完镜像之后,直接使用如下命令即可运行项目,注意安装好MySQL和Redis
docker run -p 8080:8080 --name mall-tiny \
--link mysql:db \
--link redis:redis \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/mall-tiny/logs:/var/logs \
-d 192.168.5.78:mall-tiny/mall-tiny:1.0.0-SNAPSHOT

推送镜像

  • 接下来我们试试推送镜像功能,不过首先需要安装一个镜像仓库,
  • 推送镜像也是非常简单的,直接在IDEA中使用dockerPushImage命令即可
  • 推送完成后,在我们的可视化镜像仓库中就可以看到该镜像了。

对比Maven

我们通过把项目clean以后再打包成Docker镜像,对比下使用Gradle和Maven的速度。

  • 使用Gradle进行clean并构建Docker镜像,耗时30s
  • 使用Maven进行clean并构建Docker镜像,耗时58s,果然Gradle还是能比Maven快一倍的

总结

今天我们体验了一把Gradle和Docker结合使用,发现真是够快够简单。对比Maven速度快了一倍,内置了Dockerfile,大大降低了配置难度。




相关推荐

redis的八种使用场景

前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...

基于Redis的3种分布式ID生成策略

在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...

基于OpenWrt系统路由器的模式切换与网页设计

摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...

这篇文章教你看明白 nginx-ingress 控制器

主机nginx一般nginx做主机反向代理(网关)有以下配置...

如何用redis实现注册中心

一句话总结使用Redis实现注册中心:服务注册...

爱可可老师24小时热门分享(2020.5.10)

No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...

Apportable:拯救程序员,IOS一秒变安卓

摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...

JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透

以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...

3月26日更新 快速施法自动施法可独立设置

2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...

Redis 是如何提供服务的

在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...

lua _G、_VERSION使用

到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...

China's top diplomat to chair third China-Pacific Island countries foreign ministers' meeting

BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...

移动工作交流工具Lua推出Insights数据分析产品

Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...

Redis 7新武器:用Redis Stack实现向量搜索的极限压测

当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...

Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求

重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...