centos7 系统初始化一键配置脚本

1、设置ip地址

[root@localhost ~]# [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens192
TYPE=Ethernet
NAME=ens192
DEVICE=ens192
ONBOOT=yes
IPADDR=192.168.1.232
PREFIX=24
GATEWAY=192.168.1.1
DNS1=8.8.8.8
[root@localhost ~]#

2、系统初始化脚本

#!/bin/bash

# 日志函数
log() {
    echo -e "\033[1;32m[$(date '+%Y-%m-%d %H:%M:%S')] $1\033[0m"
}

error() {
    echo -e "\033[1;31m[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1\033[0m" >&2
}

# 检查是否为root用户
check_root() {
    if [ "$(id -u)" -ne 0 ]; then
        error "请使用root用户运行此脚本"
        exit 1
    fi
    log "用户检查通过: 当前为root用户"
}

# 检查操作系统
check_os() {
    if [ -f /etc/redhat-release ]; then
        OS=$(cat /etc/redhat-release | awk '{print $1}')
        VERSION=$(cat /etc/redhat-release | awk '{print $4}' | cut -d. -f1)
        if [ "$OS" = "CentOS" ] && [ "$VERSION" = "7" ]; then
            log "操作系统检查通过: CentOS 7"
        else
            error "不支持的操作系统: 需要CentOS 7, 当前为 $OS $VERSION"
            exit 1
        fi
    else
        error "无法识别操作系统: 不是CentOS系统"
        exit 1
    fi
}

# 检查网络连接
check_network() {
    log "正在检查网络连接..."
    
    # 测试百度连通性
    ping -c 3 www.baidu.com > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        error "无法连接到百度,请检查网络配置"
        
        # 尝试测试Docker官方源
        log "尝试直接连接Docker官方源..."
        ping -c 3 download.docker.com > /dev/null 2>&1
        if [ $? -ne 0 ]; then
            error "无法连接到Docker官方源,请检查网络或防火墙设置"
            exit 1
        else
            log "可以连接到Docker官方源,继续安装..."
        fi
    else
        log "网络连接正常"
    fi
    
    # 测试HTTPS连接
    log "测试HTTPS连接..."
    curl -s https://www.baidu.com > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        error "HTTPS连接失败,可能是防火墙或代理设置问题"
        exit 1
    fi
    log "HTTPS连接正常"
}

# 检查磁盘空间
check_disk_space() {
    log "正在检查磁盘空间..."
    AVAILABLE_SPACE=$(df -BG / | awk 'NR==2 {print $4}' | tr -d 'G')
    if [ "$AVAILABLE_SPACE" -lt 2 ]; then
        error "磁盘空间不足: 需要至少2GB可用空间,当前只有 ${AVAILABLE_SPACE}GB"
        exit 1
    fi
    log "磁盘空间检查通过: 可用空间 ${AVAILABLE_SPACE}GB"
}

# 系统初始化操作
system_initialization() {
    log "开始系统初始化操作..."

    # 更换yum源为阿里云源
    log "更换yum源为阿里云源..."
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    if [ $? -ne 0 ]; then
        error "更换yum源失败"
        exit 1
    fi
    log "yum源更换为阿里云源成功"

    # 升级yum
    log "升级yum..."
    yum update -y yum > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        error "yum升级失败"
        exit 1
    fi
    log "yum升级完成"

    # 关闭防火墙
    log "关闭防火墙..."
    systemctl stop firewalld
    systemctl disable firewalld > /dev/null 2>&1
    log "防火墙已关闭并禁用开机自启"

    # 禁用SELinux
    log "禁用SELinux..."
    setenforce 0
    sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    log "SELinux已禁用"

    # 设置时区为Asia/Shanghai
    log "设置时区为Asia/Shanghai..."
    timedatectl set-timezone Asia/Shanghai
    log "时区已设置为Asia/Shanghai"

    # 安装vim
    log "安装vim..."
    yum install -y vim > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        error "vim安装失败"
        exit 1
    fi
    log "vim安装完成"

    # 安装python3
    log "安装python3..."
    yum install -y python3 python3-pip > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        error "python3安装失败"
        exit 1
    fi
    log "python3安装完成"

    log "系统初始化操作完成"
}

# 安装前清理
pre_install_cleanup() {
    log "执行安装前清理..."
    
    # 清理旧版本Docker
    yum remove -y docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
    
    # 清理Yum缓存
    log "清理Yum缓存..."
    yum clean all > /dev/null 2>&1
    rm -rf /var/cache/yum > /dev/null 2>&1
    log "安装前清理完成"
}


# 添加EPEL源(CentOS 7需要)
add_epel_repo() {
    log "添加EPEL源..."
    yum install -y epel-release > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        error "添加EPEL源失败"
        
        # 尝试备用方法
        log "尝试备用方法添加EPEL源..."
        curl -sSL https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -o epel-release.rpm
        rpm -ivh epel-release.rpm > /dev/null 2>&1
        rm -f epel-release.rpm
        
        if [ $? -ne 0 ]; then
            error "无法添加EPEL源,某些依赖可能无法安装"
        else
            log "EPEL源添加成功"
        fi
    else
        log "EPEL源添加成功"
    fi
}

# 添加Docker源
add_docker_repo() {
    log "添加Docker源..."
    
    # 清理可能的残留
    rm -f /etc/yum.repos.d/docker-ce.repo
    
    # 尝试使用阿里源
    log "尝试使用阿里源..."
    # yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo > /dev/null 2>&1
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo > /dev/null 2>&1
    
    if [ $? -ne 0 ]; then
        error "阿里源添加失败,尝试使用网易云镜像源..."
        
        # 使用网易云镜像源
        yum-config-manager --add-repo https://mirrors.163.com/.help/CentOS7-Base-163.repo > /dev/null 2>&1
        
        if [ $? -ne 0 ]; then
            error "网易云镜像源添加失败,尝试使用清华大学镜像源..."
            
            # 使用清华大学镜像源
            yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo > /dev/null 2>&1
            
            if [ $? -ne 0 ]; then
                error "所有镜像源添加失败,请检查网络连接"
                exit 1
            else
                log "清华大学镜像源添加成功"
            fi
        else
            log "阿里云镜像源添加成功"
        fi
    else
        log "Docker官方源添加成功"
    fi
    
    # 更新软件包缓存
    log "更新软件包缓存..."
    yum makecache fast > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        error "更新软件包缓存失败"
        exit 1
    fi
    log "软件包缓存更新完成"
}

# 验证镜像源
verify_repo() {
    log "验证镜像源可用性..."
    yum list docker-ce > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        error "镜像源不可用或配置错误"
        
        # 尝试重建缓存
        log "尝试重建Yum缓存..."
        yum clean all > /dev/null 2>&1
        rm -rf /var/cache/yum > /dev/null 2>&1
        yum makecache fast > /dev/null 2>&1
        
        # 再次验证
        yum list docker-ce > /dev/null 2>&1
        if [ $? -ne 0 ]; then
            error "重建缓存后镜像源仍然不可用"
            return 1
        fi
    fi
    log "镜像源验证通过"
    return 0
}

# 安装Docker
install_docker() {
    log "开始安装Docker..."
    
    # 更新系统
    log "更新系统软件包..."
    yum update -y > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        error "系统更新失败"
        exit 1
    fi
    log "系统更新完成"
    
    # 添加EPEL源
    add_epel_repo
    
    # 安装必要的依赖
    log "安装必要的依赖..."
    yum install -y yum-utils device-mapper-persistent-data lvm2 \
        curl wget tar openssl-devel > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        error "依赖安装失败"
        exit 1
    fi
    log "依赖安装完成"
    
    # 添加Docker源
    add_docker_repo
    
    # 验证镜像源
    verify_repo || exit 1
    
    # 锁定Docker版本为20.10.x(更适合CentOS 7)
    log "安装Docker CE 20.10.x版本..."
    yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io-1.6.23 > /dev/null 2>&1
    
    if [ $? -ne 0 ]; then
        error "Docker安装失败"
        
        # 收集更多错误信息
        log "收集详细错误信息..."
        yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io-1.6.23 2> docker_install_error.log
        
        # 尝试安装最新可用版本
        log "尝试安装最新可用版本..."
        yum install -y docker-ce docker-ce-cli containerd.io > /dev/null 2>&1
        
        if [ $? -ne 0 ]; then
            error "安装最新版本也失败,详细错误信息已保存到docker_install_error.log"
            exit 1
        else
            log "成功安装最新可用版本的Docker"
        fi
    else
        log "Docker 20.10.24安装完成"
    fi
    
    # 启动并启用Docker服务
    log "启动Docker服务..."
    systemctl start docker
    if [ $? -ne 0 ]; then
        error "启动Docker服务失败"
        exit 1
    fi
    systemctl enable docker > /dev/null 2>&1
    log "Docker服务已启动并设置为开机自启"
}

# 验证安装
verify_installation() {
    log "开始验证Docker安装..."
    
    # 检查Docker版本
    log "检查Docker版本..."
    DOCKER_VERSION=$(docker version --format '{{.Server.Version}}' 2>/dev/null)
    if [ -z "$DOCKER_VERSION" ]; then
        error "无法获取Docker版本,安装可能失败"
        
        # 检查服务状态
        log "检查Docker服务状态..."
        systemctl status docker > docker_service_status.log 2>&1
        error "Docker服务状态信息已保存到docker_service_status.log"
        
        exit 1
    fi
    log "Docker版本: $DOCKER_VERSION"
    
    # 检查Docker服务状态
    log "检查Docker服务状态..."
    SYSTEMCTL_STATUS=$(systemctl is-active docker)
    if [ "$SYSTEMCTL_STATUS" != "active" ]; then
        error "Docker服务未运行"
        exit 1
    fi
    log "Docker服务状态: 运行中"
    
    
    log "Docker安装验证通过!"
}

# 配置Docker
configure_docker() {
    log "配置Docker..."
    
    # 创建配置目录
    mkdir -p /etc/docker
    
    # 创建并写入配置文件
    cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": [
     "https://docker.m.daocloud.io",
     "https://docker.imgdb.de",
     "https://docker-0.unsee.tech",
     "https://docker.hlmirror.com",
     "https://docker.1ms.run",
     "https://func.ink",
     "https://lispy.org",
     "https://docker.xiaogenban1993.com"
    ],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
    
    # 重新加载并重启Docker
    systemctl daemon-reload
    systemctl restart docker
    
    log "Docker配置完成"
}

# 安装Docker Compose(仅使用阿里云镜像源)
install_docker_compose() {
    log "开始安装Docker Compose(仅使用阿里云镜像源)..."
    
    # 检查Python3和pip是否已安装(系统初始化阶段已安装,但增加二次校验)
    if ! command -v python3 &> /dev/null; then
        error "Python3未安装,请检查系统初始化步骤"
        exit 1
    fi
    if ! command -v pip3 &> /dev/null; then
        log "正在安装pip3..."
        yum install -y python3-pip > /dev/null 2>&1
        if [ $? -ne 0 ]; then
            error "pip3安装失败"
            exit 1
        fi
        log "pip3安装完成"
    fi
    
    # 升级pip并安装Docker Compose(固定使用阿里云源,无回退)
    log "升级pip并通过阿里云源安装Docker Compose..."
    pip3 install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/ > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        error "pip升级失败(阿里云源)"
        exit 1
    fi
    
    pip3 install docker-compose -i https://mirrors.aliyun.com/pypi/simple/ > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        error "Docker Compose安装失败(阿里云源)"
        # 保存详细错误日志
        pip3 install docker-compose -i https://mirrors.aliyun.com/pypi/simple/ 2> docker_compose_install_error.log
        error "详细错误已保存至 docker_compose_install_error.log"
        exit 1
    fi
    
    # 验证安装版本
    DOCKER_COMPOSE_VERSION=$(docker-compose --version | awk '{print $NF}')
    if [ -z "$DOCKER_COMPOSE_VERSION" ]; then
        error "Docker Compose安装后无法获取版本,可能安装失败"
        exit 1
    fi
    log "Docker Compose安装完成(版本: $DOCKER_COMPOSE_VERSION)"
}

# 验证Docker Compose安装
verify_docker_compose() {
    log "验证Docker Compose功能..."
    
    # 检查基本命令可用性
    log "测试'docker-compose --version'命令..."
    docker-compose --version > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        error "Docker Compose命令不可用"
        exit 1
    fi
    
    # 尝试简单运行(可选,需用户确认)
    read -p "是否创建测试Compose文件并验证?(y/n) [默认: n] " choice
    choice=${choice:-n}
    if [ "$choice" == "y" ]; then
        log "创建测试docker-compose.yml..."
        cat > docker-compose-test.yml << EOF
version: '3'
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
EOF
        log "启动测试服务..."
        docker-compose -f docker-compose-test.yml up -d > /dev/null 2>&1
        if [ $? -ne 0 ]; then
            error "Docker Compose运行测试服务失败"
            rm -f docker-compose-test.yml
            exit 1
        fi
        log "测试服务启动成功,端口80已暴露"
        log "正在清理测试环境..."
        docker-compose -f docker-compose-test.yml down > /dev/null 2>&1
        rm -f docker-compose-test.yml
        log "测试环境清理完成"
    else
        log "跳过功能测试,如需验证请手动运行'docker-compose --version'"
    fi
}


# 主函数
main() {
    log "========== 开始Docker安装脚本 =========="
    
    check_root
    check_os
    check_network
    check_disk_space
    system_initialization
    pre_install_cleanup
    install_docker
    verify_installation
    configure_docker
    install_docker_compose
    verify_docker_compose
    
    log "========== Docker安装完成 =========="
    log "版本: $DOCKER_VERSION"
    log "服务状态: 运行中"
    log "配置文件: /etc/docker/daemon.json"
    log "使用命令 'docker --help' 获取使用帮助"
}

# 执行主函数
main

 

 

posted @ 2025-05-15 17:34  QiuPing  阅读(46)  评论(0)    收藏  举报