序言
缘由已在上章节讲述,本章就直接进入主题--基于springboot+Gradle项目远程部署到docker,希望能给大伙儿有些帮助。
系统及软件环境
- Linux操作系统CentOS7(建议)
- Docker(社区版)---官方地址
Docker RemoteApi
远程部署前提需要开启docker远程访问功能,下面介绍常用两个操作系统的配置
- CentOS 6
修改/etc/sysconfig/docker文件,重启后生效(service docker restart)
DOCKER_OPTS="-H=unix:///var/run/docker.sock -H=0.0.0.0:2375"
- CentOS 7
修改/usr/lib/systemd/system/docker.service文件,在ExecStart后面添加一行
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
效果截图
�重启服务�
systemctl daemon-reload
systemctl restart docker.service
- 测试效果
浏览器访问(http://192.168.80.200:2375/info)
项目创建与访问
打开intelliJ -> New Project -> Spring Assistant(Spring Initializr Server) -> 选择gradle -> 工程名(gdhello) -> 点击完成,项目结构如下
在src/main/kotlin 相应目录下新建HelloController
@RestController
class HelloController {
@GetMapping("hello")
fun helloWorld() = "hello world"
}
在src/main/resource的application.properties里面添加自定义端口号
server.port=8889
启动项目,浏览器访问
~$ ./gradlew bootRun
配置DockerFile
确保项目能正常访问后,在src/main/docker文件夹下面,新建dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD gdhello-0.0.1.jar app.jar
# -Djava.security.egd=file:/dev/./urandom 可解决tomcat可能启动慢的问题
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
EXPOSE 8889
配置Gradle中docker依赖
用intellij自动生成的gradle项目已经是5.6.x版本并且将原来的build.gradle替换成了build.gradle.kts(DSL脚本语言,如果不熟悉的童鞋,在文章末尾文献参考中有官方的学习资料,山姆本人对于DSL的认识也仅限于文档的部分内容),打开build.gradle.kts添加docker-remote-api插件
plugins {
id("com.bmuschko.docker-remote-api") version "5.2.0"
}
docker {
// 远程docker服务器地址(如果不设置,默认本地2375端口)
url.set("tcp://192.168.80.200:2375")
}
到此,docker-remote-api最简单的配置已经完毕,但还不能像maven一样直接远程部署,还需要进行task任务的项目打包和docker远程部署
val copyJarToDocker by tasks.creating(Copy::class) {
dependsOn(tasks.bootJar)
from("build/libs")
into("src/main/docker")
include("${project.name}-${project.version}.jar")
}
val buildGradleDockerImage by tasks.creating(DockerBuildImage::class) {
dependsOn(copyJarToDocker)
inputDir.set(file("src/main/docker"))
tags.add("${project.name}:0.0.1")
}
保存后,执行以下命令
~$ ./gradlew buildGradleDockerImage
看到执行成功后,远程登录80.200的服务,看下docker镜像
小思考
- 学有余力的童鞋,可以思考下为了保证生产环境的安全性,如何创建docker的授权登录机制?
- 如何利用gradle-docker-plugin这个插件,通过gradle task来自动创建docker容器,并在创建后自动运行容器,结束后自动销毁容器,并能监听容器日志?
欢迎有兴趣的童鞋跟山姆留言,大家一起讨论,一起学习,一起进步_
文献参考
【demo地址】(https://github.com/lenvonsam/mvhello.git)
【docker官网】(https://docs.docker.com)
【docker介绍】(https://www.cnblogs.com/boshen-hzb/p/6400272.html)
【kotlin介绍】(https://www.runoob.com/kotlin/kotlin-tutorial.html)
【gradle(DSL)】(https://docs.gradle.org/current/dsl/)
【gradle-docker-plugin文档】(https://bmuschko.github.io/gradle-docker-plugin/)