Update Docker 加速
This commit is contained in:
352
Docker 加速
352
Docker 加速
@@ -1,7 +1,10 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Docker 加速器域名
|
# Docker私有仓库配置脚本
|
||||||
ACCELERATOR_DOMAIN="github.vps7k7k.xyz"
|
# 作者: 你的名称
|
||||||
|
# 描述: 配置Docker使用私有加速镜像仓库
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
# 颜色定义
|
# 颜色定义
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
@@ -10,194 +13,231 @@ YELLOW='\033[1;33m'
|
|||||||
BLUE='\033[0;34m'
|
BLUE='\033[0;34m'
|
||||||
NC='\033[0m' # No Color
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
echo -e "${BLUE}=== Docker 加速源一键更换脚本 ===${NC}"
|
# 仓库地址
|
||||||
echo -e "${YELLOW}加速器域名: ${ACCELERATOR_DOMAIN}${NC}"
|
REGISTRY_URL="github.vps7k7k.xyz"
|
||||||
echo
|
|
||||||
|
|
||||||
# 函数:显示当前Docker配置
|
# 打印彩色信息
|
||||||
show_current_config() {
|
print_info() {
|
||||||
echo -e "${GREEN}当前Docker配置:${NC}"
|
echo -e "${GREEN}[INFO]${NC} $1"
|
||||||
|
|
||||||
if [ -f /etc/docker/daemon.json ]; then
|
|
||||||
echo -e "${YELLOW}/etc/docker/daemon.json 内容:${NC}"
|
|
||||||
cat /etc/docker/daemon.json 2>/dev/null | python -m json.tool 2>/dev/null || cat /etc/docker/daemon.json
|
|
||||||
else
|
|
||||||
echo -e "${RED}/etc/docker/daemon.json 文件不存在${NC}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
if command -v docker &> /dev/null; then
|
|
||||||
echo -e "${YELLOW}Docker info 中的Registry mirrors:${NC}"
|
|
||||||
docker info 2>/dev/null | grep -A 10 "Registry Mirrors" || echo "无法获取或未设置镜像加速"
|
|
||||||
else
|
|
||||||
echo -e "${RED}Docker 未安装或未运行${NC}"
|
|
||||||
fi
|
|
||||||
echo
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# 函数:备份原有配置
|
print_warning() {
|
||||||
backup_config() {
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||||
local backup_file="/etc/docker/daemon.json.backup.$(date +%Y%m%d_%H%M%S)"
|
}
|
||||||
if [ -f /etc/docker/daemon.json ]; then
|
|
||||||
cp /etc/docker/daemon.json "$backup_file"
|
print_error() {
|
||||||
echo -e "${GREEN}已备份原配置到: $backup_file${NC}"
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_step() {
|
||||||
|
echo -e "${BLUE}[STEP]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 检查Docker是否安装
|
||||||
|
check_docker() {
|
||||||
|
if ! command -v docker &> /dev/null; then
|
||||||
|
print_error "Docker 未安装,请先安装Docker"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
print_info "Docker 已安装,版本: $(docker --version | cut -d' ' -f3 | cut -d',' -f1)"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 函数:设置加速源
|
# 交互式输入账号密码
|
||||||
setup_accelerator() {
|
get_credentials() {
|
||||||
local temp_file=$(mktemp)
|
print_step "请输入私有仓库的认证信息"
|
||||||
|
|
||||||
# 创建新的daemon.json配置
|
while true; do
|
||||||
cat > "$temp_file" << EOF
|
read -p "请输入用户名: " username
|
||||||
{
|
if [ -n "$username" ]; then
|
||||||
"registry-mirrors": [
|
break
|
||||||
"https://${ACCELERATOR_DOMAIN}"
|
else
|
||||||
],
|
print_error "用户名不能为空,请重新输入"
|
||||||
"dns": ["8.8.8.8", "114.114.114.114"]
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# 如果已有daemon.json,合并配置
|
|
||||||
if [ -f /etc/docker/daemon.json ]; then
|
|
||||||
echo -e "${YELLOW}检测到已有配置,进行合并...${NC}"
|
|
||||||
python3 - <<EOF 2>/dev/null || jq -s '.[0] * .[1]' /etc/docker/daemon.json "$temp_file" 2>/dev/null
|
|
||||||
import json
|
|
||||||
import sys
|
|
||||||
|
|
||||||
with open('/etc/docker/daemon.json', 'r') as f:
|
|
||||||
old_config = json.load(f)
|
|
||||||
|
|
||||||
with open('$temp_file', 'r') as f:
|
|
||||||
new_config = json.load(f)
|
|
||||||
|
|
||||||
# 合并配置,优先使用新配置的registry-mirrors
|
|
||||||
merged_config = {**old_config, **new_config}
|
|
||||||
merged_config['registry-mirrors'] = new_config['registry-mirrors']
|
|
||||||
|
|
||||||
print(json.dumps(merged_config, indent=2))
|
|
||||||
EOF
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
python3 - <<EOF > "$temp_file"
|
|
||||||
import json
|
|
||||||
import sys
|
|
||||||
|
|
||||||
with open('/etc/docker/daemon.json', 'r') as f:
|
|
||||||
old_config = json.load(f)
|
|
||||||
|
|
||||||
with open('$temp_file', 'r') as f:
|
|
||||||
new_config = json.load(f)
|
|
||||||
|
|
||||||
# 合并配置,优先使用新配置的registry-mirrors
|
|
||||||
merged_config = {**old_config, **new_config}
|
|
||||||
merged_config['registry-mirrors'] = new_config['registry-mirrors']
|
|
||||||
|
|
||||||
print(json.dumps(merged_config, indent=2))
|
|
||||||
EOF
|
|
||||||
fi
|
fi
|
||||||
fi
|
done
|
||||||
|
|
||||||
# 移动新配置到目标位置
|
while true; do
|
||||||
sudo mv "$temp_file" /etc/docker/daemon.json
|
read -s -p "请输入密码: " password
|
||||||
sudo chmod 600 /etc/docker/daemon.json
|
echo
|
||||||
|
if [ -n "$password" ]; then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
print_error "密码不能为空,请重新输入"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 确认密码
|
||||||
|
while true; do
|
||||||
|
read -s -p "请再次输入密码确认: " password_confirm
|
||||||
|
echo
|
||||||
|
if [ "$password" = "$password_confirm" ]; then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
print_error "两次输入的密码不一致,请重新输入"
|
||||||
|
fi
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
# 函数:重启Docker服务
|
# 测试登录
|
||||||
restart_docker() {
|
test_login() {
|
||||||
echo -e "${YELLOW}重启Docker服务...${NC}"
|
print_step "测试登录私有仓库..."
|
||||||
|
|
||||||
if command -v systemctl &> /dev/null; then
|
if echo "$password" | docker login $REGISTRY_URL -u "$username" --password-stdin; then
|
||||||
sudo systemctl daemon-reload
|
print_info "登录测试成功!"
|
||||||
sudo systemctl restart docker
|
|
||||||
elif command -v service &> /dev/null; then
|
|
||||||
sudo service docker restart
|
|
||||||
else
|
|
||||||
echo -e "${RED}无法确定如何重启Docker服务${NC}"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 等待Docker启动
|
|
||||||
sleep 3
|
|
||||||
|
|
||||||
if sudo docker ps &> /dev/null; then
|
|
||||||
echo -e "${GREEN}Docker 服务重启成功${NC}"
|
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
echo -e "${RED}Docker 服务重启失败${NC}"
|
print_error "登录测试失败,请检查账号密码和网络连接"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# 函数:验证加速器
|
# 配置Docker镜像源
|
||||||
verify_accelerator() {
|
configure_docker_mirror() {
|
||||||
echo -e "${YELLOW}验证加速器配置...${NC}"
|
print_step "配置Docker镜像源..."
|
||||||
|
|
||||||
if docker info 2>/dev/null | grep -q "${ACCELERATOR_DOMAIN}"; then
|
# 创建Docker配置目录
|
||||||
echo -e "${GREEN}✓ 加速器配置成功${NC}"
|
sudo mkdir -p /etc/docker
|
||||||
echo -e "${BLUE}加速器地址: https://${ACCELERATOR_DOMAIN}${NC}"
|
|
||||||
|
# 备份原有配置
|
||||||
|
if [ -f /etc/docker/daemon.json ]; then
|
||||||
|
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.backup.$(date +%Y%m%d%H%M%S)
|
||||||
|
print_info "已备份原有配置"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 创建新的配置
|
||||||
|
cat << EOF | sudo tee /etc/docker/daemon.json > /dev/null
|
||||||
|
{
|
||||||
|
"registry-mirrors": ["https://${REGISTRY_URL}"],
|
||||||
|
"insecure-registries": [],
|
||||||
|
"debug": true,
|
||||||
|
"experimental": false
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
print_info "Docker镜像源配置完成"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 重启Docker服务
|
||||||
|
restart_docker() {
|
||||||
|
print_step "重启Docker服务..."
|
||||||
|
|
||||||
|
if sudo systemctl restart docker; then
|
||||||
|
print_info "Docker服务重启成功"
|
||||||
else
|
else
|
||||||
echo -e "${RED}✗ 加速器配置可能未生效${NC}"
|
print_error "Docker服务重启失败"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 等待Docker服务完全启动
|
||||||
|
sleep 3
|
||||||
|
}
|
||||||
|
|
||||||
|
# 保存认证信息(可选)
|
||||||
|
save_credentials() {
|
||||||
|
print_step "是否保存认证信息?"
|
||||||
|
echo "如果保存,以后拉取镜像时不需要重复输入密码"
|
||||||
|
read -p "是否保存认证信息?(y/N): " save_choice
|
||||||
|
|
||||||
|
if [[ $save_choice =~ ^[Yy]$ ]]; then
|
||||||
|
# 使用Docker login保存认证信息
|
||||||
|
if echo "$password" | docker login $REGISTRY_URL -u "$username" --password-stdin; then
|
||||||
|
print_info "认证信息已保存到 ~/.docker/config.json"
|
||||||
|
else
|
||||||
|
print_warning "认证信息保存失败,但镜像源配置已完成"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
print_info "认证信息未保存,每次拉取私有镜像时需要重新登录"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# 函数:显示使用示例
|
# 验证配置
|
||||||
show_usage_examples() {
|
verify_configuration() {
|
||||||
echo -e "${GREEN}使用示例:${NC}"
|
print_step "验证配置..."
|
||||||
echo -e " ${YELLOW}Docker 官方镜像:${NC}"
|
|
||||||
echo -e " docker pull ${ACCELERATOR_DOMAIN}/nginx"
|
# 检查Docker配置
|
||||||
echo -e " ${YELLOW}Docker Hub 用户镜像:${NC}"
|
if sudo systemctl is-active --quiet docker; then
|
||||||
echo -e " docker pull ${ACCELERATOR_DOMAIN}/user/image"
|
print_info "Docker服务运行正常"
|
||||||
echo -e " ${YELLOW}GHCR 镜像:${NC}"
|
else
|
||||||
echo -e " docker pull ${ACCELERATOR_DOMAIN}/ghcr.io/user/image"
|
print_error "Docker服务未运行"
|
||||||
echo -e " ${YELLOW}Quay.io 镜像:${NC}"
|
exit 1
|
||||||
echo -e " docker pull ${ACCELERATOR_DOMAIN}/quay.io/org/image"
|
fi
|
||||||
echo -e " ${YELLOW}Kubernetes 镜像:${NC}"
|
|
||||||
echo -e " docker pull ${ACCELERATOR_DOMAIN}/registry.k8s.io/pause:3.8"
|
# 检查配置是否生效
|
||||||
|
if sudo docker info | grep -q "$REGISTRY_URL"; then
|
||||||
|
print_info "镜像源配置已生效"
|
||||||
|
else
|
||||||
|
print_warning "镜像源配置可能未生效,请手动检查"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 测试拉取镜像(可选)
|
||||||
|
print_step "是否测试拉取nginx镜像?"
|
||||||
|
read -p "进行测试?(y/N): " test_choice
|
||||||
|
|
||||||
|
if [[ $test_choice =~ ^[Yy]$ ]]; then
|
||||||
|
print_info "开始拉取测试镜像..."
|
||||||
|
if sudo docker pull ${REGISTRY_URL}/nginx; then
|
||||||
|
print_info "镜像拉取测试成功!"
|
||||||
|
else
|
||||||
|
print_warning "镜像拉取测试失败,请检查网络连接和认证信息"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示配置摘要
|
||||||
|
show_summary() {
|
||||||
echo
|
echo
|
||||||
echo -e "${BLUE}注意: 使用加速器时,需要在镜像前加上加速器域名${NC}"
|
print_info "=== 配置完成摘要 ==="
|
||||||
|
echo -e "${GREEN}✓${NC} Docker私有仓库配置完成"
|
||||||
|
echo -e "${GREEN}✓${NC} 镜像源: ${REGISTRY_URL}"
|
||||||
|
echo -e "${GREEN}✓${NC} 用户名: ${username}"
|
||||||
|
echo -e "${GREEN}✓${NC} Docker服务已重启生效"
|
||||||
|
|
||||||
|
if [[ $save_choice =~ ^[Yy]$ ]]; then
|
||||||
|
echo -e "${GREEN}✓${NC} 认证信息已保存,后续使用无需重复登录"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠${NC} 认证信息未保存,拉取私有镜像时需要重新登录"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
print_info "使用示例:"
|
||||||
|
echo " docker pull ${REGISTRY_URL}/镜像名称"
|
||||||
|
echo " docker pull ${REGISTRY_URL}/nginx"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 主函数
|
# 主函数
|
||||||
main() {
|
main() {
|
||||||
# 显示当前配置
|
clear
|
||||||
show_current_config
|
echo "=========================================="
|
||||||
|
echo " Docker私有仓库配置脚本"
|
||||||
# 确认操作
|
echo "=========================================="
|
||||||
read -p "是否继续设置加速源? (y/N): " confirm
|
|
||||||
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
|
|
||||||
echo -e "${YELLOW}已取消操作${NC}"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
echo
|
||||||
|
|
||||||
# 检查Docker是否安装
|
# 检查Docker
|
||||||
if ! command -v docker &> /dev/null; then
|
check_docker
|
||||||
echo -e "${RED}错误: Docker 未安装${NC}"
|
|
||||||
|
# 获取认证信息
|
||||||
|
get_credentials
|
||||||
|
|
||||||
|
# 测试登录
|
||||||
|
if ! test_login; then
|
||||||
|
print_error "配置中止,请解决登录问题后重新运行脚本"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 检查是否以root权限运行
|
# 配置镜像源
|
||||||
if [[ $EUID -eq 0 ]]; then
|
configure_docker_mirror
|
||||||
echo -e "${RED}警告: 不建议以root用户运行此脚本${NC}"
|
|
||||||
read -p "是否继续? (y/N): " root_confirm
|
|
||||||
if [[ ! "$root_confirm" =~ ^[Yy]$ ]]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 执行配置流程
|
# 重启Docker服务
|
||||||
backup_config
|
restart_docker
|
||||||
setup_accelerator
|
|
||||||
|
|
||||||
if restart_docker; then
|
# 保存认证信息
|
||||||
verify_accelerator
|
save_credentials
|
||||||
echo
|
|
||||||
show_usage_examples
|
# 验证配置
|
||||||
else
|
verify_configuration
|
||||||
echo -e "${RED}配置失败,请检查Docker服务状态${NC}"
|
|
||||||
fi
|
# 显示摘要
|
||||||
|
show_summary
|
||||||
}
|
}
|
||||||
|
|
||||||
# 运行主函数
|
# 运行主函数
|
||||||
main
|
main "$@"
|
||||||
|
|||||||
Reference in New Issue
Block a user