美文网首页
Gradle第15课:与 Docker 的结合使用

Gradle第15课:与 Docker 的结合使用

作者: 米饭超人 | 来源:发表于2018-08-28 11:09 被阅读639次

    需要准备

    • 一个熟悉的 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/ 接口,返回正常数据,如下图:

    enter image description here

    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命令来查看生成的镜像,如下图:

    enter image description here

    然后再运行命令docker run -p 8080:8080 -t springio/gs-spring-boot-docker来启动容器,并绑定8080端口。使用docker ps命令来查看容器启动情况:

    enter image description here

    最后我们还是通过 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/ 查看是否发布成功,结果见下图:

    enter image description here

    小结

    在本章中我们通过 Gradle 实现了 login 服务的容器化,并向 Docker Hub 仓库中发布了镜像。

    相关文章

      网友评论

          本文标题:Gradle第15课:与 Docker 的结合使用

          本文链接:https://www.haomeiwen.com/subject/hojfwftx.html