Deployment Docker应用程序部署

Deployment Docker应用程序部署,deployment,docker,web-deployment,dockerfile,docker-compose,Deployment,Docker,Web Deployment,Dockerfile,Docker Compose,我的web应用程序由3个docker容器组成:app(带代码的主容器)、redis和节点。我有一个部署shell脚本,它执行以下操作: 从git克隆主机(git clone$REVISION) 从文档根目录中删除所有文件(rm-rf$PROJECT\u DIR) 将克隆的所有内容移动到文档根目录(mv$REVISION$PROJECT\u DIR) 停止所有正在运行的容器:(docker compose stop) 移除所有停止的容器(docker compose rm-f) 构建容器(dock

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

  • 从git克隆主机(
    git clone$REVISION
  • 从文档根目录中删除所有文件(
    rm-rf$PROJECT\u DIR
  • 将克隆的所有内容移动到文档根目录(
    mv$REVISION$PROJECT\u DIR
  • 停止所有正在运行的容器:(
    docker compose stop
  • 移除所有停止的容器(
    docker compose rm-f
  • 构建容器(
    docker编写构建
  • 运行所有构建的容器(
    docker compose up-d
  • 通过
    docker exec
    (例如:配置编译器、nginx重载)在容器内运行所有init和start脚本
  • 这对我来说很好,但我对这个计划有几个疑问:

  • 步骤6中,如果我不将文件更改为节点容器,它将使用已构建的映像—速度很快。但是,如果我更改了某些内容,容器将再次构建—速度很慢,并且会增加未使用的图像
  • 在最坏的情况下(当我更改节点代码时),部署可能持续2-3分钟,在最好的情况下,大约30秒。但即便如此,对于一些用户来说,这也是一个停机时间
  • 正如我所想,我需要可用性来构建新容器(在parralel of old container中继续工作),并且只有在状态成功后-更改应用程序使用的最新容器的标记。我该怎么做


    非常感谢您的评论。

    我所做的是按版本标记所有图像,然后再标记“最新”。所以我有一个图像和多个标签。只需在上面加上多个标签。当您按版本标记时,它允许您在“最新”标记周围移动,而不会出现问题:

    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详细说明了这样做的过程

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

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