【问题标题】:Deploying with Docker into production: Zero downtime使用 Docker 部署到生产环境:零停机时间
【发布时间】:2016-03-10 11:38:44
【问题描述】:

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

假设我有一个运行 MyWebApp 的 PHP 容器,由同一服务器上的 Nginx 容器提供服务。然后我更改了一些代码,因为 Docker 容器是不可变的,所以我必须通过代码更改再次构建/部署 MyWebApp 容器。在执行此操作所需的时间期间,MyWebApp 数不胜数...

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

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

【问题讨论】:

    标签: php deployment docker continuous-integration ansible


    【解决方案1】:

    你可以用你的容器做某种blue-green deployment,使用nginx upstreams's:

    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,您可以使用它来编排此过程,甚至可以添加冒烟测试,以便在出现问题时自动触发回滚。

    【讨论】:

    • 太棒了,这与我最初的想法很接近。虽然最后我使用了类似的东西,在两个运行 docker 的服务器之间安装了一个 Nginx 负载均衡器。这样我也可以获得硬件故障转移和数据中心故障转移。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2021-01-01
    • 2012-03-28
    • 2012-08-03
    • 1970-01-01
    • 2019-09-27
    相关资源
    最近更新 更多