我没有看到如何使用Docker实现零停机部署。
假设我有一个运行 MyWebApp 的PHP容器由同一台服务器上的 Nginx 容器提供服务。然后我更改了一些代码,因为Docker容器是不可变的我必须再次使用代码更改来构建/部署 MyWebApp 容器。在执行此操作的过程中, MyWebApp 已关闭计数...
以前我会使用Ansible或类似方法来部署我的代码,然后将新版本目录符号链接到web目录...零停机时间!
是否可以使用Docker和单个服务器应用程序实现零停机时间部署?
答案 0 :(得分:7)
您可以使用nginx upstreams
来对容器进行某种blue-green deployment:
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
要部署绿色,请更改颜色名称和端口映射。
您可能希望摆弄upstream server entry parameters以更快地切换,或者在堆栈中使用haproxy
并手动(或通过管理套接字自动管理)后端。
如果出现问题,请docker start the_previous_color
和docker stop the_latest_color
。
由于您使用Ansible,您可以使用它来编排此过程,甚至可以添加冒烟测试,以便在出现问题时自动触发回滚。