Docker提供了build和publish命令用于创建和发布image到指定的registry。本文假设项目基于spring boot + gradle,并使用docker hub做为registry,并且使用spring boot gralde docker插件完成docker的构建(创建)和发布(上传)。
1. 建立项目
参考此文创建spring boot项目,仅做小的修改,将HelloApplication源文件中Tap Spring Boot改为Tap docker。
2. 生成docker image
2.1 配置build.gradle
修改build.gradle文件,增加gradle-docker plugin以及配置,代码如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
buildscript { ext { springBootVersion = '1.5.9.RELEASE' } repositories { maven { url "https://plugins.gradle.org/m2/" } mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") classpath('gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.13.0') } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'org.springframework.boot' apply plugin: 'com.palantir.docker' group = 'kingscow' version = '0.0.1' sourceCompatibility = 1.8 targetCompatibility = 1.8 repositories { mavenCentral() } jar { baseName = 'naive-spring-boot' version = '0.0.1' } docker { name "${project.group}/${jar.baseName}:infant" files jar.archivePath buildArgs(['JAR_FILE': "${jar.archiveName}"]) } dependencies { compile('org.springframework.boot:spring-boot-starter-web') testCompile('org.springframework.boot:spring-boot-starter-test') } |
其中,classpath(‘gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.13.0’)用于引入gradle-docker插件。目前该插件提供了0.17.2版本,并提供了更丰富的命令例如dockerTag,但这里无法使用该版本,能用的最高版是0.13.0。而apply plugin: ‘com.palantir.docker’用于应用该插件。最后在docker{ }内定义docker image信息,具体参考gradle-docker官网。
2.2 配置Dockerfile
在项目根目录下创建Dockerfile文件,输入代码如下。
1 2 3 4 5 |
FROM openjdk:8-jdk-alpine VOLUME /tmp ARG JAR_FILE ADD ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"] |
它使用openjdk:8-jdk-alpine做为基础镜像,提供了执行jar包的运行环境,包括linux和jdk8。项目jar包由外部参数JAR_FILE传入,最后通过java -jar运行项目。
2.3 生成docker image
按alt+F12,或者在Terminal中进入项目根目录,分别执行如下命令,结果如下图。
第一条命令根据build.gradle配置创建jar包,并利用jar包信息生成image。第二条用于查看是否生成响应的image。可以看到REPOSITORY为kingscow/naive-spring-boot,TAG为infant,和我们上面配置信息完全匹配,说明image成功生成。
1 |
./gradlew build docker |
1 |
docker images |
2.4 使用docker运行工程
键入下面命令运行docker,效果如下图。其中,docker run用于运行image生成container,同时由于项目中定义的是8888端口,这里使用-p将8080映射到container内的8888,最后-t指定image名称。
1 |
docker run -p 8080:8888 -t kingscow/naive-spring-boot:infant |
2.5 查看运行结果
打开浏览器输入localhost:8080,如果返回Tap docker,说明docker成功运行。然后键入docker ps,可以看到一行IMAGE名为kingscow/naive-spring-boot:infant的container,这里就是项目部署到的container。
3. 发布docker image
3.1 注册docker账户
截止目前,我们都是在本地构建和运行image,下一步是要将它发布到registry,方便下一步的消费(如公共镜像,CI,部署等)。docker运行自建registry,这里为了演示方便使用docker hub做为registry,将我们制作好的image发布到这里。
首先,需要有docker hub的账户,如果还没有,前往docker hub完成注册,并记住登录名和名吗,如果已有直接跳到下一步3.2。
3.2 登陆docker
使用docker login命令登陆registry,默认的registry就是docker hub,输入登录名和密码,如果出现如下图的Login Successful,说明登陆成功。如果不登陆直接发布image,docker会提示permission错误。
3.2 发布image
键入如下命令发布image到hub,效果如下图。
1 |
./gradlew dockerPush |
3.3 查看发布
登陆docker hub网站,查看发布结果,类似下图所示。
简而言之,docker发布的基本流程为:develop -> package(jar) -> build image -> login -> publish image