[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 ~]#
#!/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