了解如何将Spring Boot应用程序打包为Docker容器

Learn How to Package a Spring Boot Application as a Docker Container

Docker是用于创建容器的流行平台-一组标准化的软件单元,可在单个程序包中组合代码,运行时,依赖项,设置和初始化,您可以在一个计算环境中可靠地运行该程序。 将应用程序部署为Docker容器可帮助您在多个环境(即开发,质量检查,分段,生产)中平稳地移动应用程序。

本教程向您展示如何利用Docker部署Spring Boot应用程序。

您需要什么:

  • Java 8+:使用SDKMAN或直接从AdoptOpenJDK安装

  • Docker:我推荐Docker Desktop

  • 一个免费的Okta开发人员帐户:稍后会有更多信息

  • 您可能也有兴趣:Spring Boot:在Docker中运行和构建

    创建一个Spring Boot应用

    您将在简单的命令行HTTP客户端HTTPie的帮助下使用Spring Initializr生成Spring Boot项目。

    如果您不想使用命令行,则可以直接使用Spring Initializr网站。

    在命令行中,只需输入:

    1
    2
    3
    4
    5
    http https://start.spring.io/starter.zip \
     dependencies==web,okta \
     groupId==com.okta.spring-docker.demo \
     packageName==com.okta.spring-docker.demo \
     --download

    然后解压缩下载的文件。

    1
    2
    unzip demo.zip -d spring-boot-docker
    cd spring-boot-docker

    接下来,您将通过创建文件src/main/java/com/okta/springdocker/demo/WebController.java添加Web控制器:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package com.okta.springdocker.demo;

    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    public class WebController {

        @RequestMapping("/")
        public String home() {
            return"Welcome!";
        }
    }

    您还需要为此项目配置安全设置。 目前,您将要允许所有请求,因此将您的DemoApplication.java文件更新为以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    package com.okta.springdocker.demo;

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

    @SpringBootApplication
    public class DemoApplication {

        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }

        @Configuration
        static class OktaOAuth2WebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http.authorizeRequests().anyRequest().permitAll();
            }
        }
    }

    您可以使用以下命令编译和运行您的应用程序:

    1
    2
    ./mvnw package
    java -jar target/demo-0.0.1-SNAPSHOT.jar

    然后,如果您按下http://localhost:8080,您应该会看到"欢迎!"。 信息。

    将您的Spring Boot应用程序作为Docker容器运行

    要将应用程序作为Docker容器运行,第一步是安装Docker。

    安装后,该构建容器了。 为此,Docker使用了一个描述如何组装容器的文件,称为DockerfileDockerfile包含在容器中执行的分步说明。

    注意:访问Dockerfile参考,获得可以使用的所有命令的说明。

    对于您的Spring Boot应用程序,您将使用一个简单的Dockerfile文件:

    注意:您可以浏览许多社区容器,以此作为DockerHub的基础。

    现在,您可以在命令行上构建容器。 在将okta:spring_boot_docker替换为您喜欢的标记时执行以下命令,它将用作引用您正在构建的容器的名称:

    1
    docker build . -t okta:spring_boot_docker

    如果一切顺利,您现在可以运行Dockerized应用程序(使用与以前相同的 tag ):

    1
    docker run --publish=8080:8080 okta:spring_boot_docker

    要停止容器,请按 CTRL-C 。 验证容器未运行,执行:

    1
    docker ps

    这将列出您的计算机上运行的所有容器。 如果您的Spring Boot应用程序仍在运行,则可以使用(使用docker ps打印的 Container ID )终止容器:

    1
    docker kill <CONTAINER_ID>

    当您在构建JAR文件时将其复制到容器中时,每次要使用较新版本的应用程序时,都需要重新构建容器。 因此,周期为:

  • 更改您的代码

  • 生成应用程序./mvnw package

  • 构建容器docker build . -t okta:spring_boot_docker

  • 运行容器docker run --publish=8080:8080 okta:spring_boot_docker

  • 停止容器

  • 现在您知道了使用Docker容器运行应用程序的基础知识! 将来,您可以将已构建的容器发布到Docker注册表中(例如DockerHub),以便其他人可以获取该容器并准备运行。

    接下来,我们将使用Okta保护应用程序,并了解如何将敏感数据传递到容器。

    保护您的Spring Boot和Docker App

    您需要具有的Okta免费开发者帐户。 Okta是SaaS(软件即服务)身份管理提供商。 我们可以轻松地向您的应用程序添加单点登录,社交登录和OAuth 2.0等功能。 如果尚未注册,请在我们的网站上注册一个帐户。

    完成以下步骤以创建OpenID Connect(OIDC)应用程序。

  • 通过developer.okta.com登录到您的开发人员帐户。

  • 导航到应用程序,然后单击添加应用程序

  • 选择网络,然后点击下一步

  • 为应用程序命名(例如Java Spring Boot Docker)

  • 添加以下作为登录重定向URI:http:// localhost:8080 / login / oauth2 / code / okta

  • 点击完成

  • Okta需要一些属性才能正常工作,我们将通过Docker将这些属性作为环境变量发送。

    更改DemoApplication类,将.authorizeRequests().anyRequest().permitAll()替换为.authorizeRequests().anyRequest().authenticated()。 这将告诉Spring您的应用程序的所有端点都需要经过身份验证的用户。

    1
    2
    3
    4
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated();
    }

    试一试吧!

    首先,编译并构建您的容器。 为了使构建过程正常运行,您需要在命令行中提供Okta信息,以替换<org_url><client_id><client_secret>。 您将在Okta帐户中找到这些值。 org_url显示在仪表板的右上角。 client_idclient_secret显示在您的应用程序设置中。

    1
    ./mvnw package

    然后构建容器:

    1
    docker build . -t okta:spring_boot_docker

    为了立即运行容器,您将Okta信息作为环境变量传递给容器。 这是通过使用-e命令行参数完成的。 像这样:

    1
    2
    3
    4
    5
    docker run --publish=8080:8080 \
     -e OKTA_OAUTH2_ISSUER=&lt;org_url&gt;/oauth2/default \
     -e OKTA_OAUTH2_client_id=&lt;client_id&gt; \
     -e OKTA_OAUTH2_client_secret=&lt;client_secret&gt; \
     okta:spring_boot_docker

    现在,如果您按下http://localhost:8080,您将看到一个登录表单,并在提供了用户名和密码后,您将能够再次看到欢迎页面。 使用OIDC / OAuth 2.0保护您的应用程序需要依赖项和几个属性!

    了解有关Spring,Docker和安全性的更多信息!

    在本教程中,您学习了如何通过手动编写Dockerfile来为Spring Boot应用程序构建Docker容器。 还有一个Maven插件可以为您准备容器。 它叫做Jib,我们将在Java,Docker和Spring Boot的Get Jibby中更详细地介绍。

    这篇文章的源代码可以在GitHub上找到。

    如果您对此帖子有任何疑问,请添加评论。

    进一步阅读

    将Spring Boot微服务部署到Docker:快速指南

    为Docker优化Spring Boot应用程序