gpt4 book ai didi

php - 可以将Docker镜像设为 “built” (“compiled”)而不要求Docker吗?

转载 作者:行者123 更新时间:2023-12-02 18:15:07 26 4
gpt4 key购买 nike

我在Docker进行实验和开发方面的经验非常少,而在登台和部署方面对Docker的经验则为零,因此请原谅任何听起来很幼稚的内容。

主要问题

假设我有一个Docker镜像(甚至是由几个镜像和服务组成的docker-compose.yml文件),在运行时,它会为我的应用设置环境并运行我的应用-允许在公共(public)开放端口上进行连接并响应请求。

为了在生产环境中运行此镜像(并因此在生产环境中运行我的应用程序),生产服务器必须安装了Docker。这感觉像是对The Twelve-Factor App设计的违反。特别是当您考虑Port Binding原则时:

The twelve-factor app is completely self-contained



就像应用程序不应该依赖Apache或nginx进行安装一样,应用程序也不应该依赖Docker吗?

这使我想知道是否有办法将Docker运行时和镜像“打包”,“构建”或以其他方式“编译”为可执行二进制文件。可以部署到 任何服务器上的东西,并可以作为一个进程运行,而无需先安装Docker。

现在,可能我只是在考虑这完全错误。因此,我在下面详细介绍了我所关注的问题和细节。

是什么导致了这个

我有一个以前使用 Cloud9开发的Web应用程序项目。当我将该项目推向生产环境时,我会通过SSH手动登录生产服务器并执行 git pullcomposer updatenpm installgulp。我有点麻烦,但是对于 非常小来说,我正在努力工作,这已经足够了,这比从FTP上传我的所有依赖项要好得多。

但是,我偶尔会遇到外部依赖项带来的挑战。某些东西在开发中工作正常,然后将其推向生产环境时,我意识到生产服务器具有过时的MySQL版本。或生产服务器上安装的pngquant版本有错误。否则服务器上的nginx配置与开发中的nginx配置不完全匹配,并且在路由格式错误的请求时会导致一些边缘情况。

今天,当我尝试将项目加载到 CodeAnywhere而不是Cloud9中时,所有这些问题一下子就解决了。我必须确保:
  • PHP版本已更新
  • NodeJS已更新
  • NPM已更新
  • cURL已安装
  • 所有必需的PHP扩展均已安装
  • 已安装了几个GNU库

  • 我花了 小时来尝试运行此代码-这是我编写的代码

    所有这些问题使我想起The Twelve-Factor App设计。因此,我跳到该网站,并做了一些思考来弄清楚我做错了什么。

    注意:我不单单开发然后直接部署到生产中。我实际上是在BitBucket中设置了这个项目,我使用票务系统来跟踪更改,为每个票证创建了一个分支,并且在合并到master之前在临时环境中 check out 了分支。因此,我创建了一个相当强大的系统来管理更改,以避免错误渗入生产环境并允许进行敏捷开发。但是,当涉及在生产中 checkout 分支时,它是相同的手动废话:git pullcomposer updatenpm installgulp

    我喜欢Docker的什么

    在源代码控制的配置文件中定义我的工作环境的能力将消除我的大部分问题。我再也不需要确保PHP是最新的,确保NodeJS是最新的,确保已安装cURL等。如果Docker镜像具有所有依赖项,则在分阶段或生产中部署时,它仍将具有那些依赖项。开发的各个阶段之间环境的一致性将使我的生活变得更加轻松。

    另外,我还没有使用来测试这个高级的,但是我想知道Docker可以很容易地设置自动化部署。如果我可以单击BitBucket中的一个分支,然后单击“发送到暂存”,然后在一分钟后将其部署并准备进行测试-这样可以每周节省我数小时的时间。如果我可以类似地将代码合并到母版后自动将其部署到生产环境中,那不仅可以节省我的时间,而且可以避免完成的功能在BitBucket中陷入瘫痪并且永远不会出现在客户面前的风险。

    最后,这最终可能是一个有争议的话题,我将了解Docker使绿色/蓝色部署更加容易。当前,当我对生产进行新更改时,生产服务器会短暂离线。通常只持续15到20秒,但一次是一个小时。在这15到20秒的窗口中,我正在运行composer updatenpm installgulp。前两个命令通常不需要执行任何操作(因为我的依赖关系不会经常更改),并且gulp通常在15秒内完成。但是,当依赖项进行更改时,或者存在较大问题(例如需要升级MySQL)时,该站点可能会关闭一整小时。如果我可以缓慢而从容地部署到辅助生产服务器,然后在我验证交换机正常工作的情况下以毫秒为单位切换该开关,则这将意味着减少停机时间并带来更多客户满意。

    当然,最后一个可能是有争议的,因为我目前不使用“构建”步骤(十二要素应用程序的另一部分),并且所有这些步骤都应属于“构建”阶段的一部分-而不是“部署”阶段。

    我不喜欢Docker的地方

    它是,是又一个学习的工具。为了了解和开发我的应用,您已经需要了解:
  • PHP
  • Composer
  • Symfony
  • Laravel
  • NodeJS
  • NPM
  • Gulp
  • bootstrap
  • VueJS
  • (可能我现在想不起的其他很多东西)

  • 如果将“Docker”添加到该列表中,则意味着如果我将其交给其他开发人员,则该项目将很难培训某个人。我希望更少的依赖关系,而不是更多。

    此外,Docker并非默认为我所知道的任何操作系统。因此,这与cURL不同,尽管从技术上讲它是第三方依赖项,但通常可以期望人们拥有它。相反,它是一个完整的野兽,必须单独安装。

    前一个问题我无法真正解决。如果我选择使用Docker,则意味着向该应用程序的工具箱中添加了一个工具。但是,如果可以将Docker镜像以某种方式编译为独立的二进制文件,则可以避免后一个问题。

    最佳答案

    严格来说,您可以从没有docker的docker镜像运行容器。 Docker镜像是一种众所周知的格式。有关此规范的更多详细信息,请参见https://github.com/opencontainers/image-spec。 OCI镜像的运行时有多种实现。 Docker本身实际上并不运行容器,该任务已外包给容器化。

    但是,镜像附带文件系统(也称为一堆tar文件),但是容器也希望使用 namespace 来隔离应用程序。您需要某种类型的运行时来实现此目的。容器不仅是打包应用程序的一种方法,而且是一种隔离运行它们的方法,尝试将它们拆开将比docker本身做更多的工作,并且需要学习的东西更大。

    关于php - 可以将Docker镜像设为 “built” (“compiled”)而不要求Docker吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50082971/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com