设为首页 收藏本站
查看: 877|回复: 0

[经验分享] Docker 容器整合 Spring Boot 应用

[复制链接]

尚未签到

发表于 2017-11-13 13:08:20 | 显示全部楼层 |阅读模式
在本文中,我们将重点介绍如何对 Spring Boot 应用程序进行 Docker 容器化以在独立的环境(即容器)中运行它。
此外,我们还会展示如何创建容器的集成,它们彼此依赖并在虚拟专用网络中彼此链接。我们还能看到如何通过单个命令进行统一管理。
那么我们先来创建一个运行在 Alpine Linux 的基于 Java 的轻量级基础映像。
基础镜像构建
我们将使用 Docker 独有的编译文件格式: Dockerfile。
Dockerfile 是一个面向行的批处理文件,包含建立一个镜像的命令。将这些命令放在一个文件中不是必须的,我们能够在命令行直接输入命令,但是一个文件会更简单。
所以,让我们写第一个 Dockerfile :
438f00021e5ebddaada5.jpg
FROM:关键字 FROM,告诉 Docker 将给定的图像及其标记用作镜像的基础。如果此映像不在本地库中,则会对 DockerHub 或任何其他配置的远程仓库进行在线搜索。
MAINTAINER:MAINTAINER 通常是一个电子邮件地址,用于识别镜像的作者。
RUN:使用 RUN 命令,我们会在目标系统中执行一个 Shell 命令行。这里我们利用 Alpine Linux 的软件包管理器 Apk 安装 Java 8 OpenJDK。
COPY:最后的命令告诉 Docker 从本地文件系统中复制一些文件到镜像中的给定路径,特别是子文件夹到构建目录中。
要求:为了成功运行本教程,您必须从 Oracle 下载 Java 加密扩展(JCE)无限强度管理策略文件。只需将下载的归档文件解压缩到名为 files 的本地文件夹中。
为了最终能构建镜像并将其存储在本地库中,我们必须运行:
docker build --tag=alpine-java:base --rm=true .
注意:该-tag 选项将定义图像的名称,-rm =true 已成功建成后,将删除中间图像。此 Shell 命令中的最后一个字符是一个点,用作构建目录参数。
Docker 化独立的 Spring Boot
应用程序
作为我们可以容器化的应用的例子,我们从 Spring Cloud Configuration Tutorial 配置 Spring-cloud-config/server 文件。作为一个准备步骤,我们必须组装一个可运行的 Jar 文件并将其复制到我们的 Docker 构建目录中:
438f00021e6083028bd9.jpg
现在,我们将创建一个名为 Dockerfile.server 的 Dockerfile 文件,内容如下:
439000020bdcdb754995.jpg
  • FROM:作为我们的基础镜像,我们将采用在上一节中创建的可运行 Java 程序的 Alpine Linux。
  • COPY:我们让 Docker 将我们的 Jar 文件复制到镜像中。
  • ENV:该命令允许我们定义一些环境变量,这些变量将被容器中运行的应用程序所引用。在这里我们定义 Spring Boot 应用程序的配置,以便稍后将其传递给可执行的 Jar 文件。
  • ENTRYPOINT / CMD:这是在容器启动时启动的可执行文件。我们必须将它们定义为 JSON-Array 格式的,因为我们将使用 ENTRYPOINT 与 CMD 结合的某些应用程序参数。
  • VOLUME:因为我们的容器将在独立的环境中运行,没有直接的网络访问,所以我们必须为我们的配置库定义一个挂载点占位符。
  • EXPOSE:这里我们告诉 Docker,我们的应用程序在哪个端口启动。当容器启动时,该端口将被发布到主机。

我们要从 Dockerfile 创建一个镜像,必须像之前一样运行 'docker build ':
438d00023820fe26bfd3.jpg
但是,在我们从镜像中运行容器之前,我们必须创建一个用于安装的卷:
439000020bddca90f299.jpg
注意:虽然容器是不可变的,但是在应用程序退出后未提交到映像的情况下,存储在卷中的数据将在多个容器中持久存储。
最后我们可以在我们的镜像中运行容器。
438f00021e5d52f30168.jpg
  • 首先,我们要命名我们的容器。如果没有,将选择默认的。
  • 然后,我们必须将我们公开的端口(请参阅 Dockerfile)发布到我们主机上的端口。该值以 “host-port:container-port” 的形式给出。如果只提供了一个容器端口,将使用随机选择的主机端口。如果我们不写这个选项,容器将被完全隔离。
  • Volume 选项可以访问任一主机上的一个目录(以绝对路径使用时)或先前创建的 Docker Volume(当时用 Volume-Name 时)。冒号后面的路径指定容器内的挂载点。
  • 作为参数,我们必须告诉 Docker,要使用哪个镜像。在这里,我们必须从之前的“ docker build ”步骤给出的镜像名称。
  • 一些更有用的选项:

  • -it 启用交互模式并分配虚拟终端机
  • -d 启动后从容器中分离

如果我们在分离模式下运行容器,我们可以检查其细节,停止并使用以下命令将其删除:
438e000224f0423b4ad2.jpg
将互相依赖的应用程序进行容器化
Docker 命令和 Dockerfiles 特别适用于创建单个容器。但是,如果要在隔离的网络上运行微服务,容器管理将会变得非常混乱。
为了解决这个问题,Docker 提供了一个名为 Docker Compose 的工具。它具有自己的 YAML 格式的构建文件,更适合管理多个容器。例如:它能够在一个命令中启动或停止服务组合,或将多个服务的日志输出合并到一个虚拟终端机中。
我们来构建运行在不同 Docker 容器中的两个应用程序的例子。它们将彼此通信,并被视为主机系统的独立单元。我们将把 Spring Cloud 配置教程中描述的 spring-cloud-config / client 示例构建复制到我们的文件夹,就像我们之前使用的配置服务一样。
下面是我们的 Docker-compose.yml:
4391000092e0a4dcbe28.jpg
438d0002381e917f2aca.jpg
  • Version:指定应使用哪种版本的格式。这是必填字段。这里我们使用较新版本,而旧版格式为'1'。
  • Services:此键中的每个对象定义一个服务,也称为容器。这个选项是必填的。
  • Build:如果指定,docker-compose 可以从 Dockerfile 构建镜像。
  • Context:如果指定,就会生成 Dockerfile 中制定的目录。
  • Dockerfile:如果指定,它会生成一个Dockerfile 中设置的备用名称。
  • Image:在构建功能被使用时,告诉 Docker 它应该使用的镜像的名字。否则,它会在本地库或远程注册表中搜索此图像。
  • Networks:这是命名网络名称的标识符。给定的名称值必须是在网络节点中存在的。
  • Volumes:标识要使用的命名卷和挂载点,以冒号分隔。同样应该是在网络节点中存在的,卷名必须在单独的卷部分中定义。
  • Links:将创建此服务和列出的服务之间的内部网络链接。此服务将连接到列出的服务,其中冒号之前的部分从服务节点中指定服务名称,冒号后面的部分是指定服务在外部端口上侦听的主机名。
  • Depends_on:告诉 Docker 仅启动服务,如果列出的服务已成功启动。注意:这只在容器级别有用!关于启动从属应用程序的解决方法,请参阅 Config-client-entrypoint.sh。
  • Logging:这里我们使用 'json-file' 驱动,这是默认驱动。可替换为其他日志驱动或使用 “none”。
  • Networks:在本选项中,我们将指定可用于我们服务的网络。在这个例子中,我们让 docker-compose 创建一个对我们来说名为“桥接”的网络类型。如果选项 external 设置为 true,它将使用具有给定名称的现有选项。
  • Volumes:这与网络部分相似。

在继续之前,我们将检查我们的构建文件以检查语法错误:
438c00024fc1eb9ebb9d.jpg
下面是我们的 Dockerfile.client 来构建配置客户端映像。它不同于 Dockerfile.server,因为我们还安装了 OpenBSD netcat(这在下一步需要),并使 Entrypoint 成为可执行文件:
43920000132f7f87f07f.jpg
这是我们的配置客户端服务定制的 Entrypoint。这里我们在一个循环中使用 netcat 来检查我们的配置服务器是否准备就绪。您必须注意,我们可以通过其链接名称而不是 IP 地址访问我们的配置服务器:
438c00024fc4cd986b94.jpg
最后,我们可以构建我们的镜像,创建定义的容器并在一个命令中启动它们:
438d00023822e64a1b6f.jpg
要停止容器,请将其从 Docker 中删除,并从中删除所连接的网络和卷,我们可以使用相反的命令:
439000020be25a87325d.jpg
Docker-compose 的一个很好的功能是扩容服务的能力。例如,我们可以告诉 Docker 启动一个容器配置服务器和三个容器的配置客户端。
但是为了正常工作,我们必须让 Docker 选择一个 Container_name 从 Docker-compose.yml 中删除,我们必须更改暴露的端口配置,以避免冲突。
之后,我们可以扩容我们的服务,扩容为拥有3台 Client 的集群:
438c00024fc57b9587d5.jpg
结论
正如我们所看到的,我们现在可以构建定制的 Docker 映像,用 Docker 容器运行 Spring Boot 应用程序,并使用 Docker-compose 创建依赖容器。
有关构建文件的进一步阅读,请参考官方 Dockerfile Reference 和 Docker-compose.yml reference。
作者:靳日阳,JFrog 研发工程师
具有多年软件开发经验;对Java主流技术、前沿框架都具有丰富的开发经验;擅长Linux服务器,对优化,部署等有深入研究,熟悉Jenkins,持续集成及交付,DevOps等。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-406981-1-1.html 上篇帖子: 使用Docker快速搭建sftp服务 下篇帖子: docker第一天:docker的基本原理与安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表