Docker 滚动更新(Rolling Update)详解

阅读时长 3 分钟读完

1. 为什么需要滚动更新?

在一个生产环境中,更新一个 Docker 镜像是必不可少的。通常我们可以通过 docker-compose up 将我们应用的最新版本部署到我们的服务器上。

如果我们的服务器上有多个 Docker 实例在运行,当我们只是用 docker-compose up 更新镜像时,会出现所有实例全部启动,造成短时间内服务不可用的情况。这是一个严重的问题,特别是在高流量的应用场景中。

我们需要找到一种方法,可以逐个地更换 Docker 实例,而不会对用户造成不必要的干扰。这就是滚动更新(Rolling Update)所要解决的问题。

2. 滚动更新的实现方法

Docker 提供了一些非常有用的功能,可以轻松地实现滚动更新,例如 docker-composeDocker Swarm

2.1 Docker Compose

Docker Compose 可以自行管理容器,使其无需手动更改容器端口和 ID。通过更新 compose 文件中的镜像和环境变量,Docker Compose 可以轻松地更新所有容器。当我们使用 docker-compose up 命令时,Compose 会自动将新镜像拉取到本地,并逐个替换现有的容器。

示例代码:

在上面这个 docker-compose.yml 示例中,我们定义了一个名为 web 的服务,它将使用 NGINX 镜像,而且我们指定了需要使用三个实例。

当我们更新这个文件,例如将 NGINX 版本更新到 1.19.2,并使用 docker-compose up 命令重新启动系统时,Docker Compose 将会对每个容器进行逐个滚动更新。

2.2 Docker Swarm

Docker Swarm 是一个集群管理工具,用于在多个 Docker 节点上调度和管理容器。在 Swarm 中,我们可以使用 rolling-update 命令来更新服务。它会逐个更改每个任务(task),也就是 Swarm 中的最小容器单元。

示例代码:

-- -------------------- ---- -------
-------- ---

---------
  ----
    ------ ------------
    -------
      --------- -
      --------------
        ------------ -
        ------ ---

在上面这个 docker-compose.yml 示例中,我们定义了一个名为 web 的服务,它将使用 NGINX 镜像,而且我们指定了需要使用五个实例。

在这里,我们在 deploy 部分添加了 update_config 选项,它定义了一些更新策略。例如,我们可以指定 parallelism: 2,它可以将两个容器并行更新。我们还指定了 delay: 10s,它表示每个容器更新后等待十秒再进行下一个更新。

当我们使用 docker service update --image nginx:1.19.2 --update-parallelism 2 --update-delay 10s web 命令更新服务时,Docker Swarm 将会对 Swarm 中的每个任务按照我们所定义的策略进行滚动更新。

3. 总结

在本文中,我们介绍了滚动更新的必要性,以及实现滚动更新的两种方法:Docker Compose 和 Docker Swarm。我们希望本文可以帮助读者更好地理解滚动更新的概念,并提供了实现滚动更新所需的示例代码。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6492e68948841e98940b1b5d

纠错
反馈