我没有看到如何使用Docker实现零停机部署.
假设我有一个运行MyWebApp的PHP容器由同一服务器上的Nginx容器提供服务.然后我更改了一些代码,因为Docker容器是不可变的我必须再次使用代码更改来构建/部署MyWebApp容器.在执行此操作期间,MyWebApp已关闭计数...
以前我会使用Ansible或类似的方法来部署我的代码,然后将新的发布目录符号链接到web目录......零停机时间!
使用Docker和单个服务器应用程序可以实现零停机部署吗?
您可以使用nginx 的容器对容器进行某种蓝绿色部署upstreams
:
upstream containers { server 127.0.0.1:9990; # blue server 127.0.0.1:9991; # green } location ~ \.php$ { fastcgi_pass containers; ... }
然后,在部署容器时,您必须在端口映射之间切换:
# assuming php-fpm runs on port 9000 inside the container # current state: green container running, need to deploy blue # get last app version docker pull my_app # remove previous container (was already stopped) docker rm blue # start new container docker run -p 9990:9000 --name blue my_app # at this point both containers are running and serve traffic docker stop green # nginx will detect failure on green and stop trying to send traffic to it
要部署绿色,请更改颜色名称和端口映射.
您可能想要调整上游服务器条目参数以使切换更快,或者haproxy
在堆栈中使用并手动(或通过管理套接字自动管理)后端.
如果出现问题,请docker start the_previous_color
和docker stop the_latest_color
.
由于您使用Ansible,您可以使用它来编排此过程,甚至可以添加冒烟测试,以便在出现问题时自动触发回滚.