需要准备
- 一个熟悉的 IDE 开发工具
- JDK 7及以上
- Gradle 3.2以上
- Docker 17
容器化项目
1.传统的方式运行 spring boot 项目
还是使用上章中 login 工程,我们在 login 工程目录下执行gradle build
编译命令,并在 build/libs 目录下生成了项目的 jar 包,接下来在命令行直接运行java -jar build/libs/login.jar
启动 spring boot 项目,然后使用 Postman 访问 http://localhost:8080/cm/login/ 接口,返回正常数据,如下图:
2.对项目进行容器化
Docker 一般会使用一个叫 Dockerfile 的文件来定义镜像层,所以我们也在 login 工程止录下创建一个叫 Dockerfile 的文件,在其中来定义如下代码:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/login.jar app.jar
ENV JAVA_OPTS=""
ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar
其中 FROM 代表我们自己的镜像是从 openjdk:8-jdk-alpin 继承而来的。
VOLUME 挂载了 /tmp 目录到容器中,此目录为 Spring Boot 为 tomcat 创建的默认目录。
ENTRYPOINT 在容器启动后执行 java 命令来运行程序。
定义好 Dockerfile 文件后,我们再修改一下我们的 build.gradle 文件,在其中添加以下代码:
buildscript {...dependencies {...classpath('se.transmode.gradle:gradle-docker:1.2')}
}group = 'springio'...
apply plugin: 'docker'task buildDocker(type: Docker, dependsOn: build) {applicationName = jar.baseNamedockerfile = file('Dockerfile')doFirst {copy {from jarinto "${stageDir}/target"}}
}
这里使用了 Docker 插件,该插件的具体用法请参见 Docker官网。这里我们在 buildDocker 任务中添加了 doFirst 方法,主要是把通过 jar 任务生成的归档文件拷贝到 target 目录下,因为在我们的 Dockerfile 文件中使用了ADD target/login.jar app.jar
命令从 target 目录中把 login.jar 包添加到镜像中的。
最后 login 工程完整的 build.gradle 代码如下:
buildscript {ext {springBootVersion = '1.5.8.RELEASE'}repositories {mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")classpath('se.transmode.gradle:gradle-docker:1.2')}
}apply plugin: 'org.springframework.boot'
apply plugin: 'docker'group = 'billyang'ext {springCloudVersion = 'Dalston.SR4'
}dependencies {compile("org.springframework.boot:spring-boot-starter-web")compile("org.springframework.boot:spring-boot-starter-data-jpa")compile("mysql:mysql-connector-java:5.1.38")compile("commons-codec:commons-codec:1.10")testCompile('org.springframework.boot:spring-boot-starter-test')
}dependencyManagement {imports {mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"}
}jar {baseName = 'gs-spring-boot-docker'version = '0.1.0'
}task buildDocker(type: Docker, dependsOn: build) {applicationName = jar.baseNamedockerfile = file('Dockerfile')doFirst {copy {from jarinto "${stageDir}/target"}}
}
然后通过执行gradle buildDocker
命令来生成 Docker 镜像。我们可以在控制台执行docker images
命令来查看生成的镜像,如下图:
然后再运行命令docker run -p 8080:8080 -t springio/gs-spring-boot-docker
来启动容器,并绑定8080端口。使用docker ps
命令来查看容器启动情况:
最后我们还是通过 Postman 来验证登陆服务是否启动正常了,最后返回结果和之前传统方式一样,证明我们的登陆服务通过容器化已经启动成功了。
3,发布到远程 Docker 仓库,并启动镜像
在上一节中,我们的镜像只是在本地,如果想要发布到远程的 Docker 仓库中,又该怎么实现呢?其实这只需要一行代码就够了。那就是在 buildDocker 任务中添加push = project.hasProperty('push')
,添加后的 buildDocker 代码如下:
task buildDocker(type: Docker, dependsOn: build) {applicationName = jar.baseNamepush = project.hasProperty('push') //这行是新添加的dockerfile = file('Dockerfile')doFirst {copy {from jarinto "${stageDir}/target"}}
}
然后我们只需要在执行构建脚本时添加push
参数就好,完整的命令如下:
gradle buildDocker -Ppush
当然,如果就这么执行肯定会报错的,因为我们还没有登陆 Docker 仓库,所以请先执行以下命令进行登陆:
输入正确的帐号和密码后,再执行gradle buildDocker -Ppush
命令,然后登陆 https://hub.docker.com/ 查看是否发布成功,结果见下图:
小结
在本章中我们通过 Gradle 实现了 login 服务的容器化,并向 Docker Hub 仓库中发布了镜像。
如果你有疑问欢迎加微信咨询:
https://u.wechat.com/MDHWBbNbJRv36gtFwfExkEo (二维码自动识别)
也可以关注我的公众号想我提问:
http://weixin.qq.com/r/EEzl-dLE5Y_arZae9xkC (二维码自动识别)