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

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

比方说,我有一个运行MyWebApp的PHP容器,由同一台服务器上的Nginx容器提供服务。 然后我改变一些代码,因为Docker容器是不可变的,所以我必须用代码更改再次构build/部署MyWebApp容器。 在这个过程中, MyWebAppclosures了。

以前我会使用Ansible或类似的部署我的代码,然后将新版本目录符号链接到networking目录…零停机!

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并手动(或通过pipe理套接字自动)pipe理后端。

如果事情出错了, docker start the_previous_colordocker stop the_latest_color

既然你使用Ansible,你可以使用它来编排这个过程,甚至可以为混合添加烟雾testing,所以如果出现问题,会自动触发回滚。