如何使用Docker和Fig更新导轨应用程序,零宕机时间?

我正在使用Docker和Fig for我的Rails / Postgres应用程序。

推动更新到Rails应用程序到生产的最佳方式是什么? 目前,我在生产中运行以下脚本,但会导致大约10秒的停机时间:

sudo fig pull web sudo fig up -d web 

我想在graphics重新创buildweb容器时会发生停机。

这是我在生产中使用的fig.xml文件。

 db: image: postgres:9.3 volumes_from: - db-data ports: - 5432 web: image: myaccount/my_private_repo command: bundle exec unicorn -p 3000 -c ./config/unicorn.rb volumes_from: - gems-2.1 ports: - "80:3000" links: - db 

该应用程序的演示在这里: https : //github.com/evgenyneu/docker-rails-fig-sample

解决这个问题的常用方法是在负载平衡器后面的多个服务器上运行应用程序。 在一次停止一个服务器的情况下进行滚动升级,拉出新版本,运行新版本以保持正常运行。

推荐的方法被称为“BlueGreen部署” ,并可能推出只有一个服务器由图。

我通过把我的整个应用程序(包括一个蓝色绿色的实例)来做到这一点。

 sudo fig up -d 

然后,当我想升级到新版本时,我更改了Green实例版本号,然后杀掉,移除并调出新的Green实例。

 sudo fig kill greenapp && sudo fig rm --force && sudo fig -d --no-recreate 

一旦绿色回来没有任何问题,然后我用blueapp重复这个blueapp

因为我有一个指向绿色和蓝色实例的负载均衡器(蓝色被指定为backup ),一旦greenapp下降, blueapp立即开始承载负载。 如果greenapp永不回来,那么我可以回滚greenapp的版本,然后再试一次。 我从来不用担心中断,因为我知道Blue是指向以前的工作版本,并且正在接收所有的networkingstream量。

示例fig.yml

 balancer: build: nginx/load-balancer ports: - "80:80" net: host greenapp: image: webapp:1.0.2 ports: - "3001:3000" blueapp: image: webapp:1.0.2 ports: - "3002:3000" 

注意: greenappblueapp绑定到两个不同的端口,并没有链接到balancer 。 如果它们与balancer相关联,那么当你试图balancer其中一个时,事情就会变得毛骨悚然,因为它需要把balancer降下来(打败我们的零停机时间的目标)。