2

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

将 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

4

2 回答 2

2

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

于 2014-12-16T00:33:54.663 回答
1

推荐的方法称为“BlueGreen 部署”,并且可以通过图 1 编排的一台服务器进行部署。

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

sudo fig up -d

然后,当我想升级到新版本时,我更改了 Green 实例的版本号,然后杀死、删除并启动新的 Green 实例。

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

一旦 Green 恢复没有任何问题,我就重复这个过程blueapp

因为我有一个负载均衡器同时指向 Green 和 Blue 实例(蓝色被指定为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随之关闭(违背了我们零停机时间的目标)。

于 2015-02-10T12:47:02.837 回答