百度已收录

准备工作

  • 此脚本支持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