更新 Dockerized Web 应用程序时如何自动升级 Docker 容器

想象一下这个场景。 您托管一些在 Docker 容器中运行的 Web 服务。 当 Web 服务有新版本发布时,您获取 Docker 映像并更新容器以更新服务。

我之前已经讨论过在不停机的情况下更新 Docker 容器,但本文不是关于升级 Web 应用程序。 这是关于更新操作系统容器本身的。

手动升级在容器中运行的操作系统有时可能是一项艰巨的任务。 您必须自己在正在运行的容器上单独运行相关的升级命令才能做到这一点。

如何消除这个额外的步骤并将操作系统的更新与服务的更新结合起来呢?

这是我在更新使用 Docker Compose 部署的 Web 服务时使用的自动化技巧。

我们将使用 幽灵CMS 作为现实世界 example 基于此部署。

在更新 Web 服务时自动升级 OS 容器

你可以阅读这篇文章来了解我在做什么。 但是,如果您想跟随它,您也可以这样做。

我将展示两个不同的例子:

  1. 对于基于 Debian 的 Docker 容器
  2. 基于 Alpine 的 Docker 容器

自动升级 Debian 容器

该过程需要您处理两个步骤:

第 1 步:注意 CMD 指令

记下最终在 WebApp Dockerfile 中指定的 CMD 指令。

为此,您需要检查构建映像所使用的 Dockerfile(此为 Ghost example):

因此,这里的实际命令是 node current/index.js.

第 2 步:添加“自动升级”设置

在 Docker Compose 文件的 Ghost 服务部分添加升级命令和注明的 CMD 指令:

command: sh -c "apt update && apt -y upgrade && node current/index.js"

让我们看看最终会是什么样子。 说,对于 example,请考虑上述指南中 Ghost 服务的 Docker Compose 条目。 基于我们的教程的更新版本将是:

    ghost:
      image: ghost:4.20.4
      volumes:
        - ghost:/var/lib/ghost/content
        - ./config.json:/var/lib/ghost/config.production.json
      command: sh -c "apt update && apt -y upgrade && node current/index.js"
      env_file:
        - ./ghost-mariadb.env
      restart: on-failure
      depends_on: 
        - ghostdb
      networks:
        - net
        - ghost

在这里,我在 volumes 部分。

自动升级 Alpine 容器

此过程再次需要您处理两个类似的步骤:

第 1 步:注意 CMD 指令

记下最终在 WebApp Dockerfile 中指定的 CMD 指令。

为此,您需要检查 Dockerfile (Ghost Alpine 为此 example):

很明显,这里的命令与之前的 Debian 版本相同: node current/index.js.

第 2 步:添加“自动升级”设置

在 Docker Compose 文件的 Ghost 服务部分添加升级命令和注明的 CMD 指令:

command: sh -c "apk update && apk add --upgrade apk-tools && apk upgrade --available && node current/index.js"

高山升级参考。

让我们看看最终的样子(注意这次我将使用 alpine 图像来制作 Ghost)。 说,对于 example,请考虑上述指南中 Ghost 服务的 Docker Compose 条目。 基于我们的教程的更新版本将是:

    ghost:
      image: ghost:4.20.4-alpine
      volumes:
        - ghost:/var/lib/ghost/content
        - ./config.json:/var/lib/ghost/config.production.json
      command: sh -c "apk update && apk add --upgrade apk-tools && apk upgrade --available && node current/index.js"
      env_file:
        - ./ghost-mariadb.env
      restart: on-failure
      depends_on: 
        - ghostdb
      networks:
        - net
        - ghost

那就这样吧。 从此时起,每当您在不停机的情况下更新您的 Web 应用程序时,容器升级命令将自动被调用,然后您的 Web 应用程序将被执行。

注意:通过更改 docker compose 文件中图像的版本号来更新任何应用程序时,您必须暂时禁用此处讨论的带有井号标签的命令选项。 为 Web 应用程序完成更新后,重新启用同一行以更新容器本身。 这两个步骤(更新应用程序和容器)都可以通过扩展实现,无需任何停机时间。

奖金提示

这是其他流行应用程序的命令列表,例如 下一云火箭聊天. 请记住,这些将像您看到的 Ghost 一样添加 example.

下一云

对于 Debian:

command: sh -c "apt update && apt -y upgrade && apache2-foreground"

对于高山:

command: sh -c "apk update && apk add --upgrade apk-tools && apk upgrade --available && apache2-foreground"

火箭聊天

command: sh -c "apt update && apt -y upgrade && node main.js"

希望本文对您的日常系统管理员活动有所帮助。 如果您有任何疑问、反馈或建议,请在下面的评论部分留下您的想法。