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

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

    491 引用 • 917 回帖 • 2 关注
  • Gradle
    41 引用 • 20 回帖 • 2 关注
  • Spring

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

    944 引用 • 1459 回帖 • 16 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    47 引用 • 25 回帖
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖
  • GitHub

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

    209 引用 • 2031 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 3 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 2 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 638 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 52 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 62 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖
  • 博客

    记录并分享人生的经历。

    273 引用 • 2388 回帖
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    176 引用 • 815 回帖
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 17 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖
  • Quicker

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

    32 引用 • 131 回帖 • 2 关注
  • Docker

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

    491 引用 • 917 回帖 • 2 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 351 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 683 关注
  • Spring

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

    944 引用 • 1459 回帖 • 16 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 4 关注
  • V2Ray
    1 引用 • 15 回帖 • 2 关注
  • 禅道

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

    6 引用 • 15 回帖 • 113 关注
  • SQLServer

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

    21 引用 • 31 回帖 • 1 关注
  • iOS

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

    85 引用 • 139 回帖
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1705 回帖
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    222 引用 • 473 回帖
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖 • 1 关注