使用 docker+gradle 打包部署多模块 springboot 项目到 Ubuntu 服务器上

本贴最后更新于 2272 天前,其中的信息可能已经时移世改
有一段时间没写博客了, 最近比较忙. 前些日子朋友说想学docker, 本博客就是通过docker部署到Ubuntu服务器上的, docker可以看成一个虚拟机, 对于低配置服务器效果更加明显, 资源合理运用了. 至于更深层的好处可以去[docker中文文档](http://docs.docker-cn.com/) 看看, 这个大家应该很开心, 因为是中文, 讲的很细.

废话不多说了,开整:

  1. 该流程接上次博客中创建的 多模块项目 接着搞. 多模块项目如果要加入 docker 必须要在主项目中引入 docker 插件依赖:
buildscript { ext { springBootVersion = '1.5.9.RELEASE' springRepo = 'https://plugins.gradle.org/m2/' } repositories { maven { url springRepo } jcenter() mavenLocal() mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") classpath("se.transmode.gradle:gradle-docker:1.2") }} tasks.withType(JavaCompile) { options.encoding = 'UTF-8' }

上面有个坑要注意下, 仓库地址由原来的那啥地址换成了

https://plugins.gradle.org/m2/

因为原来的地中没有 docker 插件的依赖, 所以这里要注意下
2. 开始第二步, 在入口处的依赖(gradle.build)中引入对 docker 插件的设置, 什么叫入口处, 就是整个多模块项目主项目的入口, 我们目前的入口是 api 模块, 所以在 api 模块下的 gradle.build 写下配置文件

apply plugin: 'application' apply plugin: 'docker' jar { baseName 'spring-boot-gradle-for-docker' version '1.0' } distDocker { baseImage 'openjdk' maintainer 'harrison' } task dockerBuilder(type: Docker) { applicationName = jar.baseName tagVersion = jar.version volume('/tmp') addFile("${jar.baseName}-${jar.version}.jar", "app.jar") entryPoint(["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", 'app.jar']) exposePort(8081) doFirst { copy { from jar into stageDir } } }

什么意思? 这里的步骤少了像市面上的 Dockerfile, 我是很烦那个破文件, 放哪儿容易搞错, 这种就避免了这种尴尬问题
3. 至此配置就 ojbk 了! 我再上传修改过的两个文件一次, 先上主项目的 gradle.build 完整文件

def vJavaLang = '1.8' def bootProjects = [project(':api')] def gradleDir = "${rootProject.rootDir}/gradle" group = 'com.keppel' version = '0.0.1-SNAPSHOT' buildscript { ext { springBootVersion = '1.5.9.RELEASE' springRepo = 'https://plugins.gradle.org/m2/' } repositories { maven { url springRepo } jcenter() mavenLocal() mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") classpath("se.transmode.gradle:gradle-docker:1.2") } } tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } subprojects { apply plugin: "eclipse" apply plugin: "idea" apply plugin: 'java' targetCompatibility = vJavaLang sourceCompatibility = vJavaLang repositories { mavenLocal() jcenter() mavenCentral() } } configure(bootProjects) { apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'java' apply plugin: 'org.springframework.boot' targetCompatibility = vJavaLang sourceCompatibility = vJavaLang repositories { mavenLocal() jcenter() mavenCentral() } }

再上入口子模块的 gradle.build 文件完整版

jar { baseName = 'keppel-api' version = '0.0.1-SNAPSHOT' } springBoot { mainClass = 'com.keppel.ApiApplication' } dependencies { compile project(':common') compile project(':user') compile('io.jsonwebtoken:jjwt:0.9.0') compile('org.springframework.boot:spring-boot-starter-mobile') compile('org.springframework.boot:spring-boot-starter-security') compile("org.springframework.boot:spring-boot-starter-web") testCompile('org.springframework.boot:spring-boot-starter-test') } apply plugin: 'application' apply plugin: 'docker' jar { baseName 'spring-boot-gradle-for-docker' version '1.0' } distDocker { baseImage 'openjdk' maintainer 'harrison' } task dockerBuilder(type: Docker) { applicationName = jar.baseName tagVersion = jar.version volume('/tmp') addFile("${jar.baseName}-${jar.version}.jar", "app.jar") entryPoint(["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", 'app.jar']) exposePort(8081) doFirst { copy { from jar into stageDir } } }

如果你开发主机为 win 系列的你可以直接通过 idea 来进行 build
imagepng
双击命令就可以了
imagepng
镜像文件找不到在哪儿, 反正就是 api.tar 里面的吧
真正的是通过 Ubuntu 来进行打包, 贴个自己写的脚本, 亲测已经打包 docker 成功

// 进入项目目录 cd keppelfei // 拉取最新代码 git pull // 切换分支到主分支 git checkout master // 开始打包啦 ./gradlew clean build dockerBuilder --info // 停止正在运行的docker镜像进行替换 docker stop gradle-boot // 删除所有已停止的镜像 sudo docker rm $(sudo docker ps -a -q) // 导入打包好的镜像 docker images // 开始以gradle-boot为命名启动刚打好的镜像 docker run -d --name gradle-boot -p 8081:8081 keppel/spring-boot-gradle-for-docker:1.0

至此结束了, 有什么问题欢迎留言!

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    493 引用 • 928 回帖 • 1 关注
  • Gradle
    41 引用 • 20 回帖 • 2 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    945 引用 • 1460 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 440 关注
  • 自由行
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 698 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖 • 1 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖 • 1 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    21 引用 • 204 回帖
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 1 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 1 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 543 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 74 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 637 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2040 回帖
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 5 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖 • 1 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 2 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    364 引用 • 1840 回帖 • 3 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    36 引用 • 155 回帖 • 2 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 116 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 490 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 2 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 49 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • 倾城之链
    23 引用 • 66 回帖 • 159 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 542 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖