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