温馨提示×

Docker容器在Ubuntu上如何更新

小樊
52
2025-11-24 18:48:33
栏目: 智能运维

在 Ubuntu 上更新 Docker 容器的正确做法

一 核心原则

  • 容器不可就地升级:容器的文件系统是可写的临时层,直接“升级”容器内容不会持久,且下次重启会丢失。正确做法是更新镜像,再基于新镜像重建并启动新容器。
  • 区分两类更新
    1. 更新容器内运行的Ubuntu 软件包(如 apt 升级);
    2. 更新容器镜像标签/版本(如从 ubuntu:22.04 升到 ubuntu:24.04,或应用镜像从 v1 升到 v2)。前者只影响当前运行实例,后者需要重建容器。

二 更新容器内 Ubuntu 软件包

  • 进入容器执行升级,然后重启以让关键组件生效:
    docker exec -it <容器名或ID> bash
    apt-get update && apt-get upgrade -y
    # 如有内核/系统层面更新,建议重启
    exit
    docker restart <容器名或ID>
    
  • 验证版本与更新结果:
    docker exec -it <容器名或ID> cat /etc/os-release
    
  • 说明:该方法只作用于当前容器实例,适合临时修复与安全补丁;若容器重建(重启策略或手动重建),这些变更会丢失,需纳入镜像构建流程以保证一致性。

三 更新容器镜像版本

  • 拉取新镜像(示例为更新基础镜像或应用镜像):
    docker pull ubuntu:24.04
    # 或更新自有应用镜像
    docker pull yourorg/myapp:2.0
    
  • 基于新镜像重建并启动容器(示例保留原端口与重启策略):
    docker stop <容器名或ID>
    docker rm <容器名或ID>
    docker run -d \
      --name <容器名> \
      -p 80:80 \
      --restart unless-stopped \
      ubuntu:24.04
    
  • 要点:镜像更新不会自动替换正在运行的容器;必须停止旧容器并用新镜像重新创建。若使用数据卷或绑定挂载,数据不会随镜像更换而丢失。

四 使用 Docker Compose 更新

  • 修改 compose 文件中的镜像标签(如从 v1 改为 v2),然后重新部署:
    # 编辑 docker-compose.yml
    # image: yourorg/myapp:v1  ->  image: yourorg/myapp:v2
    
    # 重新创建并启动(--force-recreate 强制替换容器)
    docker compose up -d --force-recreate
    
  • 说明:Compose 会对比配置与运行实例,必要时重建容器;挂载卷与网络配置保持不变,数据不受影响。

五 自动更新与最佳实践

  • 自动更新工具 Watchtower(适合非关键或易回滚场景):
    • 监控并更新所有容器(默认每24 小时检查一次):
      docker run -d \
        --name watchtower \
        -v /var/run/docker.sock:/var/run/docker.sock \
        containrrr/watchtower
      
    • 仅监控指定容器并设置检查间隔为1 小时
      docker run -d \
        --name watchtower \
        -v /var/run/docker.sock:/var/run/docker.sock \
        containrrr/watchtower \
        nginx mysql redis \
        --interval 3600
      
    • 高级能力:支持定时更新、手动确认、清理旧镜像、Email/Slack 通知、通过容器标签控制是否更新等。
  • 生产最佳实践:
    • 使用不可变标签(如 v1、v2)或镜像摘要进行部署,避免“latest”漂移;每次变更走镜像构建与发布流程。
    • 将变更纳入CI/CD,在测试环境验证后再上线;必要时灰度/金丝雀发布,保留快速回滚路径。
    • 对关键业务优先采用“重建+健康检查+回滚预案”,必要时结合编排系统实现滚动更新。

0