前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sprngboot应用docker化

sprngboot应用docker化

作者头像
叔牙
发布2020-11-19 17:44:01
5800
发布2020-11-19 17:44:01
举报

sprngboot应用docker化

点击「蓝色微信名」可快速关注

在本文中,我们将学习如何将springboot应用docker化,我们使用Maven基于springboot应用构建docker镜像,并从docker镜像中运行springboot应用程序。

1

创建springboot应用

创建springboot应用,并编写简单请求处理器:

@RestController @Slf4j public class IndexController { @GetMapping("/hello") public String hello() { log.info("print log ,string={}","hello"); return "hello"; } }

使用以下maven命令从项目根目录运行应用程序:

mvn spring-boot:run

使用命令行发送请求:

curl -X GET http://localhost:8080/hello

可以看到响应:

2

springboot应用docker化

上一步中我们已经创建了一个springboot应用,下一步是将其docker化,首先要安装docker,请遵循官方docker安装指南,此处不做赘述,我们将使用dockerfile构建镜像,制作一个应用程序的docker镜像可以方便的在内部服务器或者云服务器部署和扩展。

2.1:使用dockerfile构建镜像

docker是通过读取dockerfile中的指令来构建镜像,dockerfile是一个文本文件,包含构建镜像的命令,通过使用docker build命令,我们可以执行包含在dockerfile中的镜像构建指令。dockerfile的格式大致如下:

#comment INSTRUCTION arguments

指令中大小写不敏感,但是通常使用大写字母来区分指令和参数,从而提高可读性。在我们的案例中,dockerfile内容大致如下:

FROM java:8-jdk-alpine COPY ./target/demo39-docker-1.0-SNAPSHOT.jar /usr/app/ WORKDIR /usr/app ENTRYPOINT [“java”,”-jar”,”demo39-docker-1.0-SNAPSHOT.jar”]

下面是dockerfile中命令的描述。

dockerfile必须以“from”指令开头。我们使用这个关键字来指示Docker使用我们正在构建的基础镜像。后面是一个或多个参数,用于声明dockerfile中使用的参数。我们可以从头开始创建Docker镜像,或者使用Docker Hub中现有的映像。在我们的示例中,我们使用带有“8JDK-alpple”标签的“Java”镜像。该镜像是基于Java的 alpine Linux镜像,使用基于alpine的镜像的主要优点是增强了容器的安全性并减小了容器的大小,JDK的版本是8。

  • COPY--这个指令表示docker从<src>复制新的文件或目录,并将它们复制到位于路径<dest>的容器的文件系统中。在我们的示例中,我们复制.jar文件以在/usr/app中构建Linux镜像。
  • WORKDIR--指令表示docker为在dockerfile中指定的run、cmd、entrypoint、copy和add指令设置工作目录。在我们的示例中,我们将workdir设置为/usr/app。因此,我们不需要一次又一次地写完整的路径。
  • RUN--Docker-在目标系统中执行shell命令行。
  • ENTRYPOINT--指示Docker通过指定如何运行应用程序来配置将作为可执行文件运行的容器。在我们的示例中,我们将Spring启动应用程序运行为java -jar <appName>.jar。

2.2:构建镜像

要创建docker映像,我们需要.jar文件。要生成JAR文件,需要运行:

mvn -U clean package

jar包构建成功后,将会在target目录下生成demo39-docker-1.0-SNAPSHOT.jar文件,然后我们可以使用docker build构建docker镜像,从包含dockerfile的目录中运行以下命令:

docker build -t sample-app .

-t 参数指定docker镜像的名称,`.`指定dockerfile的位置(当前目录)。生成的镜像存储在本地Docker注册表中,并用名称“sample-app”标记。

下面是构建过程的屏幕截图:

我们可以使用以下命令检查镜像是否存在:

docker images

我们可以使用docker run命令运行docker images。如我们所知,它隔离了每个容器,并且有一个环境,我们需要映射宿主机-8080的端口和容器-8080的端口,指定为-p 8080:8080参数来运行我们的应用程序。

docker run --rm -it -p 8080:8080 sample-app

要检查我们的springboot应用程序是否在Docker容器中运行,我们可以通过浏览器发送请求:http://localhost:8080/hello

至此,我们成功地使用dockerfile构建了docker镜像。

2.3:基于maven将springboot应用docker化

我们了解了如何编写一个简单的dockerfile,以及如何使用docker build命令构建我们的应用程序。但是,在使用本机构建方法的项目中可能会遇到一些问题:首先,在创建docker文件时,我们需要提供版本和jar名称。随着应用程序的发展,版本不断更新,在Docker文件中更新这一版本的开销也随之增加。这是早期方法中出现的一个问题。

前一种方法的另一个开销是,要运行docker命令,我们需要在终端中运行它,并且需要手动执行它。如果dockerfile是作为maven生命周期的一部分在内部创建的,允许我们在集成过程中构建图像,就可以避免这种开销。有一些maven插件随时可用,我们可以在pom.xml中进行配置,以便在内部创建dockerfile。然后,根据生成的dockerfile构建镜像。因此,我们避免了在终端中手动运行构建命令的开销。

比较常用的就是com.spotify/docker-maven-plugin maven插件,可以在我们的应用程序中使用。将这个插件包含在pom.xml文件中。我们的pom.xml如下所示:

<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName> <dockerDirectory>${basedir}/</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>

然后执行命令:

mvn package docker:build

检查是否成功生成镜像:

docker images

使用docker run --rm -it -p 8080:8080 springboot-demo39-docker命令运行镜像,并尝试在浏览器中访问http://localhost:8080/hello并且可以看到正确结果

注意

我们必须确保停止以前运行的使用端口8080的容器,以避免出现错误。我们使用以下命令来了解正在运行的容器:

docker ps

如果端口已经被占用,我们可以使用docker stop <CONTAINER ID> 或者 docker rm -f .命令关闭容器或者强制删除运行中的容器。

总结

在本文中,我们学习了对springboot应用程序进行docker化,并且了解了如何使用两种常用的方法使用Docker文件将我们的springboot应用程序构建成docker镜像,一种是基于dockerfile和原生docker命令,另一种方法使用Maven插件来构建Docker镜像。docker容器运行后,从请求发起到容器中应用程序接收处理的链路大致如下:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PersistentCoder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档