OpenShift的容器映像(第3部分):使你的映像可用

这是我在2017年欧洲、中东和非洲(EMEA)红帽技术交流会议上的一个会议记录,该会议集合了EMEA所有红帽解决方案架构师和顾问。它主要讨论在创建运行于OpenShift上的映像时需要考虑的事项和好的实践(案例)。第三部分重点介绍如何让应用程序开发者或发布管理员更容易地使用映像。

版本

当你指定映像以启动容器或创建子映像时,你需要提供要使用的版本。如果没有,则使用带有“latest”标签的版本。

让我们来看看红帽创建版本层次结构的方式。这是一个很好的策略示例,你可以重复使用自己的映像。

一个非常重要的方面是在下游用户的标签内保持向后兼容性。新版本的映像的发布不应该破坏子映像。

红帽映像版本与产品相对应,该产品是容器的一部分。举例来说,rhel7 / rhel标记的方式如下:

7.4-81 / 7.4 / latest
7.3-97 / 7.3
7.3-95
7.3-82
...

请注意,没有7标记,因为兼容性在主版本之间不能保证 - 仅在次版本之间可以。看到这篇文章的底部。标签7.4-81,7.4和最新的参考相同的映像。映像用户可以任意使用这些标签中的其中一个,各个标签如下:

  • 最新版本:每次推出新版本时,用户都会得到不同的映像。
  • 7.4:每次推送次版本7.4的新版本时,用户都会得到不同的映像。子映像自动获取补丁。
  • 7.4-81:用户不会得到更新。

对于你想要在生产中验证和运行的任何东西,你应该使用一个稳定的标签,而不是使用最新的。这个建议是适用于小版本,如示例中的7.4,这样你的映像就会自动更新补丁。如果你在这里发布一个特定的版本,比如说7.4-81,你需要有一个合适的工作流程来修补你自己的映像。

你可以在开发映像的项目中使用最新的标签,以自动查看最新的更改。更少情况是,在开发阶段,你可能希望只要最新版本一发布就使用该版本的映像。

文档

使映像可用的下一个方面显然是文档。用户指南肯定是有用的,但你也可以在映像或OpenShift级别上做些其他的事情。

通过提供快速启动的模板,可以演示用户如何根据映像运行应用程序。

使用映像元数据,你可以将最重要的要点记录在映像本身中:

  • 你可以使用标签来添加说明,提供维护人员的联系信息,权威来源的地址,构建,发布和组件信息等。
  • 公开在Dockerfile中重要的端口也提供了关于如何运行映像和应用程序应该如何连接的重要信息。
  • 与公开端口相同。映像使用者然后意识到数据在映像内被写入的地方可能需要被持久化。
  • 设置环境变量,如PATH,JAVA_HOME和对映像配置的声音默认设置也有助于一个简单的开始。
  • 最后,你必须用CMD或ENTRYPOINT(入口点)来指定你的映像进程如何开始。

以下是RHEL7映像可用的元数据摘录。完整的设置在这里可用。

rhel7 / RHEL:

Env
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin  
    container=oci
Cmd
    /bin/bash
Labels
    com.redhat.component rhel-server-docker
    authoritative-source-url registry.access.redhat.com
    distribution-scope public
    vendor Red Hat, Inc.
    description The Red Hat Enterprise Linux Base image...
[...]

扩展点

在第二部分中,我们首先看到了扩展点。使映像使用者能够覆盖映像创建者无法预见的场景和配置,或者使组合数量难以管理的场景和配置非常重要。扩展点旨在避免将你创建的映像层重写为映像的一部分。

运行时注入环境信息

这可以通过两种方式完成:通过设置环境变量或在启动时将文件挂载到容器文件系统中。

环境变量可以添加到部署配置中或由ConfigMap提供。你可以使用这种方式指定应用程序调用的服务的地址。

可以从ConfigMaps中将文件挂载到容器上,以提供日志配置,或从Secrets中以提供应用程序所需的证书或其他凭据。

在生成时配置

如果你创建了一个构建器映像,则可能还需要用户注入构建配置。例如,你可以允许指定一个带有环境变量的Maven仓库。但是,这可能还不够,而且你的构建器映像应允许用户使用源注入完整的settings.xml。

你可能已经在汇编脚本中定义了应用程序的编译和映像的配置。映像库和驱动程序的灵活性可以通过映像采集(参见本系列的第2部分)提供给最终映像,但允许映像用户通过扩展或者取代它的一些逻辑来调整构建过程仍然是个不错的方法。例如,可以通过使在汇编脚本中生成或调用的脚本能够被用户的应用源代码提供的脚本替换,从而实现这一点。

外部构建

第2部分中,我们也看到允许用户在外部构建应用程序,并只在OpenShift上构建容器映像。这背后的理由是,在引入容器技术之前,公司可能已经投资了自动化和集成的CI / CD管道和相关的基础设施。外部构建允许他们继续使用这个基础设施,因为他们正在转移到一个作为服务平台的容器。

有两个明智的做法。第一个方法是将应用程序工件从其CI工具(例如Jenkins)通过二进制构建流式传输到构建器映像中。

第二种方法是从公司存储库下载工件。这可以使用curl或wget来完成,但对于Java应用程序,你可能已经在构建器映像中拥有Maven,Maven依赖关系插件是一种便捷方式。

本文的版权归 marsggbo 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏赵康的专栏

容器技术概述

容器是一种轻量级的、操作系统级别的虚拟化技术,它允许我们在资源隔离的进程中运行应用程序及其依赖项。运行应用程序所需的所有必要组件都可以打包为单个可以复用的映像。...

24460
来自专栏Java工程师日常干货

docker化你的java应用(下)

在《docker化你的java应用(上)》中,我们已经初步接触了docker的核心概念与思想,本篇博客将对docker进行实践,会介绍一些docker常用的命令...

15610
来自专栏北京马哥教育

写给新手的十一条 Docker 守则

18250
来自专栏北京马哥教育

docker容器技术系列一:基本概念

前言:从去年下半年开始,我们就尝试在使用docker部署生产应用,至现在已经有十多个项目使用了docker容器部署,docker为我们节约 了大量的服务器资源,...

30840
来自专栏大魏分享(微信公众号:david-share)

Openshift-F5集成(南北流量走F5)

22120
来自专栏程序你好

从 Docker 的新手村出发?那么你需要这11条守则

11420
来自专栏从零学习云计算

kubernetes学习记录(1)——kubernetes初理解

入门时,学习阅读的为《你闺女也能看懂的插画版Kubernetes指南》。由Deis的平台架构师Matt Butcher向他女儿介绍什么是Kubernetes,内...

54400
来自专栏数据科学与人工智能

【Python环境】如何使用 Docker 快速配置数据科学开发环境?

数据科学开发环境配置起来让人头疼,会碰到包版本不一致、错误信息不熟悉和编译时间漫长等问题。这很容易让人垂头丧气,也使得迈入数据科学的这第一步十分艰难。而且这也是...

49950
来自专栏云鼎实验室的专栏

ShadowBreaker方程式工具包浅析

今日,臭名昭著的方程式组织工具包再次被公开,TheShadowBrokers在steemit.com博客上提供了相关消息。 本次被公开的工具包大小为117.9M...

41340

构建远程缓存系统

上个月,我们的工程团队发布了一个大的更新,关于在使用我们的Docker平台Jet时Docker镜像是如何被缓存和存储的。在本文中,我们将讨论更新的动机,特性的设...

25760

扫码关注云+社区

领取腾讯云代金券