从 1panel 官方安装脚本中提取出来的 docker 一键安装脚本记录
从 1panel 官方安装脚本中提取出来的 docker 一键安装脚本记录
1554
4 分钟
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}"
|