【问题标题】:Elixir/Erlang Applications with Docker in production?在生产环境中使用 Docker 的 Elixir/Erlang 应用程序?
【发布时间】:2018-05-15 11:58:20
【问题描述】:

我想知道在生产中使用或不使用 Docker 与 Elixir/Erlang 应用程序的强烈理由是什么。这是我第一次被要求在生产中使用 Docker。我曾在没有 Docker 的生产。我是 Erlang/Elixir 开发人员。我在高流量生产服务器上工作,每秒有数百万个事务在没有 Docker 的情况下运行。我花了一天时间创建和运行 Elixir 应用程序镜像,但存在很多问题网络。我必须为 DNS 设置等进行大量配置。之后,我开始思考继续进行下去的有力理由是什么。是否有充分的理由在生产中使用带有 Elixir/Erlang 应用程序的 Docker。

我在论坛中查看了一些原因,但仍然不相信。docker 提供的所有优势都已经存在于 Erlang VM 中。表格中的任何 Erlang 专家都可以帮助我吗?

【问题讨论】:

    标签: erlang elixir


    【解决方案1】:

    我在生产环境中的 AWS 上部署以 Docker 打包的 Elixir。 这曾经是我首选的做事方式,但现在我更倾向于使用 Packer 创建自己的 AMI,并预先安装所有内容。

    部署的核心是控制,在某种程度上我觉得在利用 Docker 时已经放弃了控制。

    Docker 的主要缺点是它限制了 Erlang/Elixir 的功能,例如通过epmd 的节点间连接。这也意味着remsh 几乎是不可能的,而酷炫的:observer.start 是不行的。如果您出于某种原因需要与生产节点进行交互,那么首先 ssh-ing 进入服务器、进入 Docker 等存在额外的障碍。当它只是检查某些东西时很好,当生产正在燃烧时令人沮丧痛苦地倒下。在一个节点中启动多个容器有点没用,因为 BEAM 可以有效地利用您的所有内核。热升级实际上是不可能的,但这并不是我们个人具有内在业务需求的功能。

    已努力让 epmd 在容器设置中工作,例如:https://github.com/Random-Liu/Erlang-In-Docker,但这需要您重新构建 Erlang 以进行自定义 net_kernel 修改。

    亚马逊最近发布了 AWS ECS 的一项新功能,AWS VPC Networking 模式,这可能有助于容器间的epmd 通信,从而直接连接到您的节点。我还没有验证过。

    除了epmd 通信的问题之外,还有部署时间的问题。使用 Docker 创建你的镜像,即使你的镜像只有 5MB,很快就会占用 300MB,其中 200MB 仅用于创建你的发布的所有各种依赖项。可能有办法减少这种情况,但这需要专业知识和专门的努力。我会将这个额外的空间更多地归类为烦恼而不是破坏交易,但相信我,如果您必须等待 25 分钟才能完成不可变部署,那么您可以节省的任何一分钟都是值得的。

    在性能方面,我没有注意到裸机部署和 docker 部署之间存在显着差异。 AWS EB Docker 很好地将容器资源扩展到 EC2 实例的资源。

    优势当然是便携性。如果您的前端工程师需要使用 JSON API,那么就本地开发而言,这是一个巨大的胜利,通过一些仔细的设置,他们可以生成在本地运行的最新 api,而无需了解 Erlang/Elixir /Rserve/Postgres。

    此外,供应商锁定也大大减少,尤其是自从 AWS 推出对 Kubernetes 的支持以来

    这是一个权衡的问题,如果您是需要投入生产的开发人员并且对 Devops 了解很少,那么可能需要进行 Docker 部署。如果您更熟悉基础架构、部署等,那么作为开发人员,我相信创建自己的 AMI 可以让您更好地控制自己的环境。 总而言之,我鼓励至少玩弄Docker 并尝试一下,它可能会打开一个新的可能性领域。

    【讨论】:

    • 确实如此。使用 Docker 与 Erlang 运行时是多余的,使事情变得复杂而无益,混淆了与您部署的运行时通信的过程,并且有一种非常烦人的巧妙破坏东西的方式。任何商店这样做的唯一原因是因为他们不知道如何部署 Docker 以外的任何方式其他。这实际上是对任何运营部门的一个非常可悲的控诉——但这是当今许多开发人员/开发运营团队所面临的情况。
    • TL/DR,不要在 docker 中使用 erlang 进行生产。但是,如果您只想简单地说明为什么要分发演示(或开发工具包),请务必使用 docker。
    【解决方案2】:

    也许这取决于您要使用的服务器。据我所知,例如,Docker 极大地促进了在 AWS Elastic Beanstalk 上部署 Phoenix 应用程序,但我目前还没有足够的能力给您提供非常具体的原因。

    也许有人可以详细说明。

    【讨论】:

      【解决方案3】:

      Docker 主要是一个部署和分发工具。来自 Docker 文档:

      Docker 允许开发人员使用提供应用程序和服务的本地容器在标准化环境中工作,从而简化了开发生命周期。容器非常适合持续集成和持续开发 (CI/CD) 工作流。

      如果您的应用程序具有外部依赖项(例如,加密库)、与使用另一种语言编写的另一个应用程序交互(例如,作为单独进程运行的数据库),或者如果它依赖于某些操作系统/环境配置(你提到你必须做一些 DNS 配置),然后将你的应用程序打包到一个 docker 容器中可以帮助你避免重复安装依赖项和配置环境的工作。它可以帮助您避免在依赖关系方面保持测试和生产环境同步的额外工作,或者调查为什么应用程序可以在一个环境中的一台机器上运行,而不是在另一个环境中运行。

      以上内容并非特定于 Erlang 应用程序,尽管我同意 Erlang 有助于消除跨平台的一些问题并抽象出一些依赖项,并且 OTP 发布处理可以帮助您打包您的应用程序。

      由于您提到您是开发人员,因此值得一提的是,Docker 为管理员或运行基础架构的团队提供了比开发人员更多的优势。

      【讨论】:

        猜你喜欢
        • 2011-10-25
        • 2018-03-22
        • 2022-08-18
        • 2020-09-05
        • 2019-10-14
        • 2023-03-28
        • 2013-03-06
        • 1970-01-01
        • 2017-08-13
        相关资源
        最近更新 更多