«

如何优雅地升级 Docker 容器:从新手到进阶的详细教程

Eric 发布于 阅读:42


Docker 容器的出现,极大地简化了应用的部署和管理。但应用更新是常态,我们不可能永远使用旧版本的容器。那么,当你的应用有了新功能,或者修复了某个关键漏洞时,该如何安全、平稳地升级你的 Docker 容器呢?

本文将带你从最基础的单容器升级方法开始,逐步深入到使用 Docker Compose 管理复杂的多容器应用升级。无论你是 Docker 初学者还是经验丰富的开发者,都能在这里找到适合你的升级之道。

一、升级前,你需要知道的几个关键概念

在开始动手之前,我们先来回顾几个核心概念,它们是理解所有升级操作的基础。

1. 容器与镜像:父子关系

想象一下,镜像(Image) 就像是一张应用的蓝图,它包含了运行应用所需的所有文件和依赖项。而容器(Container) 则是基于这张蓝图创建的、正在运行的实体。

升级容器的本质,并不是在运行中的容器里修改代码,而是使用一张新版本的镜像蓝图,来创建一个全新的容器。

2. 告别 latest 标签

如果你习惯使用 docker pull my-app:latest,那么升级时你可能会遇到不确定性。因为 latest 标签总是指向最新的版本,你无法控制具体拉取到哪个版本。

最佳实践是为你的镜像打上明确的版本标签,例如 my-app:1.0my-app:2023.10.26。这不仅能让你清楚地知道正在运行哪个版本,也能在出现问题时轻松回滚。

3. 数据卷(Volumes):升级的生命线

容器是临时的、无状态的。如果你的应用需要持久化数据(比如数据库文件、用户上传的图片、配置文件等),那么数据卷就是你唯一的救星。

数据卷的作用是将容器内部的特定路径,映射到宿主机上的一个目录。当旧容器被删除时,宿主机上的数据卷目录并不会受影响,新容器启动后只需要重新挂载这个数据卷,就能无缝地接管所有数据和配置。这是实现容器平滑升级的关键。

二、简单易行的手动升级方法

方法一:停止、删除、拉取、运行(单容器升级)

这是最基础,也是最直观的升级方式。它适用于单个容器应用,但需要短暂的停机时间。

操作步骤详解:

  1. 找到并停止旧容器

    首先,你需要找到正在运行的容器的名称或 ID。使用 docker ps 命令可以列出所有正在运行的容器。

    # 1. 查看正在运行的容器,找到名称或 ID
    docker ps
    
    # 2. 停止指定名称的容器
    # 示例:docker stop my-web-app
    docker stop [容器名或ID]
  2. 删除旧容器

    容器停止后,你可以使用 docker rm 命令将其删除。这可以释放资源,并为新容器腾出端口和容器名。

    # 删除指定名称的容器
    # 示例:docker rm my-web-app
    docker rm [容器名或ID]

    注意:删除容器并不会删除其关联的数据卷,因此数据是安全的。

  3. 拉取新镜像

    现在,从你的仓库拉取新版本的镜像。请确保使用最新的版本标签。

    # 拉取最新版本的镜像
    # 示例:docker pull my-web-app:v2.0
    docker pull [镜像名:新标签]
  4. 运行新容器

    最后,使用新镜像启动一个新容器。最重要的一步是,你需要完全复用旧容器的启动参数,特别是数据卷挂载(-v)和端口映射(-p),这样才能确保数据和配置得到保留。

    # 重新运行容器,并使用新镜像
    # --name my-web-app:给新容器指定和旧容器一样的名字
    # -p 8080:80:将宿主机的 8080 端口映射到容器的 80 端口
    # -v /data/my-web-app:/app/data:将宿主机的数据卷挂载到容器内,保留数据
    # -d:后台运行容器
    # 示例:docker run --name my-web-app -p 8080:80 -v /data/my-web-app:/app/data -d my-web-app:v2.0
    docker run --name [新容器名] -p [宿主机端口]:[容器端口] -v [宿主机路径]:[容器路径] -d [镜像名:新标签]

方法二:使用 Docker Compose(多容器应用升级)

当你的应用由多个服务(例如,一个 Web 服务和一个数据库)组成时,使用 Docker Compose 是最优雅的选择。它能通过一个配置文件管理所有服务的升级。

操作步骤详解:

  1. 修改 docker-compose.yml 文件

    打开你的 docker-compose.yml 文件,将需要升级的服务下的 image 字段的标签更新为新版本。

    更新前示例:

    # docker-compose.yml (v1.0)
    services:
      web:
        image: my-web-app:v1.0
        ports:
          - "8080:80"
        volumes:
          - ./data:/app/data
      database:
        image: postgres:14
        volumes:
          - db_data:/var/lib/postgresql/data
    volumes:
      db_data:

    更新后示例:

    # docker-compose.yml (v2.0)
    services:
      web:
        # 镜像标签已更新到 v2.0
        image: my-web-app:v2.0
        ports:
          - "8080:80"
        volumes:
          - ./data:/app/data
      database:
        image: postgres:14
        volumes:
          - db_data:/var/lib/postgresql/data
    volumes:
      db_data:
  2. 拉取新镜像

    在 docker-compose.yml 所在的目录下,使用 docker-compose pull 命令拉取新镜像。

    # 拉取配置文件中所有服务所需的新镜像
    docker-compose pull

    此命令只会下载新镜像,不会影响正在运行的服务。

  3. 启动并更新服务

    最后,使用 up 命令,Docker Compose 会自动检测到镜像标签的改变,停止旧容器,使用新镜像创建新容器,并重新连接所有已有的网络和数据卷。

    # 启动并更新服务,-d 表示在后台运行
    docker-compose up -d
    ```up` 命令会自动保留旧容器挂载的卷,确保数据不丢失。
    

三、升级的最佳实践与注意事项

无论你选择哪种升级方法,都请牢记以下几点,以确保升级过程万无一失:

  1. 始终备份你的数据:在进行任何升级操作之前,务必备份重要的数据卷。这是最重要的一道防线。

  2. 制定回滚计划:如果升级失败,你需要能够快速回退到之前的稳定版本。

  3. 利用健康检查:在生产环境中,为容器配置健康检查(HEALTHCHECK),确保新容器完全就绪后才接入流量。

  4. 日志和监控:在升级过程中,密切关注容器日志和应用监控,及时发现和解决问题。

  5. 测试环境先行:在将新镜像部署到生产环境之前,务必在开发或预发布环境中进行充分测试。

总结

Docker 容器的升级并非难事,关键在于理解其背后的原理,并遵循一套清晰的流程。对于个人开发者或小型项目,手动升级和 Docker Compose 已经足够强大。希望这篇教程能够为你提供一份可靠的指南,让你的容器升级之路更加顺畅。

文章目录


    ×

    如果觉得文章对您有用,请随意打赏。
    您的支持是我们继续创作的动力!

    微信打赏

    微信扫一扫

    支付宝打赏

    支付宝扫一扫