当我控制我的开发、暂存和生产环境时,为什么要使用 Docker?
Why should I use Docker when I control my dev, staging and prod environment?
我知道一个完整的事实,即在开发工作站上拥有准确的生产环境会更好:它会擦除 "it works on my computer"。
Docker 对我来说就像 Bruce Lee on steroids fighting Abdul Jabbar:如果您需要使用 VM,请改用 Docker。
如果在开发过程中,我使用 nuget 来控制我的依赖项,在我的构建服务器上,它会在部署之前恢复包:那么我就有了应用程序需要的 运行。
此外,它是我在同一个盒子上一遍又一遍地部署的同一个应用程序。当我必须知道出了什么问题时为什么需要重启策略?如果应用程序死机,其他盒子将承担负载,我需要 investigate/fix 而不是养成 "no big deal, the container will restart in a minute" 的习惯。
在云环境中,我明白了这一点:AWS、Azure 是那些可以从这些功能中受益最多的人。就像在客户要求更多功能时能够将 Web 应用程序从一个服务器快速移动到另一个服务器一样。此外,如果这些网络应用程序不同,那么我需要将它们彼此隔离:Docker!
的绝佳用例
但是,在前提/主机托管中,如果我有一个 powershell 脚本来为我准备一个准备好 IIS 的裸机服务器:我为什么要引入另一个抽象层?
我想到的前两个答案(还有很多,但我觉得这几个最重要):
资源利用率 - 如果您是裸机,您的规模单位可能是整个 VM。当您 运行 一个应用程序或服务的多个实例时,您只能通过 运行 安装更多 VM 来实现。在我的世界中,典型的例子是 IIS 网站,我只能在其中每台机器获得一个实例。如果我 运行 三个实例,我有三个严重未充分利用的虚拟机。 Docker 允许您在单个 VM 中复制应用程序。在水平扩展之前,您可以在单个 VM 上用完更多资源。
特定于应用程序的依赖项 - 您管理 VM 映像和 OS 依赖项,但在某些情况下您可能希望针对您的应用程序进行更具体的调整。例如,IIS 的版本。无需 运行 全球所有应用程序的一个依赖版本,您可以构建特定于应用程序的容器映像,这使您的 运行 时间更可预测。
部署独立性 - 如果您依赖于全局依赖项,那么您将自己锁定在一次更新所有应用程序中,而不是能够独立部署每个应用程序。您的部署规模更大、风险更高。容器将允许您按照自己的节奏更新每个容器并以更增量的方式交付价值。
我知道一个完整的事实,即在开发工作站上拥有准确的生产环境会更好:它会擦除 "it works on my computer"。
Docker 对我来说就像 Bruce Lee on steroids fighting Abdul Jabbar:如果您需要使用 VM,请改用 Docker。
如果在开发过程中,我使用 nuget 来控制我的依赖项,在我的构建服务器上,它会在部署之前恢复包:那么我就有了应用程序需要的 运行。
此外,它是我在同一个盒子上一遍又一遍地部署的同一个应用程序。当我必须知道出了什么问题时为什么需要重启策略?如果应用程序死机,其他盒子将承担负载,我需要 investigate/fix 而不是养成 "no big deal, the container will restart in a minute" 的习惯。
在云环境中,我明白了这一点:AWS、Azure 是那些可以从这些功能中受益最多的人。就像在客户要求更多功能时能够将 Web 应用程序从一个服务器快速移动到另一个服务器一样。此外,如果这些网络应用程序不同,那么我需要将它们彼此隔离:Docker!
的绝佳用例但是,在前提/主机托管中,如果我有一个 powershell 脚本来为我准备一个准备好 IIS 的裸机服务器:我为什么要引入另一个抽象层?
我想到的前两个答案(还有很多,但我觉得这几个最重要):
资源利用率 - 如果您是裸机,您的规模单位可能是整个 VM。当您 运行 一个应用程序或服务的多个实例时,您只能通过 运行 安装更多 VM 来实现。在我的世界中,典型的例子是 IIS 网站,我只能在其中每台机器获得一个实例。如果我 运行 三个实例,我有三个严重未充分利用的虚拟机。 Docker 允许您在单个 VM 中复制应用程序。在水平扩展之前,您可以在单个 VM 上用完更多资源。
特定于应用程序的依赖项 - 您管理 VM 映像和 OS 依赖项,但在某些情况下您可能希望针对您的应用程序进行更具体的调整。例如,IIS 的版本。无需 运行 全球所有应用程序的一个依赖版本,您可以构建特定于应用程序的容器映像,这使您的 运行 时间更可预测。
部署独立性 - 如果您依赖于全局依赖项,那么您将自己锁定在一次更新所有应用程序中,而不是能够独立部署每个应用程序。您的部署规模更大、风险更高。容器将允许您按照自己的节奏更新每个容器并以更增量的方式交付价值。