springboot项目打包成docker镜像并上传至docker hub

10 篇文章 0 订阅
6 篇文章 0 订阅

 

    首先,推荐springboot官网提供的如何打包docker镜像的链接:https://spring.io/guides/gs/spring-boot-docker/#initial  以及github上相对应的springboot+docker项目链接:https://github.com/spring-guides/gs-spring-boot-docker

0 背景

     一个springboot项目

     已安装docker(安装包和安装步骤在 https://blog.csdn.net/wangyan_z/article/details/95966896 中详述)

     有docker hub账号(可在 https://cloud.docker.com/ 中免费注册,用法类似 github)

 

1 项目打成jar包

     打开项目右侧的gradle,按照 build/buildapplication/bootRun 和 build/bootJar 的顺序执行,然后在项目根目录下看到生成一个build文件,在其中的libs目录下有我们新打的jar包,如下(右图)所示:

        

      由控制台进入到,如上所述build/libs路径下,运行命令:java -jar [jar包名称] ,观察自己的项目是否启动。项目启动之后,接下来把该jar包打包成docker镜像。

 

2 修改build.gradle

      (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目录。

 

3 编写Dockerfile

       接下来需要编写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"])
}

 

4 按照Dockerfile生成镜像

  (如果不擅使用命令行,则项目右侧gradle里的docker/docker,双击即可生成镜像)

     如果本地安装gradle,进入项目,执行命令: 

gradle build docker

     否则,进入项目,执行命令:

gradlew build docker

    生成如下结果,表示构建成功:

  

    当然,如果想看到详细构建过程,可在命令后加 --info,即:

  gradle build docker --info

    如果构建失败,下次构建可执行命令:

  gradle clean build docker --info

 

5 运行容器

    运行容器的命令:

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  有助于更好的操作这部分

 

6 镜像上传至docker hub

     首先保证有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,请自行百度,均可解决!!!

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值