从 1panel 官方安装脚本中提取出来的 docker 一键安装脚本记录

从 1panel 官方安装脚本中提取出来的 docker 一键安装脚本记录

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
#!/bin/bash

# ==========================================
# 1Panel Docker & Compose 智能安装提取版
# 功能:智能测速安装 Docker + Compose 插件 + 镜像加速 + 命令兼容
# ==========================================

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 日志函数
function log() {
    timestamp=$(date +"%Y-%m-%d %H:%M:%S")
    echo -e "${BLUE}[安装器 ${timestamp}]: $1 ${NC}"
}

# 检查 Root 权限
if [[ $EUID -ne 0 ]]; then
    echo -e "${RED}错误:请使用 root 用户运行此脚本${NC}"
    exit 1
fi

# 预定义变量
ACCELERATOR_URLS='    "https://docker.1panel.live",
    "https://docker.1panel.dev",
    "https://docker.1ms.run"'
DAEMON_JSON="/etc/docker/daemon.json"
BACKUP_FILE="/etc/docker/daemon.json.bak"

# ----------------------------------------------------------------
# 函数:配置镜像加速 (Daemon.json)
# ----------------------------------------------------------------
function create_daemon_json() {
    log "正在创建 Docker 配置文件 ${DAEMON_JSON}..."
    mkdir -p /etc/docker
    cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
$ACCELERATOR_URLS
  ]
}
EOF
    log "镜像加速配置已添加。"
}

function configure_accelerator() {
    # 腾讯云环境检测
    if ping -c 1 mirror.ccs.tencentyun.com &>/dev/null; then
        ACCELERATOR_URLS='    "https://mirror.ccs.tencentyun.com"'
        log "检测到腾讯云环境,优先使用内网镜像源。"
    fi

    docker_needs_restart=false

    if [ -f "$DAEMON_JSON" ]; then
        log "检测到 daemon.json 已存在。"
        # 默认不覆盖,除非用户明确需要(此处简化逻辑,默认尝试追加或提示)
        # 为保持自动化体验,若存在则跳过,但在最后提示
        log "配置文件已存在,跳过覆盖以保护现有配置。"
    else
        create_daemon_json
        docker_needs_restart=true
    fi

    if [ "$docker_needs_restart" = true ]; then
        log "正在重启 Docker 服务..."
        systemctl daemon-reload && systemctl restart docker
        log "Docker 服务已重启。"
    fi
}

# ----------------------------------------------------------------
# 函数:配置 Docker Compose 兼容性
# ----------------------------------------------------------------
function Configure_Compose_Compatibility(){
    log "正在检查 Docker Compose..."

    # 1. 检查插件版 (docker compose) 是否可用
    if docker compose version >/dev/null 2>&1; then
        log "Docker Compose 插件 (V2) 已安装。"
        
        # 2. 检查是否有独立的 docker-compose 命令,如果没有,创建一个指向插件的脚本
        # 这样用户输入 'docker-compose' 时实际上是在运行 'docker compose'
        if ! command -v docker-compose >/dev/null 2>&1; then
            log "正在设置 'docker-compose' 命令别名以兼容旧习惯..."
            cat > /usr/local/bin/docker-compose <<EOF
#!/bin/bash
exec docker compose "\$@"
EOF
            chmod +x /usr/local/bin/docker-compose
            log "兼容性设置完成!你现在可以使用 'docker-compose' 命令了。"
        else
            log "'docker-compose' 命令已存在,跳过兼容设置。"
        fi
    else
        log "${RED}警告:Docker Compose 插件未能自动安装。${NC}"
        log "尝试通过包管理器补充安装..."
        
        if command -v apt-get >/dev/null 2>&1; then
            apt-get update && apt-get install -y docker-compose-plugin
        elif command -v yum >/dev/null 2>&1; then
            yum install -y docker-compose-plugin
        fi

        if docker compose version >/dev/null 2>&1; then
             log "Docker Compose 补装成功!"
             Configure_Compose_Compatibility # 递归调用一次以设置别名
        else
             log "${RED}严重错误:Docker Compose 安装失败,请检查网络或手动安装。${NC}"
        fi
    fi
}

# ----------------------------------------------------------------
# 函数:核心安装逻辑
# ----------------------------------------------------------------
function Install_Docker(){
    if which docker >/dev/null 2>&1; then
        log "Docker 已安装,跳过安装步骤。"
        configure_accelerator
        Configure_Compose_Compatibility
        return
    fi

    log "准备开始安装 Docker..."
    
    # 检测是否为中国大陆 IP
    is_cn=false
    if [[ $(curl -s --connect-timeout 5 ipinfo.io/country) == "CN" ]]; then
        is_cn=true
    fi

    if [ "$is_cn" = true ]; then
        log "检测到中国大陆环境,启动智能测速..."
        
        # 定义国内源
        sources=(
            "https://mirrors.aliyun.com/docker-ce"
            "https://mirrors.tencent.com/docker-ce"
            "https://mirrors.163.com/docker-ce"
            "https://mirrors.cernet.edu.cn/docker-ce"
        )

        docker_install_scripts=(
            "https://get.docker.com"
            "https://testingcf.jsdelivr.net/gh/docker/docker-install@master/install.sh"
            "https://raw.githubusercontent.com/docker/docker-install/master/install.sh"
        )

        # 测速函数
        get_average_delay() {
            local source=$1
            local total_delay=0
            local iterations=2
            local timeout=2
            for ((i = 0; i < iterations; i++)); do
                delay=$(curl -o /dev/null -s -m $timeout -w "%{time_total}\n" "$source")
                [ $? -ne 0 ] && delay=$timeout
                total_delay=$(awk "BEGIN {print $total_delay + $delay}")
            done
            awk "BEGIN {print $total_delay / $iterations}"
        }

        min_delay=99999999
        selected_source=""

        log "正在测试镜像源延迟..."
        for source in "${sources[@]}"; do
            average_delay=$(get_average_delay "$source" &)
            if (( $(awk 'BEGIN { print '"$average_delay"' < '"$min_delay"' }') )); then
                min_delay=$average_delay
                selected_source=$source
            fi
        done
        wait

        if [ -n "$selected_source" ]; then
            log "选中最快源: $selected_source (延迟: $min_delay 秒)"
            export DOWNLOAD_URL="$selected_source"
            
            # 下载并运行脚本
            for alt_source in "${docker_install_scripts[@]}"; do
                if curl -fsSL --retry 2 --retry-delay 3 --connect-timeout 5 --max-time 10 "$alt_source" -o get-docker.sh; then
                    log "安装脚本下载成功,开始执行安装..."
                    sh get-docker.sh
                    break
                fi
            done
        else
            log "测速失败,尝试直接安装..."
            curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
        fi
    else
        log "非中国大陆地区,使用官方源安装..."
        curl -fsSL https://get.docker.com | bash
    fi

    # 启动服务
    systemctl enable docker
    systemctl start docker

    # 配置加速和 Compose
    configure_accelerator
    Configure_Compose_Compatibility
}

# 执行
Install_Docker

# 最终验证
echo -e "\n${GREEN}=============================================${NC}"
echo -e "${GREEN}      安装完成!版本信息如下:      ${NC}"
echo -e "${GREEN}=============================================${NC}"
echo -e "${BLUE}Docker 版本:${NC}"
docker --version
echo -e "${BLUE}Compose 版本:${NC}"
docker compose version
echo -e "${GREEN}=============================================${NC}"
updatedupdated2026-01-102026-01-10