Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将Docker部署到生产环境中:零停机_Php_Deployment_Docker_Continuous Integration_Ansible - Fatal编程技术网

Php 将Docker部署到生产环境中:零停机

Php 将Docker部署到生产环境中:零停机,php,deployment,docker,continuous-integration,ansible,Php,Deployment,Docker,Continuous Integration,Ansible,我无法理解如何使用Docker实现零停机部署 假设我有一个运行MyWebApp的PHP容器,它由同一台服务器上的Nginx容器提供服务。然后我更改了一些代码,因为Docker容器是不可变的,所以我必须使用代码更改再次构建/部署MyWebApp容器。在执行此操作所需的时间内,MyWebApp已停止计数 以前我会使用Ansible或类似工具来部署我的代码,然后将新的发布目录符号链接到web目录。。。零停机时间 使用Docker和单服务器应用程序是否可以实现零停机部署?您可以使用nginxupstre

我无法理解如何使用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启动上一种颜色
docker停止最新的颜色


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

这与我的原始想法非常接近。虽然最后我使用了类似的东西,在运行docker的两台服务器之间安装了一个Nginx负载平衡器。这样,我还可以实现硬件故障切换和数据中心故障切换。非常感谢。