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

本贴最后更新于 1940 天前,其中的信息可能已经时移世改
有一段时间没写博客了, 最近比较忙. 前些日子朋友说想学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 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    476 引用 • 899 回帖
  • Gradle
    41 引用 • 20 回帖 • 2 关注
  • Spring

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

    940 引用 • 1458 回帖 • 156 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    5 引用 • 13 回帖
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 25 关注
  • V2Ray
    1 引用 • 15 回帖
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖 • 2 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 685 关注
  • OnlyOffice
    4 引用 • 27 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 553 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 455 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 511 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 250 关注
  • 分享

    有什么新发现就分享给大家吧!

    242 引用 • 1746 回帖 • 1 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    84 引用 • 139 回帖 • 1 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    19 引用 • 31 回帖 • 3 关注
  • 导航

    各种网址链接、内容导航。

    37 引用 • 168 回帖
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    51 引用 • 190 回帖 • 2 关注
  • 星云链

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

    3 引用 • 16 回帖 • 5 关注
  • Facebook

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

    4 引用 • 15 回帖 • 454 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 3 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    76 引用 • 390 回帖 • 1 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    15 引用 • 7 回帖 • 9 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 696 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    185 引用 • 318 回帖 • 348 关注
  • danl
    61 关注
  • Rust

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

    57 引用 • 22 回帖 • 2 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 24 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 422 关注