欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Dockerizing Spring Boot应用程序

程序员文章站 2022-06-10 18:59:24
...

Docker在这里,Docker在这里,我到处都看到Dockers

在这篇文章中,我将描述将Spring Boot应用程序迁移到Docker的过程。 我们将从修改构建文件开始,然后创建Dockerfile,以便可以在本地运行它。 最后,我们将在DockerHub中发布我们的映像。

介绍

几个月前,我启动了一个名为JVM Bloggers的新个人项目,目的是帮助波兰程序员传播有关其新博客文章的新闻。 最初,此Spring Boot应用程序托管在我的本地计算机上,然后将其迁移到Heroku上的免费帐户。

在第一周,我很满意:应用程序不必全天候在线24/7,因此每天睡眠8小时(限制免费Heroku帐户)不是什么大问题,500 MB的内存上限也没有限制我。 但是随着JVM Blogger的成长,我开始遇到内存使用方面的奇怪问题:应用程序开始消耗500-550MB,并且很难找到这种行为的来源。 我什至没有在连接了探查器的本地计算机上运行应用程序,但仍然没有发现任何可疑之处。

由于我必须监视应用程序并每隔1-2天重新启动它,因此内存占用问题变得很烦人,并且由于Heroku的特性,我无法简单地将SSH SSH到服务器并调试或将探查器附加到正在运行的进程。 很明显,如果我要向JVM Blogger添加更多功能,则必须将其迁移到更灵活的东西–带有Docker的Linux机器。

码头工人

如今, Docker已成为许多开发人员中非常流行的话题,尤其是在向微服务架构迁移的项目中。 但是从我的问题的角度来看,最有趣的功能是能够创建我的应用程序的标准图像,并在不同的环境中运行它而无需担心差异。 可以在本地或几乎任何Linux机器上部署一个映像,因此使用Docker,我可以在本地测试我的应用程序,将其部署在AWS或其他地方而不会带来很多麻烦。

移民

首先,我们必须在build.gradle脚本中添加一些新的依赖项和任务:

buildscript {
    // ...
    dependencies {
        // ...
        classpath('se.transmode.gradle:gradle-docker:1.2')
    }
}

// ...

group = 'tdziurko' // this will be my login at DockerHub (more about it later in this post)

task buildDocker(type: Docker, dependsOn: build) {      // this task will build our Docker image
    push = true
    applicationName = jar.baseName
    dockerfile = file('src/main/docker/Dockerfile')
    doFirst {
        copy {
            from jar
            into stageDir
        }
    }
}

在第17行中,我们指定了Dockerfile的位置,现在是时候在此处创建一个了。

创建Dockerfile

Dockerfile是一个配置文件,它指定如何创建我们的Docker映像,以供日后部署。

FROM java:8
MAINTAINER aaa@qq.com
VOLUME /tmp
EXPOSE 8080

ENV USER_NAME blogger
ENV APP_HOME /home/$USER_NAME/app

RUN useradd -ms /bin/bash $USER_NAME
RUN mkdir $APP_HOME

ADD jvm-bloggers-0.5.0.jar $APP_HOME/jvm-bloggers.jar
RUN chown $USER_NAME $APP_HOME/jvm-bloggers.jar

USER $USER_NAME
WORKDIR $APP_HOME
RUN bash -c 'touch jvm-bloggers.jar'

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","jvm-bloggers.jar"]

因此,让我一步一步解释这个文件:

  • FROM java:8 :我们的基本映像,类似于Java中的extend关键字。 在这里,我们要基于已安装Java 8的映像
  • VOLUME / tmp :我们的应用程序可以在其中向磁盘写入内容的安装目录
  • EXPOSE 8080 :将启动我们的应用程序的端口号,它将在Docker容器的外部可用
  • ENV USER_NAME Blogger :具有用户名的帮助程序变量,我们将使用它运行我们的应用程序
  • ENV APP_HOME / home / $ USER_NAME / app :下一个帮助程序变量,其中包含我们应用程序所在的目录
  • RUN useradd -ms / bin / bash $ USER_NAME :使用在$ USER_NAME中定义的名称创建用户
  • RUN mkdir $ APP_HOME :创建应用程序目录
  • 添加jvm-bloggers-0.5.0.jar $ APP_HOME / jvm-bloggers.jar :将fat-jar添加到我们的映像中,并将其放入$ APP_HOME中
  • RUN chown $ USER_NAME $ APP_HOME / jvm-bloggers.jar :先前所有命令均以ROOT身份执行,因此我们需要将jar文件的所有者更改为$ USER_NAME 由于安全性,通常在Docker中使用ROOT被认为是错误的方法。
  • USER $ USER_NAME; WORKDIR $ APP_HOME :将用户和工作目录更改为我们要用于运行应用程序的目录
  • RUN bash -c'touch jvm-bloggers.jar' :触摸我们的文件,以便它具有修改时间
  • ENTRYPOINT [“ java”,“-Djava.security.egd = file:/ dev /./ urandom”,“-jar”,“ jvm-bloggers.jar”] :执行我们的fat-jar(urandom用于Tomcat的熵)

在本地运行Docker映像

现在,我们已经准备就绪,可以构建和启动Docker映像了。

./gradlew clean build buildDocker

响应:

:buildDocker FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':buildDocker'.
> Docker execution failed
  Command line [docker push tdziurko/jvm-bloggers:latest] returned:
  unauthorized: access to the requested resource is not authorized

任务构建Docker失败,因为您在DockerHub上没有帐户或未登录那里。 但是如果您检查本地图像

docker images

您将看到带有最新标签的图像可以使用:

REPOSITORY                  TAG                             IMAGE ID            CREATED             VIRTUAL SIZE
tdziurko/jvm-bloggers       latest                          a09f884c5aa9        11 minutes ago      785.6 MB

因此,我们可以使用以下命令在docker容器中运行它:

docker run -p 8080:8080 --add-host=database:<your_local_db_host> -e jasypt.encryptor.password="<secretPassword>" -e spring.profiles.active="dev" tdziurko/jvm-bloggers:latest

同样,一些片段需要更详细的说明:

  • —add-host = database:<your_local_db_host> :将地址添加到容器中的/ etc / hosts中, 数据库 var应该是我们数据库的地址,例如192.168.0.101
  • -e jasypt.encryptor.password =“ ”:Jasypt密码,用于解密* .properties文件中的某些值,-e将其作为env变量添加到容器中
  • -e spring.profiles.active =“ dev” :Spring引导配置文件。 dev是用于在本地运行应用程序的一种

几秒钟后,您应该看到我们的应用程序已启动,并且正在Docker容器中运行。

发布到DockerHub

只要您计划仅在自己的计算机上使用Docker映像,就可以在本地使用它,但是由于我们的目标是AWS部署,因此我们需要将映像发布到DockerHub,因此可以从任何Linux机器*问它。

首先需要在此处创建帐户(在我的情况下为tdziurko ),然后使用Docker客户端登录,以便我们进行发布。

$ docker login
Username: tdziurko
Password:
Email: aaa@qq.com
WARNING: login credentials saved in /Users/tomek/.docker/config.json
Login Succeeded

现在我们可以重建应用程序以将映像推送到DockerHub:

./gradlew clean build buildDocker

几分钟后,我们将看到消息BUILD SUCCESSFUL ,如果您访问DockerHub的公共资料页面,您应该会看到类似的内容:

Dockerizing Spring Boot应用程序

这意味着带有应用程序的Docker映像在那里等待部署到AWS EC2计算机。 但这是另一篇博客文章的材料:)

摘要

在几个步骤中,我描述了如何向您的Java项目中添加Docker功能,如何配置映像并将其发布在DockerHub中。 整个过程不是很复杂,让我们准备将应用程序部署到支持Docker的每台Linux机器或服务器上。

翻译自: https://www.javacodegeeks.com/2016/01/dockerizing-spring-boot-application.html