From 5e0cc2741870a8b1d6e5c1b0d3c1e943b9123b07 Mon Sep 17 00:00:00 2001 From: SuperManito <68613938+SuperManito@users.noreply.github.com> Date: Mon, 1 May 2023 20:09:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=20Docker=20=E4=B8=80=E9=94=AE=E5=AE=89=E8=A3=85=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DockerInstallation.sh | 561 +++++++++++++++++++----------------------- README.md | 2 +- docs/README.md | 2 +- 3 files changed, 251 insertions(+), 314 deletions(-) diff --git a/DockerInstallation.sh b/DockerInstallation.sh index 1f819db..f9c5936 100644 --- a/DockerInstallation.sh +++ b/DockerInstallation.sh @@ -1,12 +1,12 @@ #!/bin/bash ## Author: SuperManito -## Modified: 2022-06-05 +## Modified: 2023-05-01 ## License: GPL-2.0 ## Github: https://github.com/SuperManito/LinuxMirrors ## Gitee: https://gitee.com/SuperManito/LinuxMirrors function AuthorSignature() { - echo -e "\n${GREEN} ------------ 脚本执行结束 ------------ ${PLAIN}\n" + echo -e "\n$COMPLETE 脚本执行结束\n" echo -e '\033[0;1;35;95m┌─\033[0;1;31;91m──\033[0;1;33;93m──\033[0;1;32;92m──\033[0;1;36;96m──\033[0;1;34;94m──\033[0;1;35;95m──\033[0;1;31;91m──\033[0;1;33;93m──\033[0;1;32;92m──\033[0;1;36;96m──\033[0;1;34;94m──\033[0;1;35;95m──\033[0;1;31;91m──\033[0;1;33;93m──\033[0;1;32;92m──\033[0;1;36;96m──\033[0;1;34;94m──\033[0;1;35;95m──\033[0;1;31;91m──\033[0;1;33;93m──\033[0;1;32;92m──\033[0;1;36;96m──\033[0;1;34;94m──\033[0;1;35;95m──\033[0;1;31;91m──\033[0;1;33;93m──\033[0;1;32;92m──\033[0;1;36;96m──\033[0;1;34;94m──\033[0;1;35;95m─┐\033[0m' echo -e '\033[0;1;31;91m│\033[0m \033[0;1;32;92m__\033[0;1;36;96m__\033[0;1;34;94m_\033[0m \033[0;1;34;94m__\033[0m \033[0;1;31;91m__\033[0;1;33;93m_\033[0m \033[0;1;33;93m_\033[0m \033[0;1;32;92m_\033[0;1;36;96m_\033[0m \033[0;1;31;91m│\033[0m' echo -e '\033[0;1;33;93m│\033[0m \033[0;1;32;92m/\033[0m \033[0;1;36;96m_\033[0;1;34;94m__\033[0;1;35;95m/_\033[0;1;31;91m_\033[0m \033[0;1;33;93m_\033[0;1;32;92m__\033[0;1;36;96m__\033[0;1;34;94m_\033[0m \033[0;1;35;95m_\033[0;1;31;91m__\033[0m \033[0;1;32;92m__\033[0;1;36;96m__\033[0;1;34;94m_/\033[0m \033[0;1;31;91m|/\033[0m \033[0;1;32;92m/_\033[0;1;36;96m__\033[0m \033[0;1;34;94m_\033[0;1;35;95m__\033[0;1;31;91m__\033[0m \033[0;1;32;92m(_\033[0;1;36;96m)\033[0m \033[0;1;34;94m/_\033[0;1;35;95m__\033[0;1;31;91m__\033[0m \033[0;1;33;93m│\033[0m' @@ -20,39 +20,37 @@ function AuthorSignature() { } ## 定义系统判定变量 -DebianRelease="lsb_release" -ARCH=$(uname -m) SYSTEM_DEBIAN="Debian" SYSTEM_UBUNTU="Ubuntu" SYSTEM_KALI="Kali" SYSTEM_REDHAT="RedHat" SYSTEM_RHEL="RedHat" SYSTEM_CENTOS="CentOS" +SYSTEM_CENTOS_STREAM="CentOS Stream" +SYSTEM_ROCKY="Rocky" SYSTEM_FEDORA="Fedora" +SYSTEM_OPENEULER="openEuler" ## 定义目录和文件 -LinuxRelease=/etc/os-release -RedHatRelease=/etc/redhat-release -DebianVersion=/etc/debian_version -DebianSourceList=/etc/apt/sources.list -DebianExtendListDir=/etc/apt/sources.list.d -RedHatReposDir=/etc/yum.repos.d -SelinuxConfig=/etc/selinux/config +File_LinuxRelease=/etc/os-release +File_RedHatRelease=/etc/redhat-release +File_openEulerRelease=/etc/openEuler-release +File_DebianVersion=/etc/debian_version +File_DebianSourceList=/etc/apt/sources.list +Dir_DebianExtendSource=/etc/apt/sources.list.d +Dir_RedHatRepos=/etc/yum.repos.d +Dir_openEulerRepos=/etc/yum.repos.d +Dir_openSUSERepos=/etc/zypp/repos.d ## 定义 Docker 相关变量 -DockerSourceList=$DebianExtendListDir/docker.list -DockerRepo=$RedHatReposDir/download.docker.com_linux_*.repo DockerDir=/etc/docker DockerConfig=$DockerDir/daemon.json DockerConfigBackup=$DockerDir/daemon.json.bak -DockerCompose=/usr/local/bin/docker-compose DockerVersionFile=docker-version.txt DockerCEVersionFile=docker-ce-version.txt DockerCECLIVersionFile=docker-ce-cli-version.txt -PROXY_URL=https://ghproxy.com/ -DOCKER_COMPOSE_VERSION=1.29.2 -DOCKER_COMPOSE_DOWNLOAD_URL=https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-Linux-x86_64 +## 定义颜色变量 RED='\033[31m' GREEN='\033[32m' YELLOW='\033[33m' @@ -65,52 +63,44 @@ WARN='[\033[33mWARN\033[0m]' ERROR='[\033[31mERROR\033[0m]' WORKING='[\033[34m*\033[0m]' -## 组合函数 -function Combin_Function() { - PermissionJudgment - NetWorkJudgment - EnvJudgment - ChooseMirrors - InstallationEnvironment - ConfigureDockerCEMirror - DockerEngine - DockerCompose - ShowVersion - AuthorSignature -} - ## 系统判定变量 function EnvJudgment() { - ## 判定当前系统基于 Debian or RedHat - if [ -s $RedHatRelease ]; then - SYSTEM_FACTIONS=${SYSTEM_REDHAT} - elif [ -s $DebianVersion ]; then - SYSTEM_FACTIONS=${SYSTEM_DEBIAN} + ## 定义系统名称 + SYSTEM_NAME="$(cat $File_LinuxRelease | grep -E "^NAME=" | awk -F '=' '{print$2}' | sed "s/[\'\"]//g")" + cat $File_LinuxRelease | grep "PRETTY_NAME=" -q + [ $? -eq 0 ] && SYSTEM_PRETTY_NAME="$(cat $File_LinuxRelease | grep -E "^PRETTY_NAME=" | awk -F '=' '{print$2}' | sed "s/[\'\"]//g")" + ## 定义系统版本号 + SYSTEM_VERSION_NUMBER="$(cat $File_LinuxRelease | grep -E "^VERSION_ID=" | awk -F '=' '{print$2}' | sed "s/[\'\"]//g")" + ## 定义系统ID + SYSTEM_ID="$(cat $File_LinuxRelease | grep -E "^ID=" | awk -F '=' '{print$2}' | sed "s/[\'\"]//g")" + ## 判定当前系统派系(Debian/RedHat/openEuler) + if [ -s $File_RedHatRelease ]; then + SYSTEM_FACTIONS="${SYSTEM_REDHAT}" + elif [ -s $File_DebianVersion ]; then + SYSTEM_FACTIONS="${SYSTEM_DEBIAN}" + elif [ -s $File_openEulerRelease ]; then + SYSTEM_FACTIONS="${SYSTEM_OPENEULER}" else echo -e "\n$ERROR 无法判断当前运行环境,请先确认本脚本针对当前操作系统是否适配!\n" exit fi - ## 定义系统名称 - SYSTEM_NAME=$(cat $LinuxRelease | grep -E "^NAME=" | awk -F '=' '{print$2}' | sed "s/[\'\"]//g") - ## 定义系统版本号 - SYSTEM_VERSION_NUMBER=$(cat $LinuxRelease | grep -E "VERSION_ID=" | awk -F '=' '{print$2}' | sed "s/[\'\"]//g") ## 判定系统名称、版本、版本号 - case ${SYSTEM_FACTIONS} in - Debian) - SYSTEM_JUDGMENT=$(${DebianRelease} -is) - SYSTEM_VERSION=$(${DebianRelease} -cs) + case "${SYSTEM_FACTIONS}" in + "${SYSTEM_DEBIAN}") + SYSTEM_JUDGMENT=$(lsb_release -is) + SYSTEM_VERSION=$(lsb_release -cs) ;; - RedHat) - SYSTEM_JUDGMENT=$(cat $RedHatRelease | sed 's/ //g' | cut -c1-6) - if [[ ${SYSTEM_JUDGMENT} = ${SYSTEM_CENTOS} || ${SYSTEM_JUDGMENT} = ${SYSTEM_RHEL} ]]; then - CENTOS_VERSION=$(echo ${SYSTEM_VERSION_NUMBER} | cut -c1) - else - CENTOS_VERSION="" - fi + "${SYSTEM_REDHAT}") + SYSTEM_JUDGMENT="$(cat $File_RedHatRelease | awk -F ' ' '{printf$1}')" + cat $File_RedHatRelease | grep -q "${SYSTEM_CENTOS_STREAM}" + [ $? -eq 0 ] && SYSTEM_JUDGMENT="${SYSTEM_CENTOS_STREAM}" + ;; + "${SYSTEM_OPENEULER}") + SYSTEM_JUDGMENT="${SYSTEM_OPENEULER}" ;; esac ## 判定系统处理器架构 - case ${ARCH} in + case $(uname -m) in x86_64) SYSTEM_ARCH="x86_64" SOURCE_ARCH="amd64" @@ -133,22 +123,25 @@ function EnvJudgment() { exit ;; *) - SYSTEM_ARCH=${ARCH} + SYSTEM_ARCH=$(uname -m) SOURCE_ARCH=armhf ;; esac ## 定义软件源分支名称 - if [ ${SYSTEM_JUDGMENT} = ${SYSTEM_RHEL} ]; then + case "${SYSTEM_JUDGMENT}" in + "${SYSTEM_RHEL}" | "${SYSTEM_CENTOS_STREAM}" | "${SYSTEM_ROCKY}" | "${SYSTEM_OPENEULER}") SOURCE_BRANCH="centos" - else - SOURCE_BRANCH=${SYSTEM_JUDGMENT,,} - fi + ;; + *) + SOURCE_BRANCH="$(echo "${SYSTEM_JUDGMENT,,}" | sed "s/ /-/g")" + ;; + esac ## 定义软件源同步/更新文字 - case ${SYSTEM_FACTIONS} in - Debian) + case "${SYSTEM_FACTIONS}" in + "${SYSTEM_DEBIAN}") SYNC_TXT="更新" ;; - RedHat) + "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}") SYNC_TXT="同步" ;; esac @@ -157,43 +150,54 @@ function EnvJudgment() { ## 基础环境判断 function PermissionJudgment() { if [ $UID -ne 0 ]; then - echo -e "\n$ERROR 权限不足,请使用 Root 用户\n" - exit - fi -} -function NetWorkJudgment() { - ping -c 1 www.baidu.com >/dev/null 2>&1 - if [ $? -ne 0 ]; then - echo -e "\n${RED} ----- Network connection error, please check the network environment and try again later! ----- ${PLAIN}\n" - exit + echo -e "\n$ERROR 权限不足,请使用 Root 用户运行本脚本\n" + exit 1 fi } -## 关闭防火墙 +## 关闭防火墙和SELinux function CloseFirewall() { - if [[ $(systemctl is-active firewalld) == "active" ]]; then - systemctl disable --now firewalld >/dev/null 2>&1 - [ -s $SelinuxConfig ] && sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" $SelinuxConfig && setenforce 0 >/dev/null 2>&1 + local SelinuxConf=/etc/selinux/config + if [ -x /usr/bin/systemctl ]; then + if [[ $(systemctl is-active firewalld) == "active" ]]; then + local CHOICE=$(echo -e "\n${BOLD}└─ 是否关闭防火墙和 SELinux ? [Y/n] ${PLAIN}") + read -p "${CHOICE}" INPUT + [ -z ${INPUT} ] && INPUT=Y + case $INPUT in + [Yy] | [Yy][Ee][Ss]) + systemctl disable --now firewalld >/dev/null 2>&1 + [ -s $SelinuxConf ] && sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" $SelinuxConfig && setenforce 0 >/dev/null 2>&1 + ;; + [Nn] | [Nn][Oo]) ;; + *) + echo -e "\n$WARN 输入错误,默认不关闭!" + ;; + esac + fi fi } ## 安装环境包 function InstallationEnvironment() { - case ${SYSTEM_FACTIONS} in - Debian) - sed -i '/docker-ce/d' $DebianSourceList - rm -rf $DockerSourceList + ## 删除原有源 + case "${SYSTEM_FACTIONS}" in + "${SYSTEM_DEBIAN}") + sed -i '/docker-ce/d' $File_DebianSourceList + rm -rf $Dir_DebianExtendSource/docker.list ;; - RedHat) - rm -rf $DockerRepo + "${SYSTEM_REDHAT}") + rm -rf $Dir_RedHatRepos/*docker*.repo + ;; + "${SYSTEM_OPENEULER}") + rm -rf $Dir_openEulerRepos/*docker*.repo ;; esac - echo -e "${WORKING} 开始${SYNC_TXT}软件源...\n" - case ${SYSTEM_FACTIONS} in - Debian) + echo -e "$WORKING 开始${SYNC_TXT}软件源...\n" + case "${SYSTEM_FACTIONS}" in + "${SYSTEM_DEBIAN}") apt-get update ;; - RedHat) + "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}") yum makecache ;; esac @@ -203,13 +207,16 @@ function InstallationEnvironment() { exit fi echo -e "\n$COMPLETE 软件源${SYNC_TXT}结束\n" - case ${SYSTEM_FACTIONS} in - Debian) + case "${SYSTEM_FACTIONS}" in + "${SYSTEM_DEBIAN}") apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common ;; - RedHat) + "${SYSTEM_REDHAT}") yum install -y yum-utils device-mapper-persistent-data lvm2 ;; + "${SYSTEM_OPENEULER}") + dnf install -y dnf-utils device-mapper-persistent-data lvm2 + ;; esac } @@ -218,12 +225,12 @@ function InstallationEnvironment() { function RemoveOldVersion() { systemctl disable --now docker >/dev/null 2>&1 sleep 2s - case ${SYSTEM_FACTIONS} in - Debian) + case "${SYSTEM_FACTIONS}" in + "${SYSTEM_DEBIAN}") apt-get remove -y docker-ce docker-ce-cli containerd.io runc >/dev/null 2>&1 apt-get autoremove -y >/dev/null 2>&1 ;; - RedHat) + "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}") yum remove -y docker-ce docker-ce-cli containerd.io podman* runc >/dev/null 2>&1 yum autoremove -y >/dev/null 2>&1 ;; @@ -232,31 +239,27 @@ function RemoveOldVersion() { ## 配置 Docker CE 源 function ConfigureDockerCEMirror() { - if [[ ${DOCKER_VERSION_INSTALL_LATEST} == "True" ]]; then - SOURCE_JUDGMENT=${SOURCE} - else - SOURCE_JUDGMENT="download.docker.com" - fi - - case ${SYSTEM_FACTIONS} in - Debian) - if [ ${SYSTEM_JUDGMENT} = ${SYSTEM_KALI} ]; then - curl -fsSL https://${SOURCE_JUDGMENT}/linux/debian/gpg | apt-key add - >/dev/null 2>&1 + case "${SYSTEM_FACTIONS}" in + "${SYSTEM_DEBIAN}") + if [ "${SYSTEM_JUDGMENT}" = ${SYSTEM_KALI} ]; then + curl -fsSL https://${SOURCE}/linux/debian/gpg | apt-key add - >/dev/null 2>&1 else - curl -fsSL https://${SOURCE_JUDGMENT}/linux/${SOURCE_BRANCH}/gpg | apt-key add - >/dev/null 2>&1 + curl -fsSL https://${SOURCE}/linux/${SOURCE_BRANCH}/gpg | apt-key add - >/dev/null 2>&1 fi - echo "deb [arch=${SOURCE_ARCH}] https://${SOURCE_JUDGMENT}/linux/${SOURCE_BRANCH} ${SYSTEM_VERSION} stable" | tee $DockerSourceList >/dev/null 2>&1 - if [ ${SYSTEM_JUDGMENT} = ${SYSTEM_KALI} ]; then - sed -i "s/${SYSTEM_VERSION}/buster/g" $DockerSourceList - sed -i "s/${SOURCE_BRANCH}/debian/g" $DockerSourceList + echo "deb [arch=${SOURCE_ARCH}] https://${SOURCE}/linux/${SOURCE_BRANCH} ${SYSTEM_VERSION} stable" | tee $Dir_DebianExtendSource/docker.list >/dev/null 2>&1 + if [ "${SYSTEM_JUDGMENT}" = ${SYSTEM_KALI} ]; then + sed -i "s/${SYSTEM_VERSION}/buster/g" $Dir_DebianExtendSource/docker.list + sed -i "s/${SOURCE_BRANCH}/debian/g" $Dir_DebianExtendSource/docker.list fi - apt-get update >/dev/null 2>&1 + apt-get update ;; - RedHat) - yum-config-manager -y --add-repo https://${SOURCE_JUDGMENT}/linux/${SOURCE_BRANCH}/docker-ce.repo - yum makecache >/dev/null 2>&1 + "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}") + yum-config-manager -y --add-repo https://${SOURCE}/linux/${SOURCE_BRANCH}/docker-ce.repo + yum makecache + sed -i "s|download.docker.com|${SOURCE}|g" $Dir_RedHatRepos/docker-ce.repo ;; esac + [[ "${SYSTEM_FACTIONS}" == "${SYSTEM_OPENEULER}" ]] && sed -i "s|\$releasever|9|g" $Dir_RedHatRepos/docker-ce.repo } ## 安装 Docker Engine @@ -264,15 +267,15 @@ function DockerEngine() { ## 导出可安装的版本列表 function Export_VersionList() { - case ${SYSTEM_FACTIONS} in - Debian) - apt-cache madison docker-ce | awk '{print $3}' | grep -Eo "[0-9][0-9].[0-9][0-9].[0-9]{1,2}" >$DockerCEVersionFile - apt-cache madison docker-ce-cli | awk '{print $3}' | grep -Eo "[0-9][0-9].[0-9][0-9].[0-9]{1,2}" >$DockerCECLIVersionFile + case "${SYSTEM_FACTIONS}" in + "${SYSTEM_DEBIAN}") + apt-cache madison docker-ce | awk '{print $3}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" >$DockerCEVersionFile + apt-cache madison docker-ce-cli | awk '{print $3}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" >$DockerCECLIVersionFile grep -wf $DockerCEVersionFile $DockerCECLIVersionFile >$DockerVersionFile ;; - RedHat) - yum list docker-ce --showduplicates | sort -r | awk '{print $2}' | grep -Eo "[0-9][0-9].[0-9][0-9].[0-9]{1,2}" >$DockerCEVersionFile - yum list docker-ce-cli --showduplicates | sort -r | awk '{print $2}' | grep -Eo "[0-9][0-9].[0-9][0-9].[0-9]{1,2}" >$DockerCECLIVersionFile + "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}") + yum list docker-ce --showduplicates | sort -r | awk '{print $2}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" >$DockerCEVersionFile + yum list docker-ce-cli --showduplicates | sort -r | awk '{print $2}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" >$DockerCECLIVersionFile grep -wf $DockerCEVersionFile $DockerCECLIVersionFile >$DockerVersionFile ;; esac @@ -282,11 +285,11 @@ function DockerEngine() { ## 安装 function Install() { if [[ ${DOCKER_VERSION_INSTALL_LATEST} == "True" ]]; then - case ${SYSTEM_FACTIONS} in - Debian) + case "${SYSTEM_FACTIONS}" in + "${SYSTEM_DEBIAN}") apt-get install -y docker-ce docker-ce-cli containerd.io ;; - RedHat) + "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}") yum install -y docker-ce docker-ce-cli containerd.io ;; esac @@ -296,12 +299,12 @@ function DockerEngine() { cat $DockerVersionFile echo -e '\n注:以上可供选择的安装版本由官方源提供,若系统过新可能无法安装较旧的版本' while true; do - CHOICE_F=$(echo -e "\n${BOLD}└─ 请根据上面的列表,输入你想要安装的具体版本号:${PLAIN}\n") - read -p "${CHOICE_F}" DOCKER_VERSION + local CHOICE=$(echo -e "\n${BOLD}└─ 请根据上面的列表,选择并输入你想要安装的具体版本号:${PLAIN}\n") + read -p "${CHOICE}" DOCKER_VERSION echo '' cat $DockerVersionFile | grep -Ew "${DOCKER_VERSION}" >/dev/null 2>&1 if [ $? -eq 0 ]; then - echo ${DOCKER_VERSION} | grep -Ew '[1,2][0,8,9].[0,1][0-9].[0-9]{1,2}' >/dev/null 2>&1 + echo ${DOCKER_VERSION} | grep -Ew '[1,2][0-9].[0,1]{1,2}.[0-9]{1,2}' >/dev/null 2>&1 if [ $? -eq 0 ]; then rm -rf $DockerVersionFile break @@ -312,14 +315,11 @@ function DockerEngine() { echo -e "$ERROR 输入错误请重新输入!" fi done - case ${SYSTEM_FACTIONS} in - Debian) + case "${SYSTEM_FACTIONS}" in + "${SYSTEM_DEBIAN}") CheckVersion=$(echo ${DOCKER_VERSION} | cut -c1-2) CheckSubversion=$(echo ${DOCKER_VERSION} | cut -c4-5) case ${CheckVersion} in - 21 | 20 | 19) - INSTALL_JUDGMENT="5:" - ;; 18) if [ ${CheckSubversion} == "09" ]; then INSTALL_JUDGMENT="5:" @@ -328,12 +328,12 @@ function DockerEngine() { fi ;; *) - INSTALL_JUDGMENT="" + INSTALL_JUDGMENT="5:" ;; esac apt-get install -y docker-ce=${INSTALL_JUDGMENT}${DOCKER_VERSION}* docker-ce-cli=5:${DOCKER_VERSION}* containerd.io ;; - RedHat) + "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}") yum install -y docker-ce-${DOCKER_VERSION} docker-ce-cli-${DOCKER_VERSION} containerd.io ;; esac @@ -345,20 +345,21 @@ function DockerEngine() { if [[ ${REGISTRY_SOURCE_OFFICIAL} == "False" ]]; then if [ -d $DockerDir ] && [ -e $DockerConfig ]; then if [ -e $DockerConfigBackup ]; then - CHOICE_BACKUP=$(echo -e "\n${BOLD}└─ 检测到已备份的 Docker 配置文件,是否覆盖备份? [Y/n] ${PLAIN}") + local CHOICE_BACKUP=$(echo -e "\n${BOLD}└─ 检测到已备份的 Docker 配置文件,是否跳过覆盖备份? [Y/n] ${PLAIN}") read -p "${CHOICE_BACKUP}" INPUT [ -z ${INPUT} ] && INPUT=Y case $INPUT in - [Yy] | [Yy][Ee][Ss]) - cp -rf $DockerConfig $DockerConfigBackup >/dev/null 2>&1 + [Yy] | [Yy][Ee][Ss]) ;; + [Nn] | [Nn][Oo]) + echo '' + cp -rvf $DockerConfig $DockerConfigBackup 2>&1 ;; - [Nn] | [Nn][Oo]) ;; *) echo -e "\n$WARN 输入错误,默认不覆盖!" ;; esac else - cp -rf $DockerConfig $DockerConfigBackup >/dev/null 2>&1 + cp -rvf $DockerConfig $DockerConfigBackup 2>&1 echo -e "\n$COMPLETE 已备份原有 Docker 配置文件至 $DockerConfigBackup\n" fi sleep 2s @@ -373,17 +374,17 @@ function DockerEngine() { } ## 判定是否已安装 - case ${SYSTEM_FACTIONS} in - Debian) + case "${SYSTEM_FACTIONS}" in + "${SYSTEM_DEBIAN}") dpkg -l | grep docker-ce-cli -q ;; - RedHat) + "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}") rpm -qa | grep docker-ce-cli -q ;; esac if [ $? -eq 0 ]; then Export_VersionList - DOCKER_INSTALLED_VERSION=$(docker -v | grep -Eo "[0-9][0-9].[0-9][0-9].[0-9]{1,2}") + DOCKER_INSTALLED_VERSION=$(docker -v | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}") DOCKER_VERSION_LATEST=$(cat $DockerVersionFile | head -n 1) if [[ ${DOCKER_INSTALLED_VERSION} == ${DOCKER_VERSION_LATEST} ]]; then if [[ ${DOCKER_VERSION_INSTALL_LATEST} == "True" ]]; then @@ -394,25 +395,24 @@ function DockerEngine() { fi echo '' systemctl enable --now docker >/dev/null 2>&1 - DockerCompose ShowVersion AuthorSignature exit else - CHOICE_E=$(echo -e "\n${BOLD}└─ 检测到已安装最新版本的 Docker Engine,是否继续安装其它版本? [Y/n] ${PLAIN}") + local CHOICE=$(echo -e "\n${BOLD}└─ 检测到已安装最新版本的 Docker Engine,是否继续安装其它版本? [Y/n] ${PLAIN}") fi else if [[ ${DOCKER_VERSION_INSTALL_LATEST} == "True" ]]; then - CHOICE_E=$(echo -e "\n${BOLD}└─ 检测到已安装旧版本的 Docker Engine,是否覆盖安装为最新版本? [Y/n] ${PLAIN}") + local CHOICE=$(echo -e "\n${BOLD}└─ 检测到已安装旧版本的 Docker Engine,是否覆盖安装为最新版本? [Y/n] ${PLAIN}") else - CHOICE_E=$(echo -e "\n${BOLD}└─ 检测到已安装旧版本的 Docker Engine,是否继续安装其它版本? [Y/n] ${PLAIN}") + local CHOICE=$(echo -e "\n${BOLD}└─ 检测到已安装旧版本的 Docker Engine,是否继续安装其它版本? [Y/n] ${PLAIN}") fi fi - read -p "${CHOICE_E}" INPUT + read -p "${CHOICE}" INPUT [ -z ${INPUT} ] && INPUT=Y case $INPUT in [Yy] | [Yy][Ee][Ss]) - echo -en "\n${WORKING} 正在卸载之前的版本..." + echo -en "\n$WORKING 正在卸载之前的版本..." RemoveOldVersion echo -e "\n\n$COMPLETE 卸载完毕\n" Install @@ -432,55 +432,23 @@ function DockerEngine() { systemctl enable --now docker >/dev/null 2>&1 } -## 安装 Docker Compose -function DockerCompose() { - if [[ ${DOCKER_COMPOSE} == "True" ]]; then - [ -e $DockerCompose ] && rm -rf $DockerCompose - if [[ ${ARCH} == "x86_64" ]]; then - echo -e '' - if [ ${DOCKER_COMPOSE_DOWNLOAD_PROXY} == "True" ]; then - curl -L ${PROXY_URL}${DOCKER_COMPOSE_DOWNLOAD_URL} -o $DockerCompose - else - curl -L ${DOCKER_COMPOSE_DOWNLOAD_URL} -o $DockerCompose - fi - chmod +x $DockerCompose - else - echo -e "\n${WORKING} 由于本机非 x86 架构,开始通过 pip3 安装 Docker Compose ...\n" - if [ ${SYSTEM_FACTIONS} = ${SYSTEM_DEBIAN} ]; then - apt-get install -y python3-pip python3-dev gcc libffi-dev openssl >/dev/null 2>&1 - elif [ ${SYSTEM_FACTIONS} = ${SYSTEM_REDHAT} ]; then - yum install -y python3-pip python3-devel gcc libffi-devel openssl-devel >/dev/null 2>&1 - fi - pip3 install --upgrade pip - if [ ${DOCKER_COMPOSE_DOWNLOAD_PROXY} == "True" ]; then - pip3 install -i https://mirrors.aliyun.com/pypi/simple docker-compose - else - pip3 install docker-compose - fi - [ $? -ne 0 ] && echo -e "\n$ERROR Docker Compose 安装失败\n\n检测到当前处理器架构为 ${ARCH} ,无法绝对保证安装成功,自行查看 pip 报错原因" - fi - fi - echo -e '' -} - ## 查看版本并验证安装结果 function ShowVersion() { - echo -e "${WORKING} 验证安装版本...\n" + echo -e "\n$WORKING 验证安装版本...\n" docker -v VERIFICATION_DOCKER=$? - [[ ${DOCKER_COMPOSE} == "True" ]] && docker-compose -v if [ ${VERIFICATION_DOCKER} -eq 0 ]; then echo -e "\n$COMPLETE 安装完成" else echo -e "\n$ERROR 安装失败" - case ${SYSTEM_FACTIONS} in - Debian) - echo -e "\n检查源文件: cat $DockerSourceList" + case "${SYSTEM_FACTIONS}" in + "${SYSTEM_DEBIAN}") + echo -e "\n检查源文件:cat $Dir_DebianExtendSource/docker.list" echo -e '请尝试手动执行安装命令: apt-get install -y docker-ce docker-ce-cli containerd.io\n' echo '' ;; - RedHat) - echo -e "\n检查源文件: cat $DockerRepo" + "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}") + echo -e "\n检查源文件:cat $Dir_RedHatRepos/docker.repo" echo -e '请尝试手动执行安装命令: yum install -y docker-ce docker-ce-cli containerd.io\n' ;; esac @@ -501,91 +469,24 @@ function ShowVersion() { } function ChooseMirrors() { + + function WelcomeTitle() { + echo -e '+------------------------------------+' + echo -e '| |' + echo -e '| 欢迎使用 Docker 一键安装脚本 |' + echo -e '| |' + echo -e '+------------------------------------+' + echo -e '' + echo -e " 运行环境 ${BLUE}${SYSTEM_PRETTY_NAME:-"${SYSTEM_NAME} ${SYSTEM_VERSION_NUMBER}"} ${SYSTEM_ARCH}${PLAIN}" + echo -e " 系统时间 ${BLUE}$(date "+%Y-%m-%d %H:%M:%S") $(timedatectl status | grep "Time zone" | awk -F ':' '{print$2}' | awk -F ' ' '{print$1}')${PLAIN}" + echo -e '' + } clear - echo -e '+---------------------------------------------------+' - echo -e '| |' - echo -e '| ============================================= |' - echo -e '| |' - echo -e '| 欢迎使用 Docker 一键安装脚本 |' - echo -e '| |' - echo -e '| ============================================= |' - echo -e '| |' - echo -e '+---------------------------------------------------+' - echo -e '' - echo -e '#####################################################' - echo -e '' - echo -e ' 提供以下 Docker CE 和 Docker Hub 源可供选择:' - echo -e '' - echo -e '#####################################################' - echo -e '' - echo -e ' Docker CE' - echo -e '' - echo -e ' ❖ 阿里云 1)' - echo -e ' ❖ 腾讯云 2)' - echo -e ' ❖ 华为云 3)' - echo -e ' ❖ Azure 4)' - echo -e ' ❖ 网易 5)' - echo -e ' ❖ 清华大学 6)' - echo -e ' ❖ 中科大 7)' - echo -e ' ❖ 官方 8)' - echo -e '' - echo -e ' Docker Hub' - echo -e '' - echo -e ' ❖ 阿里云(北京) 1)' - echo -e ' ❖ 阿里云(杭州) 2)' - echo -e ' ❖ 阿里云(成都) 3)' - echo -e ' ❖ 阿里云(广州) 4)' - echo -e ' ❖ 阿里云(香港) 5)' - echo -e ' ❖ 腾讯云 6)' - echo -e ' ❖ 华为云 7)' - echo -e ' ❖ Azure 8)' - echo -e ' ❖ DaoCloud 9)' - echo -e ' ❖ 中科大 10)' - echo -e ' ❖ 谷歌云 11)' - echo -e ' ❖ 官方 12)' - echo -e '' - echo -e '#####################################################' - echo -e '' - echo -e " 运行环境 ${SYSTEM_NAME} ${SYSTEM_VERSION_NUMBER} ${SYSTEM_ARCH}" - echo -e " 系统时间 $(date "+%Y-%m-%d %H:%M:%S")" - echo -e '' - echo -e '#####################################################' - CHOICE_A=$(echo -e "\n${BOLD}└─ 请选择并输入你想使用的 Docker CE 源 [ 1~8 ]:${PLAIN}") - read -p "${CHOICE_A}" INPUT - case $INPUT in - 1) - SOURCE="mirrors.aliyun.com/docker-ce" - ;; - 2) - SOURCE="mirrors.tencent.com/docker-ce" - ;; - 3) - SOURCE="repo.huaweicloud.com/docker-ce" - ;; - 4) - SOURCE="mirror.azure.cn/docker-ce" - ;; - 5) - SOURCE="mirrors.163.com/docker-ce" - ;; - 6) - SOURCE="mirrors.tuna.tsinghua.edu.cn/docker-ce" - ;; - 7) - SOURCE="mirrors.ustc.edu.cn/docker-ce" - ;; - 8) - SOURCE="download.docker.com" - ;; - *) - SOURCE="mirrors.aliyun.com/docker-ce" - echo -e "\n$WARN 输入错误,默认使用阿里云!" - sleep 1s - ;; - esac + WelcomeTitle + ## 是否手动选择安装版本 - CHOICE_C=$(echo -e "\n ${BOLD}└─ 是否安装最新版本的 Docker Engine? [Y/n] ${PLAIN}") - read -p "${CHOICE_C}" INPUT + local CHOICE_A=$(echo -e "${BOLD}└─ 是否安装最新版本的 Docker Engine? [Y/n] ${PLAIN}") + read -p "${CHOICE_A}" INPUT [ -z ${INPUT} ] && INPUT=Y case $INPUT in [Yy] | [Yy][Ee][Ss]) @@ -593,17 +494,79 @@ function ChooseMirrors() { ;; [Nn] | [Nn][Oo]) DOCKER_VERSION_INSTALL_LATEST="False" - if [ ${SOURCE} != "download.docker.com" ]; then - echo -e "\n$WARN Docker CE 源已替换成官方源!" - fi + SOURCE="download.docker.com" ;; *) DOCKER_VERSION_INSTALL_LATEST="True" echo -e "\n$WARN 输入错误,默认安装最新版本!" ;; esac - CHOICE_B=$(echo -e "\n${BOLD}└─ 请选择并输入你想使用的 Docker Hub 源 [ 1~12 ]:${PLAIN}") - read -p "${CHOICE_B}" INPUT + if [ -z $SOURCE ]; then + echo -e '' + echo -e ' ❖ 阿里云 1)' + echo -e ' ❖ 腾讯云 2)' + echo -e ' ❖ 华为云 3)' + echo -e ' ❖ Azure 4)' + echo -e ' ❖ 网易 5)' + echo -e ' ❖ 清华大学 6)' + echo -e ' ❖ 南京大学 7)' + echo -e ' ❖ 中科大 8)' + echo -e ' ❖ 中科院 9)' + echo -e ' ❖ 官方 10)' + local CHOICE_B=$(echo -e "\n${BOLD}└─ 请选择并输入你想使用的 Docker CE 源 [ 1~8 ]:${PLAIN}") + read -p "${CHOICE_B}" INPUT + case $INPUT in + 1) + SOURCE="mirrors.aliyun.com/docker-ce" + ;; + 2) + SOURCE="mirrors.tencent.com/docker-ce" + ;; + 3) + SOURCE="repo.huaweicloud.com/docker-ce" + ;; + 4) + SOURCE="mirror.azure.cn/docker-ce" + ;; + 5) + SOURCE="mirrors.163.com/docker-ce" + ;; + 6) + SOURCE="mirrors.tuna.tsinghua.edu.cn/docker-ce" + ;; + 6) + SOURCE="mirrors.nju.edu.cn/docker-ce" + ;; + 8) + SOURCE="mirrors.ustc.edu.cn/docker-ce" + ;; + 9) + SOURCE="mirror.iscas.ac.cn/docker-ce" + ;; + 10) + SOURCE="download.docker.com" + ;; + *) + SOURCE="mirrors.aliyun.com/docker-ce" + echo -e "\n$WARN 输入错误,默认使用阿里云!" + sleep 1s + ;; + esac + fi + echo -e '' + echo -e ' ❖ 阿里云(北京) 1)' + echo -e ' ❖ 阿里云(杭州) 2)' + echo -e ' ❖ 阿里云(成都) 3)' + echo -e ' ❖ 阿里云(广州) 4)' + echo -e ' ❖ 阿里云(香港) 5)' + echo -e ' ❖ 腾讯云 6)' + echo -e ' ❖ Azure 7)' + echo -e ' ❖ DaoCloud 8)' + echo -e ' ❖ 中科大 9)' + echo -e ' ❖ 谷歌云 10)' + echo -e ' ❖ 官方 11)' + local CHOICE_C=$(echo -e "\n${BOLD}└─ 请选择并输入你想使用的 Docker Hub 源 [ 1~12 ]:${PLAIN}") + read -p "${CHOICE_C}" INPUT case $INPUT in 1) REGISTRY_SOURCE="registry.cn-beijing.aliyuncs.com" @@ -630,26 +593,22 @@ function ChooseMirrors() { REGISTRY_SOURCE_OFFICIAL="False" ;; 7) - REGISTRY_SOURCE="0bab0ef02500f24b0f31c00db79ffa00.mirror.swr.myhuaweicloud.com" - REGISTRY_SOURCE_OFFICIAL="False" - ;; - 8) REGISTRY_SOURCE="dockerhub.azk8s.com" REGISTRY_SOURCE_OFFICIAL="False" ;; - 9) + 8) REGISTRY_SOURCE="f1361db2.m.daocloud.io" REGISTRY_SOURCE_OFFICIAL="False" ;; - 10) + 9) REGISTRY_SOURCE="docker.mirrors.ustc.edu.cn" REGISTRY_SOURCE_OFFICIAL="False" ;; - 11) + 10) REGISTRY_SOURCE="gcr.io" REGISTRY_SOURCE_OFFICIAL="False" ;; - 12) + 11) REGISTRY_SOURCE="registry.docker-cn.com" REGISTRY_SOURCE_OFFICIAL="True" ;; @@ -660,43 +619,21 @@ function ChooseMirrors() { sleep 1s ;; esac - if [ -x $DockerCompose ]; then - CHOICE_D=$(echo -e "\n${BOLD}└─ 检测到已安装 Docker Compose ,是否覆盖安装? [Y/n] ${PLAIN}") - else - CHOICE_D=$(echo -e "\n${BOLD}└─ 是否安装 Docker Compose? [Y/n] ${PLAIN}") - fi - read -p "${CHOICE_D}" INPUT - [ -z ${INPUT} ] && INPUT=Y - case $INPUT in - [Yy] | [Yy][Ee][Ss]) - DOCKER_COMPOSE="True" - CHOICE_D1=$(echo -e "\n ${BOLD}└─ 是否使用国内代理进行下载? [Y/n] ${PLAIN}") - read -p "${CHOICE_D1}" INPUT - [ -z ${INPUT} ] && INPUT=Y - case $INPUT in - [Yy] | [Yy][Ee][Ss]) - DOCKER_COMPOSE_DOWNLOAD_PROXY="True" - ;; - [Nn] | [Nn][Oo]) - DOCKER_COMPOSE_DOWNLOAD_PROXY="False" - ;; - *) - DOCKER_COMPOSE_DOWNLOAD_PROXY="False" - echo -e "\n$WARN 输入错误,默认不使用!\n" - ;; - esac - ;; - [Nn] | [Nn][Oo]) - DOCKER_COMPOSE="False" - ;; - *) - DOCKER_COMPOSE="False" - echo -e "\n$WARN 输入错误,默认不安装!\n" - ;; - esac echo -e '' - [ ${SYSTEM_FACTIONS} == ${SYSTEM_REDHAT} ] && CloseFirewall + CloseFirewall +} + +## 组合函数 +function Combin_Function() { + PermissionJudgment + EnvJudgment + ChooseMirrors + InstallationEnvironment + ConfigureDockerCEMirror + DockerEngine + ShowVersion + AuthorSignature } Combin_Function diff --git a/README.md b/README.md index a1eee01..71202be 100644 --- a/README.md +++ b/README.md @@ -164,7 +164,7 @@ `Docker Hub` Docker Hub 镜像仓库,默认为官方提供的公共库,用于切换下载镜像时的来源仓库,又称镜像加速器 > __注意:__ - > 脚本集成安装 `Docker Engine` 与 `Docker Compose`,可手动选择安装版本和下载源,还可手动选择镜像加速器,支持国内外服务器环境和 `ARM`架构处理器环境使用。 + > 脚本集成安装 `Docker Engine`,可手动选择安装版本和下载源,还可手动选择镜像加速器,支持国内外服务器环境和 `ARM`架构处理器环境使用。 *** diff --git a/docs/README.md b/docs/README.md index e19a7d7..6c85be3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -161,7 +161,7 @@ bash <(curl -sSL https://gitee.com/SuperManito/LinuxMirrors/raw/main/ChangeMirro > `Docker CE` Docker Community Edition 镜像仓库,用于下载并安装 Docker 相关软件包。 > `Docker Hub` Docker Hub 镜像仓库,默认为官方提供的公共库,用于切换下载镜像时的来源仓库,又称镜像加速器。 - 脚本集成安装 `Docker Engine` 与 `Docker Compose`,可手动选择安装版本、下载源、镜像加速器,支持国内外服务器环境和 `ARM` 架构处理器环境使用 + 脚本集成安装 `Docker Engine`,可手动选择安装版本、下载源、镜像加速器,支持国内外服务器环境和 `ARM` 架构处理器环境使用 ***