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的公共资料页面,您应该会看到类似的内容:
这意味着带有应用程序的Docker映像在那里等待部署到AWS EC2计算机。 但这是另一篇博客文章的材料:)
摘要
在几个步骤中,我描述了如何向您的Java项目中添加Docker功能,如何配置映像并将其发布在DockerHub中。 整个过程不是很复杂,让我们准备将应用程序部署到支持Docker的每台Linux机器或服务器上。
翻译自: https://www.javacodegeeks.com/2016/01/dockerizing-spring-boot-application.html