需要准备
- 一个熟悉的 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.baseName
dockerfile = file('Dockerfile')
doFirst {
copy {
from jar
into "${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.baseName
dockerfile = file('Dockerfile')
doFirst {
copy {
from jar
into "${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.baseName
push = project.hasProperty('push') //这行是新添加的
dockerfile = file('Dockerfile')
doFirst {
copy {
from jar
into "${stageDir}/target"
}
}
}
然后我们只需要在执行构建脚本时添加push
参数就好,完整的命令如下:
gradle buildDocker -Ppush
当然,如果就这么执行肯定会报错的,因为我们还没有登陆 Docker 仓库,所以请先执行以下命令进行登陆:
$ docker login
输入正确的帐号和密码后,再执行gradle buildDocker -Ppush
命令,然后登陆 https://hub.docker.com/ 查看是否发布成功,结果见下图:
小结
在本章中我们通过 Gradle 实现了 login 服务的容器化,并向 Docker Hub 仓库中发布了镜像。
网友评论