Update Docker 加速

This commit is contained in:
2025-10-31 13:24:16 +08:00
committed by GitHub
parent c8d32ae758
commit 6d83d52970

View File

@@ -1,8 +1,7 @@
#!/bin/bash #!/bin/bash
# Docker私有仓库配置脚本 # Docker镜像源配置脚本
# 作者: 你的名称 # 描述: 配置Docker使用不同的镜像源包括私有仓库、阿里云镜像和官方镜像
# 描述: 配置Docker使用私有加速镜像仓库
set -e set -e
@@ -11,10 +10,15 @@ RED='\033[0;31m'
GREEN='\033[0;32m' GREEN='\033[0;32m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
BLUE='\033[0;34m' BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color NC='\033[0m' # No Color
# 仓库地址 # 镜像源配置
REGISTRY_URL="github.vps7k7k.xyz" PRIVATE_REGISTRY="github.vps7k7k.xyz"
ALIYUN_MIRROR="https://registry.cn-hangzhou.aliyuncs.com"
DOCKER_HUB_MIRROR="https://hub-mirror.c.163.com"
OFFICIAL_REGISTRY="https://registry-1.docker.io"
# 打印彩色信息 # 打印彩色信息
print_info() { print_info() {
@@ -33,6 +37,14 @@ print_step() {
echo -e "${BLUE}[STEP]${NC} $1" echo -e "${BLUE}[STEP]${NC} $1"
} }
print_choice() {
echo -e "${PURPLE}[CHOICE]${NC} $1"
}
print_config() {
echo -e "${CYAN}[CONFIG]${NC} $1"
}
# 检查Docker是否安装 # 检查Docker是否安装
check_docker() { check_docker() {
if ! command -v docker &> /dev/null; then if ! command -v docker &> /dev/null; then
@@ -42,8 +54,79 @@ check_docker() {
print_info "Docker 已安装,版本: $(docker --version | cut -d' ' -f3 | cut -d',' -f1)" print_info "Docker 已安装,版本: $(docker --version | cut -d' ' -f3 | cut -d',' -f1)"
} }
# 交互式输入账号密码 # 显示镜像源选择菜单
get_credentials() { show_mirror_menu() {
echo
print_step "请选择要使用的Docker镜像源"
echo "=========================================="
print_choice "1. 私有仓库 (${PRIVATE_REGISTRY})"
echo " - 需要账号密码认证"
echo " - 访问速度最快"
echo " - 包含定制镜像"
print_choice "2. 阿里云镜像"
echo " - 国内访问速度快"
echo " - 无需认证"
echo " - 镜像同步及时"
print_choice "3. 网易云镜像"
echo " - 国内镜像源"
echo " - 无需认证"
echo " - 稳定性好"
print_choice "4. 官方Docker Hub"
echo " - 官方源,镜像最全"
echo " - 国外源,访问可能较慢"
print_choice "5. 多个镜像源(推荐)"
echo " - 同时配置多个镜像源"
echo " - Docker会自动选择最快的源"
echo "=========================================="
}
# 获取用户选择的镜像源
get_mirror_choice() {
while true; do
read -p "请输入选择 (1-5): " choice
case $choice in
1)
MIRROR_TYPE="private"
MIRROR_NAME="私有仓库"
MIRROR_URL="https://${PRIVATE_REGISTRY}"
break
;;
2)
MIRROR_TYPE="aliyun"
MIRROR_NAME="阿里云镜像"
MIRROR_URL=$ALIYUN_MIRROR
break
;;
3)
MIRROR_TYPE="netease"
MIRROR_NAME="网易云镜像"
MIRROR_URL=$DOCKER_HUB_MIRROR
break
;;
4)
MIRROR_TYPE="official"
MIRROR_NAME="官方Docker Hub"
MIRROR_URL=$OFFICIAL_REGISTRY
break
;;
5)
MIRROR_TYPE="multiple"
MIRROR_NAME="多个镜像源"
break
;;
*)
print_error "无效选择,请输入 1-5 的数字"
;;
esac
done
}
# 交互式输入私有仓库账号密码
get_private_credentials() {
if [ "$MIRROR_TYPE" != "private" ]; then
return 0
fi
print_step "请输入私有仓库的认证信息" print_step "请输入私有仓库的认证信息"
while true; do while true; do
@@ -77,22 +160,28 @@ get_credentials() {
done done
} }
# 测试登录 # 测试私有仓库登录
test_login() { test_private_login() {
if [ "$MIRROR_TYPE" != "private" ]; then
return 0
fi
print_step "测试登录私有仓库..." print_step "测试登录私有仓库..."
if echo "$password" | docker login $REGISTRY_URL -u "$username" --password-stdin; then if echo "$password" | docker login $PRIVATE_REGISTRY -u "$username" --password-stdin; then
print_info "登录测试成功!" print_info "私有仓库登录测试成功!"
return 0 return 0
else else
print_error "登录测试失败,请检查账号密码和网络连接" print_error "私有仓库登录测试失败,请检查账号密码和网络连接"
return 1 return 1
fi fi
} }
# 配置Docker镜像源 # 配置单个镜像源
configure_docker_mirror() { configure_single_mirror() {
print_step "配置Docker镜像源..." local mirror_url=$1
print_step "配置Docker镜像源: $MIRROR_NAME"
# 创建Docker配置目录 # 创建Docker配置目录
sudo mkdir -p /etc/docker sudo mkdir -p /etc/docker
@@ -104,16 +193,63 @@ configure_docker_mirror() {
fi fi
# 创建新的配置 # 创建新的配置
if [ "$MIRROR_TYPE" = "private" ]; then
cat << EOF | sudo tee /etc/docker/daemon.json > /dev/null
{
"registry-mirrors": ["$mirror_url"],
"insecure-registries": ["$PRIVATE_REGISTRY"],
"debug": false,
"experimental": false
}
EOF
else
cat << EOF | sudo tee /etc/docker/daemon.json > /dev/null
{
"registry-mirrors": ["$mirror_url"],
"insecure-registries": [],
"debug": false,
"experimental": false
}
EOF
fi
print_info "Docker镜像源配置完成"
}
# 配置多个镜像源
configure_multiple_mirrors() {
print_step "配置多个Docker镜像源"
# 创建Docker配置目录
sudo mkdir -p /etc/docker
# 备份原有配置
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 cat << EOF | sudo tee /etc/docker/daemon.json > /dev/null
{ {
"registry-mirrors": ["https://${REGISTRY_URL}"], "registry-mirrors": [
"insecure-registries": [], "$ALIYUN_MIRROR",
"debug": true, "$DOCKER_HUB_MIRROR",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.ccs.tencentyun.com"
],
"insecure-registries": ["$PRIVATE_REGISTRY"],
"debug": false,
"experimental": false "experimental": false
} }
EOF EOF
print_info "Docker镜像源配置完成" print_info "多个Docker镜像源配置完成"
print_info "已配置的镜像源:"
print_config " - 阿里云镜像"
print_config " - 网易云镜像"
print_config " - 中科大镜像"
print_config " - 腾讯云镜像"
} }
# 重启Docker服务 # 重启Docker服务
@@ -131,21 +267,25 @@ restart_docker() {
sleep 3 sleep 3
} }
# 保存认证信息(可选) # 保存私有仓库认证信息
save_credentials() { save_private_credentials() {
print_step "是否保存认证信息?" if [ "$MIRROR_TYPE" != "private" ]; then
echo "如果保存,以后拉取镜像时不需要重复输入密码" return 0
fi
print_step "是否保存私有仓库认证信息?"
echo "如果保存,以后拉取私有镜像时不需要重复输入密码"
read -p "是否保存认证信息?(y/N): " save_choice read -p "是否保存认证信息?(y/N): " save_choice
if [[ $save_choice =~ ^[Yy]$ ]]; then if [[ $save_choice =~ ^[Yy]$ ]]; then
# 使用Docker login保存认证信息 # 使用Docker login保存认证信息
if echo "$password" | docker login $REGISTRY_URL -u "$username" --password-stdin; then if echo "$password" | docker login $PRIVATE_REGISTRY -u "$username" --password-stdin; then
print_info "认证信息已保存到 ~/.docker/config.json" print_info "私有仓库认证信息已保存到 ~/.docker/config.json"
else else
print_warning "认证信息保存失败,但镜像源配置已完成" print_warning "私有仓库认证信息保存失败"
fi fi
else else
print_info "认证信息未保存,每次拉取私有镜像时需要重新登录" print_info "私有仓库认证信息未保存,拉取私有镜像时需要重新登录"
fi fi
} }
@@ -153,7 +293,7 @@ save_credentials() {
verify_configuration() { verify_configuration() {
print_step "验证配置..." print_step "验证配置..."
# 检查Docker配置 # 检查Docker服务状态
if sudo systemctl is-active --quiet docker; then if sudo systemctl is-active --quiet docker; then
print_info "Docker服务运行正常" print_info "Docker服务运行正常"
else else
@@ -162,22 +302,39 @@ verify_configuration() {
fi fi
# 检查配置是否生效 # 检查配置是否生效
if sudo docker info | grep -q "$REGISTRY_URL"; then if sudo docker info 2>/dev/null | grep -q "Registry Mirrors"; then
print_info "镜像源配置已生效" print_info "镜像源配置已生效"
echo
print_config "当前配置的镜像源:"
sudo docker info 2>/dev/null | grep -A 10 "Registry Mirrors"
else else
print_warning "镜像源配置可能未生效,请手动检查" print_warning "镜像源配置可能未生效,请手动检查"
fi fi
# 测试拉取镜像(可选) # 测试拉取镜像(可选)
print_step "是否测试拉取nginx镜像" if [ "$MIRROR_TYPE" = "private" ]; then
read -p "进行测试?(y/N): " test_choice print_step "是否测试拉取私有仓库的nginx镜像"
read -p "进行测试?(y/N): " test_choice
if [[ $test_choice =~ ^[Yy]$ ]]; then
print_info "开始拉取测试镜像..." if [[ $test_choice =~ ^[Yy]$ ]]; then
if sudo docker pull ${REGISTRY_URL}/nginx; then print_info "开始拉取测试镜像..."
print_info "镜像拉取测试成功!" if sudo docker pull ${PRIVATE_REGISTRY}/nginx; then
else print_info "私有仓库镜像拉取测试成功!"
print_warning "镜像拉取测试失败,请检查网络连接和认证信息" else
print_warning "私有仓库镜像拉取测试失败,请检查网络连接和认证信息"
fi
fi
else
print_step "是否测试拉取公共镜像?"
read -p "进行测试?(y/N): " test_choice
if [[ $test_choice =~ ^[Yy]$ ]]; then
print_info "开始拉取测试镜像..."
if sudo docker pull hello-world; then
print_info "公共镜像拉取测试成功!"
else
print_warning "公共镜像拉取测试失败,请检查网络连接"
fi
fi fi
fi fi
} }
@@ -186,51 +343,74 @@ verify_configuration() {
show_summary() { show_summary() {
echo echo
print_info "=== 配置完成摘要 ===" print_info "=== 配置完成摘要 ==="
echo -e "${GREEN}✓${NC} Docker私有仓库配置完成" echo -e "${GREEN}✓${NC} Docker镜像源配置完成"
echo -e "${GREEN}✓${NC} 镜像源: ${REGISTRY_URL}" echo -e "${GREEN}✓${NC} 镜像源类型: ${MIRROR_NAME}"
echo -e "${GREEN}✓${NC} 用户名: ${username}"
echo -e "${GREEN}✓${NC} Docker服务已重启生效"
if [[ $save_choice =~ ^[Yy]$ ]]; then if [ "$MIRROR_TYPE" = "private" ]; then
echo -e "${GREEN}✓${NC} 认证信息已保存,后续使用无需重复登录" echo -e "${GREEN}✓${NC} 私有仓库地址: ${PRIVATE_REGISTRY}"
echo -e "${GREEN}✓${NC} 用户名: ${username}"
if [[ $save_choice =~ ^[Yy]$ ]]; then
echo -e "${GREEN}✓${NC} 认证信息已保存,后续使用无需重复登录"
else
echo -e "${YELLOW}⚠${NC} 认证信息未保存,拉取私有镜像时需要重新登录"
fi
elif [ "$MIRROR_TYPE" = "multiple" ]; then
echo -e "${GREEN}✓${NC} 已配置多个镜像源"
echo -e "${GREEN}✓${NC} Docker会自动选择最快的镜像源"
else else
echo -e "${YELLOW}⚠${NC} 认证信息未保存,拉取私有镜像时需要重新登录" echo -e "${GREEN}✓${NC} 镜像源地址: ${MIRROR_URL}"
fi fi
echo -e "${GREEN}✓${NC} Docker服务已重启生效"
echo echo
print_info "使用示例:" print_info "使用说明:"
echo " docker pull ${REGISTRY_URL}/镜像名称" if [ "$MIRROR_TYPE" = "private" ]; then
echo " docker pull ${REGISTRY_URL}/nginx" echo " 私有镜像: docker pull ${PRIVATE_REGISTRY}/镜像名称"
echo " 公共镜像: docker pull 镜像名称"
else
echo " 拉取镜像: docker pull 镜像名称"
fi
} }
# 主函数 # 主函数
main() { main() {
clear clear
echo "==========================================" echo "=========================================="
echo " Docker私有仓库配置脚本" echo " Docker镜像源配置脚本"
echo "==========================================" echo "=========================================="
echo echo
# 检查Docker # 检查Docker
check_docker check_docker
# 获取认证信息 # 显示镜像源菜单
get_credentials show_mirror_menu
# 测试登录 # 获取用户选择
if ! test_login; then get_mirror_choice
print_error "配置中止,请解决登录问题后重新运行脚本"
exit 1 # 如果是私有仓库,获取认证信息
if [ "$MIRROR_TYPE" = "private" ]; then
get_private_credentials
if ! test_private_login; then
print_error "配置中止,请解决登录问题后重新运行脚本"
exit 1
fi
fi fi
# 配置镜像源 # 配置镜像源
configure_docker_mirror if [ "$MIRROR_TYPE" = "multiple" ]; then
configure_multiple_mirrors
else
configure_single_mirror "$MIRROR_URL"
fi
# 重启Docker服务 # 重启Docker服务
restart_docker restart_docker
# 保存认证信息 # 保存私有仓库认证信息
save_credentials save_private_credentials
# 验证配置 # 验证配置
verify_configuration verify_configuration