使用Docker部署到生产中:零停机时间

时间:2015-12-05 15:04:00

标签: php deployment docker continuous-integration ansible

我没有看到如何使用Docker实现零停机部署。

假设我有一个运行 MyWebApp 的PHP容器由同一台服务器上的 Nginx 容器提供服务。然后我更改了一些代码,因为Docker容器是不可变的我必须再次使用代码更改来构建/部署 MyWebApp 容器。在执行此操作的过程中, MyWebApp 已关闭计数...

以前我会使用Ansible或类似方法来部署我的代码,然后将新版本目录符号链接到web目录...零停机时间!

是否可以使用Docker和单个服务器应用程序实现零停机时间部署?

1 个答案:

答案 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_colordocker stop the_latest_color

由于您使用Ansible,您可以使用它来编排此过程,甚至可以添加冒烟测试,以便在出现问题时自动触发回滚。