准备工作
- 此脚本支持centos系列有yum命令的系统
- 可以访问外网的网卡
- 移除虚拟机原有的yum源(可删除或移走)
使用脚本直接安装
#!/bin/bash
#version=v1
##########
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
if [ "$EUID" -ne 0 ]; then
echo -e "\033[31m请使用root权限运行此脚本!\033[0m"
exit 1
fi
if [ ! -f /etc/yum.repos.d/centos.repo ]; then
# 如果文件不存在,打印创建信息
echo "创建 /etc/yum.repos.d/centos.repo文件..."
# 使用网络传输下载阿里云yum源
curl http://mirrors.aliyun.com/repo/Centos-7.repo -o /etc/yum.repos.d/centos.repo
# 将文件内的http改成https,使用安全访问
sed -i 's/http/https/g' /etc/yum.repos.d/centos.repo
# 更新
yum clean all && yum repolist
else
# 如果文件已存在,打印警告信息
echo -e "\033[32m警告:/etc/yum.repos.d/centos.repo 文件已存在,不会进行修改。\033[0m"
fi
if [ ! -f /etc/yum.repos.d/docker.repo ]; then
# 如果文件不存在,打印创建信息
echo "创建 /etc/yum.repos.d/docker-ce.repo 文件..."
# 安装 wget 工具(如果尚未安装)
yum -y install wget
# 从阿里云镜像下载 Docker CE 的 yum 仓库配置文件
wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新 yum 缓存
yum makecache
else
# 如果文件已存在,打印警告信息
echo -e "\033[0m 警告:/etc/yum.repos.d/docker.repo 文件已存在,不会进行修改。\033[0m"
fi
##########
# 输出提示信息
a="如果之前有安装docker的话,先删除docker"
echo -e "\033[31m$a\033[0m"
# 检查是否安装了 Docker
if [ -x "$(command -v docker)" ]; then
# 停止 Docker 服务
echo -e "\033[32m正在停止 Docker 服务...\033[0m"
if systemctl is-active --quiet docker; then
sudo systemctl stop docker
else
echo -e "\033[33mDocker 服务未运行,跳过停止步骤。\033[0m"
fi
# 停止 Docker 套接字
if systemctl is-active --quiet docker.socket; then
echo -e "\033[32m正在停止 Docker 套接字...\033[0m"
sudo systemctl stop docker.socket
else
echo -e "\033[33mDocker 套接字未运行,跳过停止步骤。\033[0m"
fi
# 禁用 Docker 服务
if systemctl is-enabled --quiet docker; then
echo -e "\033[32m正在禁用 Docker 服务...\033[0m"
sudo systemctl disable docker
else
echo -e "\033[33mDocker 服务未启用,跳过禁用步骤。\033[0m"
fi
# 禁用 Docker 套接字
if systemctl is-enabled --quiet docker.socket; then
echo -e "\033[32m正在禁用 Docker 套接字...\033[0m"
sudo systemctl disable docker.socket
else
echo -e "\033[33mDocker 套接字未启用,跳过禁用步骤。\033[0m"
fi
# 卸载 Docker 相关包
echo -e "\033[32m正在卸载 Docker 相关包...\033[0m"
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
docker-ce \
docker-ce-cli \
ontainerd.io \
docker-buildx-plugin \
docker-socket \
docker-compose-plugin \
docker-ce-rootless-extras
# 删除 Docker 数据目录
echo -e "\033[32m正在删除 Docker 数据目录 /var/lib/docker...\033[0m"
sudo rm -rf /var/lib/docker
# 删除 Docker 配置目录
echo -e "\033[32m正在删除 Docker 配置目录 /etc/docker...\033[0m"
sudo rm -rf /etc/docker
# 删除 Docker.sock数据目录
echo -e "\033[32m正在删除 Docker.sock 数据目录/var/run/docker.sock\033[0m"
sudo rm -rf /var/run/docker.sock
# 删除 Docker 用户组
if getent group docker > /dev/null; then
echo -e "\033[32m正在删除 Docker 用户组...\033[0m"
sudo groupdel docker
fi
echo -e "\033[32mDocker 已成功删除。\033[0m"
else
echo -e "\033[31mDocker 未安装,无需删除。\033[0m"
fi
##########
b=使用yum安装docker
echo -e "\033[31m$b\033[0m"
echo -e "Usage : $0 \033[1;31m
1(安装最新版)
2(选择docker版本)
3(不安装docker,只安装docker compose)\033[0m"
read -p "选择: " a
case $a in
1)
echo -e "\033[32m 正在安装最新版docker... \033[0m"
yum -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl start docker
systemctl enable docker
echo -e "\033[32m 已经安装并且启动最新版docker. \033[0m"
systemctl status docker
;;
2)
#获取所有可用Docker CE版本
get_docker_versions() {
yum list docker-ce --showduplicates | sort -r | awk '{print $2}' | grep -oP '(?<=:)[^:]+$' | uniq
}
install_specific_docker() {
install_docker_repo echo -e "\033[31m请选择你想要安装的Docker版本号:\033[0m"
}
versions=$(get_docker_versions)
PS3="请输入版本号(或者输入'q'退出): "
select version in $versions "q"; do
if [[ $version == "q" ]]; then
echo -e "\033[31m 退出选择。\033[0m"
break
elif [[ -n "$version" ]]; then
echo -e "\033[32m 正在安装Docker $version版本...\033[0m"
yum -y install docker-ce-$version docker-ce-cli-$version containerd.io-$version
systemctl start docker
systemctl enable docker
echo -e "\033[32m Docker版本$version已经安装完毕并且启动。 \033[0m"
systemctl status docker
break
else
echo -e "\033[31m 无效选择,请重新输入。 \033[0m"
fi
done
;;
3)
echo -e "\033[31m 退出docker安装。\033[0m"
;;
*)
不符合以上模式执行的命令
esac
##########
if ! command -v docker &> /dev/null ; then
echo -e "\033[31m没有安装docker服务 \033[0m"
elif
[ ! -f /etc/docker/daemon.json ] ; then
echo -e "\033[32m创建 /etc/docker/daemon.json 文件... \033[0m"
cat <<EOF > /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.c"
]
}
EOF
systemctl daemon-reload && systemctl restart docker
else
echo -e "\033[31m 警告:/etc/docker/daemon.json 文件已存在,不会进行修改。\033[0m"
fi
##########
echo -e "\033[31m如果之前有安装docker compose的话,先删除docker compose\033[0m"
# 尝试停止并移除所有由Docker Compose管理的服务
if command -v docker-compose &> /dev/null; then
# 查找包含 docker-compose.yml 或 docker-compose.yaml 的目录
compose_dir=$(find . -type f -name 'docker-compose.yml' -o -name 'docker-compose.yaml' -exec dirname {} \; | head -n 1)
if [ -z "$compose_dir" ]; then
echo -e "\033[33m未找到 docker-compose.yml 或 docker-compose.yaml 文件,跳过 docker-compose down 步骤。\033[0m"
else
echo -e "\033[32m正在停止并移除Docker Compose服务... \033[0m"
cd "$compose_dir"
docker-compose down -v
fi
else
echo -e "\033[33m未找到docker-compose命令,跳过docker-compose down步骤。\033[0m"
fi
#Author: 小宇学IT
##Website: https://blog.csdn.net/2402_82681173?type=blog
# 清理Docker系统
echo -e "\033[31m正在清理Docker系统...\033[0m"
docker system prune -f
# 删除Docker Compose二进制文件
echo -e "\033[32m正在删除Docker Compose二进制文件... \033[0m"
rm -rf /usr/local/bin/docker-compos
##########
# 获取 Docker Engine 的版本
docker_version=$(docker --version | grep -oP '(\d+\.\d+\.\d+)' || echo "0.0.0")
# 检查 Docker 是否已安装
if ! [ -x "$(command -v docker)" ]; then
echo -e "\033[31m没有安装docker服务,先安装docker服务. \033[0m"
exit 1
fi
# 输出当前 Docker 版本
echo "Current Docker Engine version: $docker_version"
# 定义安装函数
install_compose() {
local compose_version=$1
echo -e "\033[32m正在下载docker compose版本${compose_version}... \033[0m"
# 删除旧的软链接(如果存在)
echo -e "\033[32m正在删除Docker Compose之前的软链接... \033[0m"
sudo unlink /usr/local/bin/docker-compose
sudo unlink /usr/bin/docker-compose
# 下载指定版本的 Docker Compose
wget https://mirror.ghproxy.com/https://github.com/docker/compose/releases/download/${compose_version}/docker-compose-$(uname -s)-$(uname -m) -O /usr/local/bin/docker-compose
# 设置执行权限
chmod +x /usr/local/bin/docker-compose
# 创建软链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
}
# 根据 Docker 版本来选择并安装对应的 Docker Compose 版本
if [[ "$docker_version" > "25.9.9" && "$docker_version" < "27.1.0" ]]; then
install_compose "v2.26.0"
elif [[ "$docker_version" > "24.9.9" && "$docker_version" < "26.1.0" ]]; then
install_compose "v2.25.0"
elif [[ "$docker_version" > "21.9.9" && "$docker_version" < "25.1.0" ]]; then
install_compose "v2.2.3"
elif [[ "$docker_version" > "20.9.9" && "$docker_version" < "22.0.0" ]]; then
install_compose "1.29.0"
elif [[ "$docker_version" > "19.9.9" && "$docker_version" < "21.0.0" ]]; then
install_compose "1.27.0"
elif [[ "$docker_version" > "18.9.9" && "$docker_version" < "20.0.0" ]]; then
install_compose "1.24.0"
elif [[ "$docker_version" > "17.9.9" && "$docker_version" < "19.0.0" ]]; then
install_compose "1.22.0"
elif [[ "$docker_version" > "16.9.9" && "$docker_version" < "18.0.0" ]]; then
install_compose "1.18.0"
else
echo -e "\033[31m不支持的Docker版本: $docker_version \033[0m "
exit 1
fi
# 验证 Docker Compose 安装
docker_compose_version=$(docker-compose --version | grep -oP '(\d+\.\d+\.\d+)' || echo "0.0.0")
# 检查 Docker Compose 是否安装成功
if command -v docker-compose &> /dev/null; then
echo -e "\033[32mDocker Compose ${docker_compose_version} 安装成功。\033[0m"
d=$(docker-compose --version)
echo -e "\033[32m$d\033[0m"
else
echo -e "\033[31mDocker Compose安装失败。\033[0m"
exit 1
fi
暂无评论