CentOS 7下无损升级Docker到Docker-CE 18.06.3,保姆级避坑指南(附容器数据恢复脚本)
CentOS 7下Docker无损升级实战:从旧版到Docker-CE 18.06.3的完整方案
在CentOS 7的生产环境中,系统自带的Docker版本往往过于陈旧,不仅功能受限,还可能遇到各种兼容性问题。最近一位同事在拉取镜像时遭遇了
missing signature key
错误,这正是我们需要升级Docker的典型信号。本文将分享一套经过实战检验的无损升级方案,确保您的容器服务不中断,所有镜像和数据完好无损。
1. 升级前的关键准备
升级Docker看似简单,但稍有不慎就可能导致容器服务中断或数据丢失。在开始之前,我们需要做好以下准备工作:
-
系统环境检查 :
cat /etc/redhat-release # 确认是CentOS 7 uname -r # 检查内核版本(建议3.10以上) docker version # 记录当前Docker版本 -
资源评估 :
-
确保有至少2GB的可用磁盘空间(特别是
/var/lib/docker目录所在分区) - 建议在系统负载较低的时间段执行升级(如凌晨)
-
确保有至少2GB的可用磁盘空间(特别是
-
备份策略 :
# 备份重要容器配置 docker ps -a > /opt/docker_backup/containers_list.txt docker images > /opt/docker_backup/images_list.txt # 备份容器数据卷(如果有) tar -czvf /opt/docker_backup/volumes.tar.gz /var/lib/docker/volumes/
提示:即使采用无损升级方案,也强烈建议在执行前创建完整的系统快照,特别是对运行关键业务的服务器。
2. 分步升级操作指南
2.1 安全停止Docker服务
首先需要优雅地停止所有容器和Docker服务:
# 停止所有运行中的容器
docker stop $(docker ps -q)
# 停止Docker服务
systemctl stop docker
2.2 备份Docker数据目录
Docker的所有数据(包括镜像、容器和卷)都存储在
/var/lib/docker
目录中。我们通过重命名而非删除来保留这些数据:
mv /var/lib/docker /var/lib/docker-bak
2.3 彻底移除旧版Docker
CentOS 7默认安装的是
docker
而非
docker-ce
,需要完全卸载:
yum -y remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.4 安装指定版本的Docker-CE
我们将安装经过验证的稳定版本18.06.3:
# 添加Docker官方仓库
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装指定版本
yum install -y docker-ce-18.06.3.ce-3.el7
2.5 恢复数据目录
安装完成后,系统会自动创建新的
/var/lib/docker
目录,我们需要用备份替换它:
# 删除新创建的目录
rm -rf /var/lib/docker
# 恢复备份数据
mv /var/lib/docker-bak /var/lib/docker
3. 解决常见升级问题
3.1 "docker-runc"运行时错误
启动服务后可能会遇到如下错误:
Error response from daemon: Unknown runtime specified docker-runc
这是因为新旧版本对运行时名称的变更导致的,修复方法:
# 批量替换容器配置中的运行时名称
grep -rl 'docker-runc' /var/lib/docker/containers/ | xargs sed -i 's/docker-runc/runc/g'
# 重启Docker服务
systemctl restart docker
3.2 容器网络异常处理
升级后部分容器可能出现网络连接问题,可尝试:
# 重建Docker的iptables规则
systemctl stop docker
iptables -t nat -F
systemctl start docker
3.3 存储驱动兼容性问题
如果使用devicemapper存储驱动,可能需要迁移到overlay2:
# 修改daemon.json
cat > /etc/docker/daemon.json <<EOF
{
"storage-driver": "overlay2"
}
EOF
# 重启服务
systemctl restart docker
4. 升级后的验证与优化
4.1 基础功能验证
# 检查Docker版本
docker version
# 测试镜像拉取
docker pull alpine
# 验证容器运行
docker run --rm alpine echo "升级成功"
4.2 性能调优建议
升级后可以调整一些参数以获得更好性能:
# 编辑系统配置文件
cat >> /etc/sysctl.conf <<EOF
# Docker性能优化
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
vm.swappiness=0
EOF
# 应用配置
sysctl -p
4.3 监控与维护
建议设置定期维护任务:
# 每周自动清理无用镜像
(crontab -l 2>/dev/null; echo "0 3 * * 0 docker image prune -af") | crontab -
# 日志轮转配置
cat > /etc/logrotate.d/docker <<EOF
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
missingok
delaycompress
copytruncate
}
EOF
5. 回滚方案设计
尽管我们力求升级过程平滑,但仍需准备回滚预案:
- 快速回滚脚本 :
#!/bin/bash
systemctl stop docker
rm -rf /var/lib/docker
mv /var/lib/docker-bak /var/lib/docker
yum -y remove docker-ce
yum -y install docker-$(rpm -q --queryformat '%{VERSION}' docker-ce)
systemctl start docker
-
回滚验证清单 :
- 确认所有容器状态与升级前一致
- 检查数据卷完整性
- 验证网络连接和端口映射
-
回滚后的清理 :
# 清除Docker-CE残留配置
rm -f /etc/yum.repos.d/docker-ce.repo
yum clean all
更多推荐
所有评论(0)