构建 Docker 镜像以支持多环境

构建 Docker 镜像以支持多环境

我正在为我们的服务器构建 docker 镜像,并且在创建 DOCKERFILE 时寻找与多环境支持相关的最佳实践。

服务器的主要目的是在 Centos 6 上运行 LAMP,我希望使 DOCKERFILE 尽可能通用,以支持开发和生产环境。这些镜像将具有许多通用配置/实用程序,以及一些差异。

差异例如:

  • 仅限生产:监控工具、防病毒软件和不同的 LAMP 配置
  • 仅限开发:xdebug、分析实用程序和不同的 LAMP 配置

我想过使用类似以下结构的东西:

  • 定制基础操作系统(C1)
    • 产品基础操作系统 (C1E1)
    • 开发基础操作系统 (C1E2)
  • Web 图像 (httpd、apache..) (C2)
    • 产品调整(C2E1)
    • 开发调整(C2E2)
  • DB 图像 (C3)
    • 生产调整(C3E1)
    • 开发调整(C3E2)
  • 数据图像(C4)
    • 生产调整(C4E1)
    • 开发调整(C4E2)
  • Samba 图像(仅限开发人员)(C5)

但是正如你所看到的,使用当前的继承机制是不可能做到这一点的,而且即使可以,也是不可维护的。

我找不到在 DOCKERFILE 中使用 ENV 条件的方法(例如,仅在 RUN 命令中使用基于 Linux 的条件)。

目前我正在使用以下结构:

  • 基础镜像(常见的东西,比如 LAMP、utils..)
    • 开发镜像(开发专用工具/配置)
    • 产品图像(产品特定...)

上述情况有最佳实践吗?复制图像(双重维护)是唯一的可能性吗?

答案1

Docker 的概念之一是拥有相同的环境 - 如果生产环境与开发环境不同,那么当应用程序投入生产时,您就无法确定它是否真的可以完全确定地工作。

来自docker.com:

消除环境不一致

通过将应用程序及其配置和依赖项打包在一起并作为容器运送,应用程序将始终按照设计在本地、另一台机器、测试或生产中运行。无需再担心必须将相同的配置安装到不同的环境中。

话虽如此,生产和开发当然会有差异,但这主要体现在应用程序配置方面——例如,开发实例不会向客户发送电子邮件,而是向虚拟邮箱发送电子邮件等。

我认为,像您在文章中所说的那样,在生产和开发之间存在如此大的差异是不对的。

至于开发和生产配置之间的区别(如我上面给出的例子),我个人认为有两种可行的方法。

  1. 在 Dev 中,Dockerfile 会覆盖生产和开发的公共基础的某些配置。

  2. 您的容器运行某些东西 - 启动 httpd 等。启动该过程的脚本将首先根据环境变量(例如docker run ... -e RUNAS=PROD ...)从 Git 或任何存储库中提取配置 - 这是我所做的。在我的例子中,运行 Tomcat 的容器,Tomcat 启动脚本只是根据环境变量(例如-e VERSION=current)下载 war 文件版本,并根据定义是生产还是开发的变量从 Git 中提取配置文件(-e RUNAS=DEV)。

相关内容