使用 Docker 部署到生产环境:零停机时间
Deploying with Docker into production: Zero downtime
我没看到如何使用 Docker 实现零停机部署。
假设我有一个 PHP 容器 运行 MyWebApp 由 Nginx 容器提供服务同一台服务器。然后我更改了一些代码,因为 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_color
和 docker stop the_latest_color
。
由于您使用 Ansible,您可以使用它来编排此过程,甚至可以将冒烟测试添加到组合中,以便在出现问题时自动触发回滚。
我没看到如何使用 Docker 实现零停机部署。
假设我有一个 PHP 容器 运行 MyWebApp 由 Nginx 容器提供服务同一台服务器。然后我更改了一些代码,因为 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_color
和 docker stop the_latest_color
。
由于您使用 Ansible,您可以使用它来编排此过程,甚至可以将冒烟测试添加到组合中,以便在出现问题时自动触发回滚。