首先,推荐springboot官网提供的如何打包docker镜像的链接:https://spring.io/guides/gs/spring-boot-docker/#initial 以及github上相对应的springboot+docker项目链接:https://github.com/spring-guides/gs-spring-boot-docker
一个springboot项目
已安装docker(安装包和安装步骤在 https://blog.csdn.net/wangyan_z/article/details/95966896 中详述)
有docker hub账号(可在 https://cloud.docker.com/ 中免费注册,用法类似 github)
打开项目右侧的gradle,按照 build/build、application/bootRun 和 build/bootJar 的顺序执行,然后在项目根目录下看到生成一个build文件,在其中的libs目录下有我们新打的jar包,如下(右图)所示:
由控制台进入到,如上所述build/libs路径下,运行命令:java -jar [jar包名称] ,观察自己的项目是否启动。项目启动之后,接下来把该jar包打包成docker镜像。
(1)推荐 https://docs.gradle.org/4.9/userguide/plugins.html 为gradle添加插件的官方说明。如下,项目生成时,默认的build.gradle如下所示:
plugins {
id 'org.springframework.boot' version '2.1.6.RELEASE'
id 'java'
}
apply plugin: 'io.spring.dependency-management'
group = '**' //生成项目时自定义的group值
version = '0.0.1-SNAPSHOT' //默认生成的jar包名称:项目名称-0.0.1-SNAPSHOT.jar
sourceCompatibility = '1.8'
configurations {
developmentOnly
runtimeClasspath {
extendsFrom developmentOnly
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui
compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.7.0'
// https://mvnrepository.com/artifact/io.springfox/springfox-swagger2
compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.7.0'
// https://mvnrepository.com/artifact/com.alibaba/fastjson
compile group: 'com.alibaba', name: 'fastjson', version: '1.2.47'
}
(2)要打包成docker镜像,需要在以上build.gradle基础上添加一些插件,如下:
//添加在build.gradle文件最上面
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
mavenCentral()
}
dependencies {
classpath('org.springframework.boot:spring-boot-gradle-plugin:2.1.6.RELEASE')
classpath('gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.13.0')
}
}
//注意这部分需放在buildscript块、plugins块下面,否则出错;其他依次添加
apply plugin: 'org.springframework.boot'
apply plugin: 'com.palantir.docker'
...
//这里我修改了jar包名称,因此生成的jar包名称为:esb-0.0.1.jar
bootJar {
baseName = 'esb'
version = '0.0.1'
}
// tag::task[]
task unpack(type: Copy) {
dependsOn bootJar
from(zipTree(tasks.bootJar.outputs.files.singleFile))
into("build/dependency")
}
docker {
name "${project.group}/${bootJar.baseName}" //生成镜像的名称
copySpec.from(tasks.unpack.outputs).into("dependency")
buildArgs(['DEPENDENCY': "dependency"])
}
// end::task[]
...
(3)添加完上述内容,重新build,便在项目右侧gradle里生成一个docker目录。
接下来需要编写Dockerfile文件(注意:Dockerfile文件没有后缀),这个文件的作用是指定项目镜像依赖的基础镜像java8、同时将指定文件添加至镜像文件夹,最后由ENTRYPOINT命令执行,从而生成docker镜像文件,Dockerfile文件内容如下:
FROM openjdk:8-jdk-alpine //依赖java8,Dockerfile文件必须以from开头,指定依赖的基础镜像
VOLUME /tmp
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib //将指定文件存于容器的app目录下
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","group.mainClass"] //这里的group.mainClass意在指定入口类的路径,src/main/java 之后的路径
自定义Dockerfile的时候,如果与build.gradle同在一个目录,即根目录下,则在build.gradle的docker里无需指定Dockerfile文件,即以上docker 等同于以下docker:(当然如果在其他目录下,这里加上路径即可)
docker {
name "${project.group}/${bootJar.baseName}" //生成镜像的名称
dockerfile = file('Dockerfile')
copySpec.from(tasks.unpack.outputs).into("dependency")
buildArgs(['DEPENDENCY': "dependency"])
}
(如果不擅使用命令行,则项目右侧gradle里的docker/docker,双击即可生成镜像)
如果本地安装gradle,进入项目,执行命令:
gradle build docker
否则,进入项目,执行命令:
gradlew build docker
生成如下结果,表示构建成功:
当然,如果想看到详细构建过程,可在命令后加 --info,即:
gradle build docker --info
如果构建失败,下次构建可执行命令:
gradle clean build docker --info
运行容器的命令:
docker run -p 8098:8098[端口映射] -t group/esb[镜像名称]
// 8098:8098表示本地端口到容器端口的映射,
// group/esb是我在build.gradle的docker里定义的镜像名称
当然,镜像名称也可以使用以下命令来查看:
docker images
如此,项目容器便运行起来了,可在本机浏览器进行访问(访问路径即为之前的访问路径),如果访问不了,请打开防火墙。
查看正在运行的所有容器,使用命令:
docker ps
查看所有运行过(不一定正在运行),使用命令:
docker ps -a
停止正在运行的容器(容器 id 可通过 docker ps 查得),使用命令:
docker stop 容器id
当容器运行起来以后,docker会给它分配一个ip地址(emmm...可能会用到),可通过以下命令获得:
docker inspect 容器id
这里:推荐一篇docker原理及命令详解 http://dockone.io/article/783 有助于更好的操作这部分
首先保证有docker hub账号,并新建一个仓库(与github类似,这里不再赘述)
使用如下命令将镜像上传至docker hub:
docker tag image-name username[docker hub账号]/reponame[新建的仓库名称]:tagname[自定义标签名称]
docker push username[docker hub账号]/reponame[新建的仓库名称]:tagname[自定义标签名称]
可通过以下命令查看镜像打标签之后的信息:
docker images username[docker hub账号]/reponame[新建的仓库名称]:tagname[自定义标签名称]
打包、运行至上传过程出现任意bug,请自行百度,均可解决!!!