老centos7 升级docker.io为docker-ce 脚本

news2025/1/16 14:37:06

旧的centos7 之前安装的是docker.io 由于一些原因,像docker compose 等版本变化,以及docker.io源受限等,我们要更新到docker-ce 并使用国内阿里云的源怎么处理?下面直接上脚本,upgrade-docker.sh

#!/bin/bash

set -e

# 创建临时目录
TEMP_DIR="./tmp"
mkdir -p "$TEMP_DIR"

# 函数:错误处理和回滚
rollback() {
    echo "发生错误。正在回滚更改..."
    if [ -f "$TEMP_DIR/docker_images.tar" ]; then
        docker load -i "$TEMP_DIR/docker_images.tar"
    fi
    if [ -d "$TEMP_DIR/docker_containers_backup" ]; then
        for container in "$TEMP_DIR/docker_containers_backup"/*; do
            docker import "$container" $(basename "$container")
        done
    fi
    if [ -f "$TEMP_DIR/docker-compose" ]; then
        sudo mv "$TEMP_DIR/docker-compose" /usr/local/bin/docker-compose
        sudo chmod +x /usr/local/bin/docker-compose
    fi
    if [ -f "$TEMP_DIR/docker_config.txt" ]; then
        while IFS= read -r line; do
            eval "$line"
        done < "$TEMP_DIR/docker_config.txt"
    fi
    sudo yum downgrade -y docker-ce docker-ce-cli containerd.io
    sudo systemctl start docker
    echo "回滚完成。系统已恢复到之前的状态。"
    exit 1
}

# 捕获错误并调用回滚函数
trap rollback ERR

# 保存当前的Docker数据和配置
echo "正在保存当前的Docker数据和配置..."
mkdir -p "$TEMP_DIR/docker_containers_backup"
docker save $(docker images -q) -o "$TEMP_DIR/docker_images.tar"

# 保存每个容器的配置
docker ps -a --format '{{.Names}}' | while read container_name; do
    docker inspect "$container_name" > "$TEMP_DIR/docker_containers_backup/${container_name}_inspect.json"
    docker export "$container_name" > "$TEMP_DIR/docker_containers_backup/${container_name}.tar"
done

# 保存Docker守护进程配置
docker info --format '{{json .}}' > "$TEMP_DIR/docker_config.txt"

# 停止Docker服务
echo "正在停止Docker服务..."
sudo systemctl stop docker

# 备份 docker-compose
if [ -f /usr/local/bin/docker-compose ]; then
    echo "正在备份docker-compose..."
    sudo cp /usr/local/bin/docker-compose "$TEMP_DIR/docker-compose"
fi

# 卸载旧版本的Docker和docker-compose
echo "正在卸载旧版本的Docker和docker-compose..."
sudo yum remove -y docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine \
                  docker-ce \
                  docker-ce-cli
sudo rm -f /usr/local/bin/docker-compose

# 安装必要的依赖
echo "正在安装必要的依赖..."
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加阿里云Docker CE的yum源
echo "正在添加阿里云Docker CE的yum源..."
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装Docker CE
echo "正在安装Docker CE..."
sudo yum install -y docker-ce docker-ce-cli containerd.io

# 恢复Docker守护进程配置
if [ -f "$TEMP_DIR/docker_config.txt" ]; then
    echo "正在恢复Docker守护进程配置..."
    sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak || true
    sudo jq -s '.[0] * .[1]' /etc/docker/daemon.json "$TEMP_DIR/docker_config.txt" | sudo tee /etc/docker/daemon.json > /dev/null
fi

# 启动Docker服务
echo "正在启动Docker服务..."
sudo systemctl start docker

# 设置Docker开机自启
echo "正在设置Docker开机自启..."
sudo systemctl enable docker

# 恢复之前保存的Docker数据
echo "正在恢复Docker数据..."
docker load -i "$TEMP_DIR/docker_images.tar"

# 恢复容器
for container in "$TEMP_DIR/docker_containers_backup"/*_inspect.json; do
    container_name=$(basename "$container" _inspect.json)
    echo "正在恢复容器: $container_name"
    
    # 从备份中导入容器镜像
    cat "$TEMP_DIR/docker_containers_backup/${container_name}.tar" | docker import - "$container_name:backup"
    
    # 从inspect文件中提取必要的配置
    config=$(jq '.[] | {Image: .Config.Image, Cmd: .Config.Cmd, Entrypoint: .Config.Entrypoint, Env: .Config.Env, ExposedPorts: .Config.ExposedPorts, Volumes: .Config.Volumes, WorkingDir: .Config.WorkingDir, HostConfig: .HostConfig}' "$container")
    
    # 使用提取的配置创建新容器
    docker create $(echo "$config" | jq -r '.HostConfig | to_entries | map("\(.key)=\(.value|tostring)") | join(" ")') \
                   $(echo "$config" | jq -r 'to_entries | map("\(.key)=\(.value|tostring)") | join(" ")') \
                   --name "$container_name" \
                   "$container_name:backup"
    
    # 如果容器之前是运行状态,则启动它
    if [ "$(jq -r '.[0].State.Running' "$container")" = "true" ]; then
        docker start "$container_name"
    fi
done

# 清理临时文件
echo "正在清理临时文件..."
rm -rf "$TEMP_DIR"

# 验证 docker compose 命令
if docker compose version; then
    echo "Docker Compose (V2) 已成功安装。"
else
    echo "Docker Compose (V2) 不可用。请检查您的Docker安装。"
    rollback
fi

echo "Docker CE 安装、数据迁移和 docker-compose 移除已成功完成。"
echo "所有容器已恢复,保留了原始名称、参数和配置。"


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2277572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenStack 网络服务的插件架构

OpenStack 的网络服务具有灵活的插件架构&#xff0c;可支持多种不同类型的插件以满足不同的网络需求。以下是对 OpenStack 网络服务插件架构中一些常见插件类型的介绍&#xff1a; 一、SDN 插件 Neutron 与 SDN 的集成&#xff1a;在 OpenStack 网络服务里&#xff0c;SDN 插…

光伏储能交直流微电网Matlab/Simulink仿真模型

博士毕业后项目和课题的交接工作也都基本上结束了&#xff0c;之前从20年我博一开始创作的博客&#xff0c;我也将从25年伊始重新进行更新&#xff0c;在保留原有内容的基础上&#xff0c;在对现如今的研究热点进行补充&#xff0c;希望能为各位校友提供一定的研究思路。首先是…

【js进阶】设计模式之单例模式的几种声明方式

单例模式&#xff0c;简言之就是一个类无论实例化多少次&#xff0c;最终都是同一个对象 原生js的几个辅助方式的实现 手写forEch,map,filter Array.prototype.MyForEach function (callback) {for (let i 0; i < this.length; i) {callback(this[i], i, this);} };con…

Broker收到消息之后如何存储

1.前言 此文章是在儒猿课程中的学习笔记&#xff0c;感兴趣的想看原来的课程可以去咨询儒猿课堂《从0开始带你成为RocketMQ高手》&#xff0c;我本人觉得这个作者还是不错&#xff0c;都是从场景来进行分析&#xff0c;感觉还是挺适合我这种小白的。这块主要都是我自己的学习笔…

vim使用指南

&#x1f3dd;️专栏&#xff1a;计算机操作系统 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 一、Vim 的基本概念 1.Vim 的主要模式&#xff1a; 1.1普通模式 (Normal Mode) 1.2插入…

计算机网络 网络层 2

IP协议&#xff1a; Ip数据报的格式&#xff1a; 首部:分为固定部分 和 可变部分 固定部分是20B 版本&#xff1a;表明了是IPV4还是IPV6 首部长度&#xff1a;单位是 4B&#xff0c;表示的范围是&#xff08;5~15&#xff09;*4B 填充&#xff1a;全0&#xff0c;,让首部变…

干净卸载Windows的Node.js环境的方法

本文介绍在Windows电脑中&#xff0c;彻底删除Node.js环境的方法。 在之前的文章Windows系统下载、部署Node.js与npm环境的方法&#xff08;https://blog.csdn.net/zhebushibiaoshifu/article/details/144810076&#xff09;中&#xff0c;我们介绍过在Windows电脑中&#xff0…

《汽车维护与修理》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答&#xff1a; 问&#xff1a;《汽车维护与修理》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《汽车维护与修理》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;中国汽车维修行业协会 …

线性回归超详解

目录 一、回归问题 vs 分类问题 二、线性回归 1、一句话理解 2、数学推导 2.1 线性函数表示 2.2 损失函数 2.3 梯度下降 2.3.1 什么是梯度 2.3.2 梯度下降目标 2.3.3 过程 2.3.4 迭代公式 3、特征预处理 3.1 为什么要预处理 3.2 数据归一化方法 1&#xff09;最小…

《无锡布里渊分布式光纤传感技术:照亮能源领域新征程》

在全球能源格局加速变革、能源需求持续攀升的当下&#xff0c;保障能源系统的安全、高效运行成为重中之重。分布式光纤传感技术宛如一颗璀璨的科技新星&#xff0c;正以前所未有的姿态融入能源领域&#xff0c;重塑着能源开采、运输与监测的传统模式。 石油与天然气作为现代工…

win32汇编环境,窗口程序中组合框的应用举例

;运行效果 ;win32汇编环境,窗口程序中组合框的应用举例 ;比如在窗口程序中生成组合框&#xff0c;增加子项&#xff0c;删除某项&#xff0c;取得指定项内容等 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;以下是ASM文件 ;>>>>>>>>>>>>…

PHP智慧小区物业管理小程序

&#x1f31f;智慧小区物业管理小程序&#xff1a;重塑社区生活&#xff0c;开启便捷高效新篇章 &#x1f31f; 智慧小区物业管理小程序是一款基于PHPUniApp精心雕琢的智慧小区物业管理小程序&#xff0c;它犹如一股清新的科技之风&#xff0c;吹进了现代智慧小区的每一个角落…

win10电脑 定时关机

win10电脑 定时关机 https://weibo.com/ttarticle/p/show?id2309405110707766296723 二、使用任务计划程序设置定时关机打开任务计划程序&#xff1a; 按下“Win S”组合键&#xff0c;打开搜索框。 在搜索框中输入“任务计划程序”&#xff0c;然后点击搜索结果中的“任务…

【数模学习笔记】插值算法和拟合算法

声明&#xff1a;以下笔记中的图片以及内容 均整理自“数学建模学习交流”清风老师的课程资料&#xff0c;仅用作学习交流使用 文章目录 插值算法定义三个类型插值举例插值多项式分段插值三角插值 一般插值多项式原理拉格朗日插值法龙格现象分段线性插值 牛顿插值法 Hermite埃尔…

​HPM6700——以太网通信lwip_udpecho_freertos_socket

1. 概述 本示例展示在FreeRTOS系统下的UDP回送通讯 PC 通过以太网发送UDP数据帧至MCU&#xff0c;MCU将接收的数据帧回发至PC 2. 硬件设置 使用USB Type-C线缆连接PC USB端口和PWR DEBUG端口 使用以太网线缆连接PC以太网端口和开发板RGMII或RMII端口 3. 工程配置 以太网端…

低代码独特架构带来的编译难点及多线程解决方案

前言 在当今软件开发领域&#xff0c;低代码平台以其快速构建应用的能力&#xff0c;吸引了众多开发者与企业的目光。然而&#xff0c;低代码平台独特的架构在带来便捷的同时&#xff0c;也给编译过程带来了一系列棘手的难点。 一&#xff0c;低代码编译的难点 &#xff08;1…

FPGA 21 ,深入理解 Verilog 中的基数,以及二进制数与十进制数之间的关系( Verilog中的基数 )

目录 前言 一. 基数基础 1.1 基数介绍 2.1 基数符号 3.1 二进制数 二. 二进制与十进制数 三. 二进制数 3.1 定义寄存器类型变量 3.2 定义线网类型变量 3.3 赋值操作 3.4 解析二进制数为十进制数 四. 代码示例 五. 注意事项 六. 更多操作 前言 在Verilog中&#…

开始使用Panuon开源界面库环境配置并手写VS2019高仿界面

1. Panuon环境配置 1.1. 通过Nuget 安装 Panuon.WPF.UI1.2. xaml引用命名空间1.3. using Panuon.WPF.UI; 2. VS2019 view 2.1. 设置窗体尺寸和title2.2. 添加静态资源 2.2.1. 什么是静态资源 2.3. 主Grid 2.3.1. 盒子模型2.3.2. 嵌套布局 3. 总结 1. Panuon环境配置 1.1. 通…

blender导出镜头动作vmd

1 选中相机 2 在相机属性中找到 MMD摄像机工具 3 在弹窗中给 烘焙动画 打勾&#xff08;图中没忘打了&#xff09;点击确定 等待烘焙完成 4 烘焙结束后选中刚刚新增的物体 5 在mmd tools中点击 动作-导出&#xff08;图中已经导出了&#xff0c;故显示灰色&#xff09;

RabbitMQ确保消息可靠性

消息丢失的可能性 支付服务先扣减余额和更新支付状态&#xff08;这俩是同步调用&#xff09;&#xff0c;然后通过RabbitMq异步调用支付服务更新订单状态。但是有些情况下&#xff0c;可能订单已经支付 &#xff0c;但是更新订单状态却失败了&#xff0c;这就出现了消息丢失。…