我一直在学习如何使用Docker来设置开发环境,但是,我是 好奇这些想法如何转化为生产堆栈。举个例子,我有一个Laravel(Php)应用程序,它使用MySQL,Redis和Nginx
因此在生产中,假设我通常在AWS上的负载均衡器后面有2个应用程序ec2实例。使用Docker设置类似的生产情况时......
1)因为我正在使用RDS和Elasticache,所以不需要容器。所以基本上,id只需要PHP-Fpm和Nginx的容器?
2)要获得高可用性,我仍然会在ELB后面有2个(或至少1个以上)ec2实例。所以我想每个实例都会运行上面的容器(PHP和Nginx)。但这听起来与我以前的VM设置没什么不同,每个服务器都运行它为应用程序提供服务所需的内容。那是准确的吗?
3)对于VM,我传统上将代码烘焙到AMI中并将这些AMI添加到启动配置和Auto Scaling组,该组将根据需要启动实例。因此,对于部署,我会拆除旧的ec2实例并启动新的实例。使用Docker,由于这些容器将在ec2实例上运行,我是否仍然需要启动/拆除虚拟机,或者我只是更换容器并保持虚拟机运行?答案 0 :(得分:4)
在docker环境之外保留RDS,Elasticache和其他完全托管服务是合理的。是的,对于高可用性,您需要运行docker守护程序的多个EC2实例。
真正的优势不在于两个EC2实例在每个实例上运行两个Web服务器泊坞容器。当您将应用程序分解为微服务时,真正的优势就在于,多个容器组合在一起构建您的Web应用程序,提供benefits of microservices。
除了与使用自动扩展和负载平衡的EC2中的传统Web应用程序部署相比,DevOps流程会有所不同,并且有许多benefits。例如,您的源代码也将包含容器代码,这将保证环境在您的暂存和生产中统一运行。此外,您将在源代码管理中使用指向分支/标记的图像,这样可以获得新版本的新更新(增量下载)。
如果您要在AWS中设置docker,建议您使用AWS ECS来减少管理开销。
答案 1 :(得分:2)
你是对的,你只需要在一个容器中运行你的代码,它只需要访问远程服务。您唯一需要考虑的是确保与它们的连接。
您再次正确,您需要在Docker容器中拥有以前在VM中拥有的所有内容,以便您的代码像以前一样工作。无论如何,使用Docker容器,可以在同一个EC2实例上运行应用程序的多个实例。当然,您的应用程序将尝试在同一端口上运行,因此管理端口需要一些额外的网络层,但这是可能的。所有EC2实例都需要安装docker。
您不必创建AMI并关闭和启动EC2实例,而只需提取新的Docker镜像并使用新映像重新启动容器。这意味着与EC2实例流中的分钟相比只需几秒钟。这意味着您可以快速恢复错误的部署,并为可以达到0%停机时间的设置打开大门。