如何使用Docker和Fig更新生产中的rails应用程序,零停机时间?

时间:2014-12-15 23:39:47

标签: ruby-on-rails docker fig

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

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

sudo fig pull web
sudo fig up -d web

我想当Fig重新创建web容器时会发生停机。

这是我在制作中使用的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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

推荐的方法称为"BlueGreen Deployment",并且可以通过图中只编排一个服务器来推出。

我通过启动整个应用程序来完成此操作(包括Blue Green实例)。

sudo fig up -d

然后,当我想升级到新版本时,我更改了绿色实例版本号,然后删除,删除&提出新的绿色实例。

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

一旦Green回来没有任何问题,我就用blueapp重复这个过程。

因为我有一个负载均衡器指向绿色和蓝色实例(蓝色被指定为backup),一旦greenapp发生故障,blueapp立即开始承受负载。如果greenapp永远不会恢复,那么我可以回滚greenapp的版本并重试。我永远不必担心停电,因为我知道Blue指向以前正在运行的版本,并且正在接收所有网络流量。

示例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"

注意:greenapp& blueapp绑定到两个不同的端口,并且链接到balancer。如果它们与balancer相关联,那么当你试图将它们中的一个关闭时,事情就会变得毛茸茸,因为它必须使balancer失效(打败我们的零停机目标)。