代码拉取完成,页面将自动刷新
#!/bin/bash
# Docker自动化安装与配置脚本
# 版本: 3.0.0
# 功能: 自动检测系统环境,安装Docker,配置镜像加速源
# 支持系统: CentOS、RHEL、Rocky Linux、AlmaLinux、Ubuntu、Debian
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志文件
LOG_FILE="/var/log/docker-install.log"
# 镜像加速源列表
MIRROR_SOURCES=(
"https://docker.m.daocloud.io"
"https://dockerproxy.com"
"https://docker.mirrors.ustc.edu.cn"
"https://docker.nju.edu.cn"
"https://mirror.baidubce.com"
)
# 检查root权限
check_root() {
if [ "$(id -u)" != "0" ]; then
echo -e "${RED}错误: 请以root用户权限运行此脚本${NC}"
echo -e "${YELLOW}提示: 使用 sudo 命令执行,例如: sudo bash $0${NC}"
exit 1
fi
}
# 检测系统
detect_distro() {
echo -e "${BLUE}检测系统环境...${NC}"
if [ -f /etc/os-release ]; then
. /etc/os-release
DISTRO=$(echo $ID | tr '[:upper:]' '[:lower:]')
VERSION=$VERSION_ID
elif [ -f /etc/redhat-release ]; then
DISTRO="centos"
VERSION=$(grep -oE '[0-9]+\.[0-9]+' /etc/redhat-release | head -1)
else
DISTRO="unknown"
VERSION="unknown"
fi
echo -e "${BLUE}系统: ${DISTRO} ${VERSION}${NC}"
}
# 检测包管理器
detect_package_manager() {
echo -e "${BLUE}检测包管理器...${NC}"
if command -v dnf &> /dev/null; then
PKG_MGR="dnf"
elif command -v yum &> /dev/null; then
PKG_MGR="yum"
elif command -v apt-get &> /dev/null; then
PKG_MGR="apt-get"
else
echo -e "${RED}错误: 未找到支持的包管理器${NC}"
exit 1
fi
echo -e "${BLUE}包管理器: ${PKG_MGR}${NC}"
}
# 检测Docker是否已安装
detect_docker() {
echo -e "${BLUE}检测Docker环境...${NC}"
if command -v docker &> /dev/null; then
DOCKER_INSTALLED=true
DOCKER_VERSION=$(docker --version | awk '{print $3}' | sed 's/,//g')
echo -e "${GREEN}检测到已安装Docker,版本: ${DOCKER_VERSION}${NC}"
else
DOCKER_INSTALLED=false
echo -e "${YELLOW}未检测到Docker安装${NC}"
fi
}
# 检查网络连接
check_network() {
echo -e "${BLUE}检查网络连接...${NC}"
if ping -c 3 docker.io &> /dev/null; then
NETWORK_GOOD=true
echo -e "${GREEN}网络连接正常,可以访问Docker Hub${NC}"
else
NETWORK_GOOD=false
echo -e "${YELLOW}网络连接受限,将使用国内镜像源${NC}"
fi
}
# 移除旧版本Docker
remove_old_docker() {
echo -e "${BLUE}移除旧版本Docker...${NC}"
case $DISTRO in
ubuntu|debian)
apt-get remove -y docker docker-engine docker.io containerd runc 2>&1 | tee -a $LOG_FILE
;;
centos|rhel|rocky|alma)
$PKG_MGR remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 2>&1 | tee -a $LOG_FILE
;;
esac
echo -e "${GREEN}旧版本Docker已移除${NC}"
}
# 安装Docker
install_docker() {
echo -e "${BLUE}开始安装Docker...${NC}"
case $DISTRO in
centos|rhel|rocky|almalinux)
# 安装依赖
echo -e "${BLUE}1/4: 安装依赖包...${NC}"
$PKG_MGR install -y yum-utils device-mapper-persistent-data lvm2 2>&1 | tee -a $LOG_FILE
if [ $? -ne 0 ]; then
echo -e "${RED}错误: 安装依赖包失败${NC}"
echo -e "${YELLOW}建议: 检查网络连接或更换软件源${NC}"
exit 1
fi
# 添加阿里云Docker源
echo -e "${BLUE}2/4: 添加阿里云Docker源...${NC}"
if [ "$PKG_MGR" = "dnf" ]; then
dnf config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 2>&1 | tee -a $LOG_FILE
else
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 2>&1 | tee -a $LOG_FILE
fi
if [ $? -ne 0 ]; then
echo -e "${RED}错误: 添加Docker源失败${NC}"
exit 1
fi
# 安装Docker
echo -e "${BLUE}3/4: 安装Docker引擎...${NC}"
$PKG_MGR install -y docker-ce docker-ce-cli containerd.io 2>&1 | tee -a $LOG_FILE
if [ $? -ne 0 ]; then
echo -e "${RED}错误: 安装Docker引擎失败${NC}"
exit 1
fi
# 启动并启用Docker
echo -e "${BLUE}4/4: 启动Docker服务...${NC}"
systemctl start docker 2>&1 | tee -a $LOG_FILE
if [ $? -ne 0 ]; then
echo -e "${RED}错误: 启动Docker服务失败${NC}"
exit 1
fi
systemctl enable docker 2>&1 | tee -a $LOG_FILE
echo -e "${GREEN}Docker服务已启动并设置为开机自启${NC}"
;;
ubuntu|debian)
# 更新包列表
echo -e "${BLUE}1/5: 更新包列表...${NC}"
apt-get update 2>&1 | tee -a $LOG_FILE
if [ $? -ne 0 ]; then
echo -e "${RED}错误: 更新包列表失败${NC}"
exit 1
fi
# 安装依赖
echo -e "${BLUE}2/5: 安装依赖包...${NC}"
apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release 2>&1 | tee -a $LOG_FILE
if [ $? -ne 0 ]; then
echo -e "${RED}错误: 安装依赖包失败${NC}"
exit 1
fi
# 添加阿里云Docker源
echo -e "${BLUE}3/5: 添加阿里云Docker源...${NC}"
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/${DISTRO}/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg 2>&1 | tee -a $LOG_FILE
if [ $? -ne 0 ]; then
echo -e "${RED}错误: 添加GPG密钥失败${NC}"
exit 1
fi
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] http://mirrors.aliyun.com/docker-ce/linux/${DISTRO} $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# 更新包列表
echo -e "${BLUE}4/5: 更新Docker源...${NC}"
apt-get update 2>&1 | tee -a $LOG_FILE
if [ $? -ne 0 ]; then
echo -e "${RED}错误: 更新Docker源失败${NC}"
exit 1
fi
# 安装Docker
echo -e "${BLUE}5/5: 安装Docker引擎...${NC}"
apt-get install -y docker-ce docker-ce-cli containerd.io 2>&1 | tee -a $LOG_FILE
if [ $? -ne 0 ]; then
echo -e "${RED}错误: 安装Docker引擎失败${NC}"
exit 1
fi
# 启动并启用Docker
systemctl start docker 2>&1 | tee -a $LOG_FILE
systemctl enable docker 2>&1 | tee -a $LOG_FILE
echo -e "${GREEN}Docker服务已启动并设置为开机自启${NC}"
;;
*)
echo -e "${RED}错误: 不支持的系统${NC}"
exit 1
;;
esac
}
# 验证Docker安装
verify_docker_install() {
echo -e "${BLUE}验证Docker安装...${NC}"
if command -v docker &> /dev/null; then
DOCKER_VERSION=$(docker --version | awk '{print $3}' | sed 's/,//g')
echo -e "${GREEN}Docker安装成功!${NC}"
echo -e "${GREEN}Docker版本: ${DOCKER_VERSION}${NC}"
# 检查服务状态
if systemctl is-active --quiet docker; then
echo -e "${GREEN}Docker服务运行正常${NC}"
else
echo -e "${YELLOW}警告: Docker服务未运行${NC}"
systemctl start docker 2>&1 | tee -a $LOG_FILE
if [ $? -eq 0 ]; then
echo -e "${GREEN}Docker服务已启动${NC}"
else
echo -e "${RED}错误: 启动Docker服务失败${NC}"
exit 1
fi
fi
else
echo -e "${RED}错误: Docker安装失败${NC}"
exit 1
fi
}
# 配置镜像加速源
configure_mirror() {
echo -e "${BLUE}配置Docker镜像加速源...${NC}"
# 创建或修改daemon.json文件
mkdir -p /etc/docker
# 构建镜像加速源配置
MIRROR_CONFIG='{
"registry-mirrors": ['
for ((i=0; i<${#MIRROR_SOURCES[@]}; i++)); do
MIRROR_CONFIG+="\"${MIRROR_SOURCES[$i]}\""
if [ $i -lt $((${#MIRROR_SOURCES[@]} - 1)) ]; then
MIRROR_CONFIG+=","
fi
done
MIRROR_CONFIG+=']
}'
# 写入配置文件
echo "$MIRROR_CONFIG" > /etc/docker/daemon.json
echo -e "${GREEN}镜像加速源配置已写入 /etc/docker/daemon.json${NC}"
# 重启Docker服务使配置生效
echo -e "${BLUE}重启Docker服务以应用配置...${NC}"
systemctl restart docker 2>&1 | tee -a $LOG_FILE
if [ $? -ne 0 ]; then
echo -e "${RED}错误: 重启Docker服务失败${NC}"
exit 1
fi
# 验证配置
echo -e "${BLUE}验证镜像加速源配置...${NC}"
if docker info | grep -q "Registry Mirrors"; then
echo -e "${GREEN}镜像加速源配置成功!${NC}"
docker info | grep -A 5 "Registry Mirrors"
else
echo -e "${YELLOW}警告: 镜像加速源配置验证失败,请检查配置${NC}"
fi
}
# 测试Docker运行
test_docker_run() {
echo -e "${BLUE}测试Docker运行...${NC}"
if docker run --rm hello-world &> /dev/null; then
echo -e "${GREEN}Docker运行测试成功${NC}"
echo -e "${GREEN}您现在可以使用Docker运行容器了!${NC}"
else
echo -e "${YELLOW}警告: Docker运行测试失败,可能是网络问题${NC}"
echo -e "${YELLOW}建议: 检查网络连接或使用镜像加速源${NC}"
fi
}
# 显示使用说明
show_usage() {
echo -e "${BLUE}========================================${NC}"
echo -e "${GREEN}Docker安装与配置完成!${NC}"
echo -e "${BLUE}========================================${NC}"
echo -e "${GREEN}使用方法:${NC}"
echo -e " ${YELLOW}1. 运行容器: docker run [选项] 镜像${NC}"
echo -e " ${YELLOW}2. 查看容器: docker ps${NC}"
echo -e " ${YELLOW}3. 查看镜像: docker images${NC}"
echo -e " ${YELLOW}4. 查看日志: docker logs 容器ID${NC}"
echo -e " ${YELLOW}5. 停止容器: docker stop 容器ID${NC}"
echo -e " ${YELLOW}6. 删除容器: docker rm 容器ID${NC}"
echo -e "${BLUE}========================================${NC}"
echo -e "${GREEN}示例命令:${NC}"
echo -e " ${YELLOW}docker run -d -p 80:80 nginx${NC}"
echo -e " ${YELLOW}docker run -it ubuntu bash${NC}"
echo -e "${BLUE}========================================${NC}"
}
# 主函数
main() {
# 初始化日志文件
echo "Docker安装日志 - $(date)" > $LOG_FILE
echo "脚本版本: 3.0.0" >> $LOG_FILE
# 欢迎信息
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} Docker自动化安装与配置脚本${NC}"
echo -e "${BLUE} 版本: 3.0.0${NC}"
echo -e "${BLUE}========================================${NC}"
# 检查权限
check_root
# 检测系统
detect_distro
# 检测包管理器
detect_package_manager
# 检查网络连接
check_network
# 检测Docker
detect_docker
# Docker安装流程
if [ "$DOCKER_INSTALLED" = true ]; then
# 已安装Docker,提供选项
read -p "是否跳过安装,直接进行镜像加速源配置?[Y/n]: " SKIP_INSTALL
SKIP_INSTALL=${SKIP_INSTALL:-Y}
if [ "$SKIP_INSTALL" != "Y" ] && [ "$SKIP_INSTALL" != "y" ]; then
# 用户选择继续安装
read -p "检测到已安装Docker,是否先卸载旧版本?[Y/n]: " REMOVE_OLD
REMOVE_OLD=${REMOVE_OLD:-Y}
if [ "$REMOVE_OLD" = "Y" ] || [ "$REMOVE_OLD" = "y" ]; then
remove_old_docker
fi
install_docker
fi
else
# 未安装Docker,自动安装
install_docker
fi
# 验证安装
verify_docker_install
# 镜像加速源配置
read -p "是否配置Docker镜像加速源?[Y/n]: " CONFIGURE_MIRROR
CONFIGURE_MIRROR=${CONFIGURE_MIRROR:-Y}
if [ "$CONFIGURE_MIRROR" = "Y" ] || [ "$CONFIGURE_MIRROR" = "y" ]; then
configure_mirror
fi
# 测试Docker运行
test_docker_run
# 显示使用说明
show_usage
}
# 执行主函数
main
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。