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

Deploying with Docker into production: Zero downtime

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

假设我有一个 PHP 容器 运行 MyWebAppNginx 容器提供服务同一台服务器。然后我更改了一些代码,因为 Docker 容器是不可变的我必须再次 build/deploy MyWebApp 容器并更改代码。在执行此操作的过程中,MyWebApp 已停机...

以前我会使用 Ansible 或类似工具来部署我的代码,然后将新发布目录符号链接到 Web 目录...零停机时间!

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

您可以使用 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

要部署绿色,请更改颜色名称和端口映射。

您可能想要 fiddle 和 upstream server entry parameters 来加快切换速度,或者在您的堆栈中使用 haproxy 并手动(或通过管理套接字自动)管理后端。

如果出现问题,只需 docker start the_previous_colordocker stop the_latest_color

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