Ubuntu20下Docker版本升级全攻略:从备份到验证

张开发
2026/4/10 4:37:23 15 分钟阅读

分享文章

Ubuntu20下Docker版本升级全攻略:从备份到验证
1. 为什么需要升级Docker版本每次看到Docker发布新版本时我都会纠结要不要立即升级。经过多次实践后发现及时升级确实能带来不少好处。新版本通常会修复已知漏洞提升安全性。比如去年爆出的某个容器逃逸漏洞就是在后续版本中修复的。性能优化也是重要因素我实测过从19.03升级到20.10后容器启动速度提升了约15%。但升级前必须做好充分准备。有次我在生产环境直接升级导致某个依赖特定Docker版本的编排工具崩溃不得不连夜回滚。现在我的原则是开发环境可以大胆尝试生产环境必须先在测试环境验证。建议准备一个与生产环境配置相同的测试环境用同样的镜像和编排文件进行升级验证。2. 完整备份方案不只是/var/lib/docker2.1 基础备份操作新手最容易忽略的就是备份直到吃过亏才明白重要性。除了官方建议的/var/lib/docker目录这些内容也需要备份# 备份Docker配置 sudo cp -r /etc/docker /path/to/backup # 备份服务配置 sudo systemctl list-unit-files | grep docker | awk {print $1} | xargs -I {} sh -c sudo systemctl show --no-page {} /path/to/backup/{}.service.conf我习惯用这个组合命令创建带时间戳的压缩包sudo tar -zcvf docker-full-$(date %Y%m%d).tar.gz /var/lib/docker /etc/docker2.2 容器状态备份技巧正在运行的容器状态也需要保存。这个命令能导出所有容器的创建命令docker ps -a --format {{.Names}} | xargs -I {} sh -c docker inspect --format{{.Config.Cmd}} {} /path/to/backup/{}-config.txt对于关键数据卷建议额外备份docker volume ls -q | xargs -I {} sh -c docker run --rm -v {}:/volume -v /backup:/backup alpine tar cvf /backup/{}.tar /volume3. 升级前的环境检查清单3.1 系统依赖验证升级前务必检查这些依赖项# 检查内核版本 uname -r # 检查cgroups支持 grep cgroup /proc/filesystems # 检查存储驱动 docker info | grep Storage Driver我整理了这个检查表格检查项合格标准修复方法内核版本≥5.4apt install linux-generic-hwe-20.04内存≥2GB调整swap分区存储空间/var/lib/docker剩余≥10GB清理无用镜像(docker system prune)3.2 容器健康检查用这个脚本批量检查容器健康状态#!/bin/bash for container in $(docker ps -q); do name$(docker inspect --format{{.Name}} $container) health$(docker inspect --format{{.State.Health.Status}} $container 2/dev/null || echo no health check) echo $name: $health done4. 分步升级操作指南4.1 添加官方仓库的正确姿势很多教程漏掉了密钥验证这步可能引发安全问题。完整流程应该是# 删除旧密钥 sudo rm -f /etc/apt/keyrings/docker.gpg # 添加新密钥并验证指纹 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \ sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg # 验证指纹是否匹配官方 gpg --show-keys /etc/apt/keyrings/docker.gpg | grep -A1 Docker4.2 精确控制版本升级查看可用版本apt-cache madison docker-ce | awk {print $3}我推荐使用版本锁定方式升级# 查看当前版本 docker --version # 安装指定版本 sudo apt-get install -y --allow-downgrades \ docker-ceVERSION \ docker-ce-cliVERSION \ containerd.io5. 升级后的全面验证5.1 基础功能测试创建测试容器验证基础功能docker run --rm hello-world docker run --rm -it alpine sh -c echo 网络测试成功5.2 性能基准测试用这个命令对比升级前后的性能差异# 容器启动时间测试 time docker run --rm ubuntu true # 磁盘IO测试 docker run --rm -it --privileged ubuntu \ sh -c dd if/dev/zero of/test bs1M count1024 sync5.3 网络功能验证复杂网络场景测试方案# 创建测试网络 docker network create test-net # 运行服务容器 docker run -d --name web --network test-net nginx # 运行客户端测试 docker run --rm --network test-net curlimages/curl \ -s http://web | grep Welcome to nginx6. 疑难问题解决方案6.1 常见报错处理遇到device or resource busy错误时试试这个强制清理sudo systemctl stop docker sudo rm -rf /var/lib/docker/network/files sudo systemctl start docker6.2 版本回滚技巧回滚到旧版本时需要特别注意# 查看已安装版本 apt list --installed | grep docker-ce # 精确回滚到旧版本 sudo apt-get install -y --allow-downgrades \ docker-ceOLD_VERSION \ docker-ce-cliOLD_VERSION7. 生产环境升级最佳实践对于关键业务系统我总结出这套升级流程先在CI环境测试所有编排文件在预发布环境验证数据服务生产环境采用滚动升级策略准备完善的回滚方案记录这个升级日志表很有帮助时间操作内容版本变化影响评估操作人2023-08-01测试环境升级20.10 → 23.0无异常张三2023-08-05预发布环境升级20.10 → 23.0MySQL连接超时李四8. 升级后的优化调整新版本通常会有更好的默认配置但需要手动开启。比如在daemon.json中添加{ log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 }, storage-driver: overlay2 }检查配置是否生效docker info | grep -A5 Logging Driver

更多文章