我正在使用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
答案 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
失效(打败我们的零停机目标)。