【问题标题】:Docker application deploymentDocker 应用程序部署
【发布时间】:2015-11-29 15:43:48
【问题描述】:

我的 Web 应用程序由 3 个 docker 容器组成:app(带有代码的主容器)、redisnode。我有执行以下操作的部署 shell 脚本:

  1. 从 git (git clone <...> $REVISION) 克隆 master
  2. 从文档根目录中删除所有文件 (rm -rf $PROJECT_DIR)
  3. 将所有克隆到文档根目录 (mv $REVISION $PROJECT_DIR)
  4. 停止所有正在运行的容器:(docker-compose stop)
  5. 删除所有停止的容器 (docker-compose rm -f)
  6. 构建容器 (docker-compose build)
  7. 运行所有构建的容器 (docker-compose up -d)
  8. 通过docker exec 运行容器内的所有初始化和启动脚本(例如:配置编译器、nginx 重新加载)

这对我来说很好,但我对这个方案有几个疑问:

  1. 第 6 步中,如果我不将文件更改为节点容器,它将使用已构建的映像 - 速度很快。但是,如果我更改某些内容,容器将再次构建 - 它很慢并且会增加未使用的图像
  2. 在最坏的情况下(当我更改节点代码时)部署可能持续大约 2-3 分钟,在最好的情况下 - 大约 30 秒。但即便如此,对于某些用户来说,这也是一种停机时间。

我认为,我需要构建新容器的可用性(在旧容器的并行中继续工作),并且只有在成功状态后 - 更改使用的最新容器的 tag通过应用程序。我该怎么做?

将非常感谢您的 cmets。

【问题讨论】:

    标签: deployment docker web-deployment dockerfile docker-compose


    【解决方案1】:

    我所做的是按版本标记我的所有图像除了标记然后“最新”。所以我有一张带有多个标签的图片。只需将其标记为多个。当您按版本标记时,它可以让您毫无问题地在“最新”标记中移动:

    docker build -t=myApp .
    docker tag myApp:latest myApp:0.8.1
    

    现在,当您docker images 时,您会看到同一张图片列出了两次,只是标签不同(“最新”和“0.8.1”)。所以当你去构建你提到的东西时:

    # the original container is still running while this builds ...
    docker build -t=myApp .
    # now tag "latest" to the newest version
    docker tag myApp:latest myApp:0.8.2
    # and now you can just stop and restart the container ...
    docker rename myApp myApp-old
    docker run -d --name=myApp -p 80:80 myApp:latest
    

    这是您可以做的事情,但看起来您确实需要一种无需停机即可交换容器的方法。零停机时间容器更改。

    我已经使用了几年的一个过程,即为您的 Docker 容器使用 Nginx 反向代理。 Jason Wilder 详细介绍了in this blog post 这样做的过程。

    我将概述这将为您带来什么。 jwilder/nginx-proxy docker 镜像将作为容器的反向代理,默认情况下,它会根据主机名循环负载平衡到容器的入站连接。在您构建并运行具有相同 VIRTUAL_HOST 环境变量的容器后,nginx-proxy 会自动循环负载平衡这两个容器。这样,您可以启动新容器,它将开始为请求提供服务。然后你可以把你的另一个旧容器拿下来。零停机更新。

    只是一些细节:nginx-proxy 图像使用 Jason Wilder 的 docker-gen 实用程序自动获取 docker 容器信息,然后将请求路由到每个容器。这意味着您使用新的环境变量 (VIRTUAL_HOST) 启动普通容器,nginx-proxy 将自动开始将入站请求路由到容器。这最好用于在许多容器之间“共享”一个端口(例如 tcp/80)。此外,此反向代理意味着它可以处理 HTTPS 以及 HTTP 身份验证,因此您不必在 Web 容器中处理它。后端是未加密的 (HTTP),但由于它位于同一主机上,所以没问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      相关资源
      最近更新 更多