#!/bin/bash # Docker SOCKS5 代理配置脚本 # 用法: ./scripts/setup-docker-proxy.sh [SOCKS5地址] [用户名] [密码] set -e # 默认配置 SOCKS5_HOST=${1:-"127.0.0.1"} SOCKS5_PORT=${2:-"1080"} USERNAME=${3:-"admin"} PASSWORD=${4:-"secure123"} # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查操作系统 detect_os() { if [[ "$OSTYPE" == "darwin"* ]]; then echo "macos" elif [[ "$OSTYPE" == "linux-gnu"* ]]; then echo "linux" else echo "unknown" fi } # 配置Docker Desktop (macOS/Windows) configure_docker_desktop() { log_info "配置Docker Desktop代理设置..." # Docker Desktop配置文件路径 if [[ "$(detect_os)" == "macos" ]]; then DOCKER_CONFIG_DIR="$HOME/.docker" else DOCKER_CONFIG_DIR="$HOME/.docker" fi mkdir -p "$DOCKER_CONFIG_DIR" # 创建daemon.json配置 cat > "$DOCKER_CONFIG_DIR/daemon.json" << EOF { "proxies": { "default": { "httpProxy": "socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}", "httpsProxy": "socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}", "noProxy": "localhost,127.0.0.1,*.local" } }, "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ] } EOF log_success "Docker daemon.json 配置已创建: $DOCKER_CONFIG_DIR/daemon.json" } # 配置Docker客户端 configure_docker_client() { log_info "配置Docker客户端代理设置..." DOCKER_CONFIG_DIR="$HOME/.docker" mkdir -p "$DOCKER_CONFIG_DIR" # 创建config.json配置 cat > "$DOCKER_CONFIG_DIR/config.json" << EOF { "proxies": { "default": { "httpProxy": "socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}", "httpsProxy": "socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}", "noProxy": "localhost,127.0.0.1,*.local" } } } EOF log_success "Docker 客户端配置已创建: $DOCKER_CONFIG_DIR/config.json" } # 配置systemd服务 (Linux) configure_docker_systemd() { log_info "配置Docker systemd服务代理..." DOCKER_SERVICE_DIR="/etc/systemd/system/docker.service.d" if [[ ! -d "$DOCKER_SERVICE_DIR" ]]; then log_info "创建Docker服务目录: $DOCKER_SERVICE_DIR" sudo mkdir -p "$DOCKER_SERVICE_DIR" fi # 创建代理配置文件 sudo tee "$DOCKER_SERVICE_DIR/proxy.conf" > /dev/null << EOF [Service] Environment="HTTP_PROXY=socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}" Environment="HTTPS_PROXY=socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}" Environment="NO_PROXY=localhost,127.0.0.1,*.local" EOF log_success "Docker systemd 代理配置已创建" # 重新加载配置 log_info "重新加载systemd配置..." sudo systemctl daemon-reload sudo systemctl restart docker log_success "Docker服务已重启" } # 设置环境变量 setup_env_vars() { log_info "设置环境变量..." cat << EOF # 添加以下环境变量到您的 ~/.bashrc 或 ~/.zshrc: export HTTP_PROXY=socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT} export HTTPS_PROXY=socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT} export NO_PROXY=localhost,127.0.0.1,*.local # 或者临时设置 (当前shell有效): EOF echo "export HTTP_PROXY=socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}" echo "export HTTPS_PROXY=socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}" echo "export NO_PROXY=localhost,127.0.0.1,*.local" } # 测试连接 test_connection() { log_info "测试SOCKS5连接..." # 测试SOCKS5代理是否可用 if command -v curl &> /dev/null; then if curl --socks5 "${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}" \ --connect-timeout 10 \ -s https://registry-1.docker.io/v2/ > /dev/null; then log_success "SOCKS5代理连接测试成功" else log_error "SOCKS5代理连接测试失败" return 1 fi else log_warn "curl未安装,跳过连接测试" fi } # 显示帮助信息 show_help() { echo "Docker SOCKS5 代理配置脚本" echo "" echo "用法:" echo " $0 [SOCKS5地址] [端口] [用户名] [密码]" echo "" echo "参数:" echo " SOCKS5地址 SOCKS5服务器地址 (默认: 127.0.0.1)" echo " 端口 SOCKS5服务器端口 (默认: 1080)" echo " 用户名 认证用户名 (默认: admin)" echo " 密码 认证密码 (默认: secure123)" echo "" echo "示例:" echo " $0 # 使用默认配置" echo " $0 192.168.1.100 1080 user pass # 自定义配置" } # 主函数 main() { echo "==============================================" echo " Docker SOCKS5 代理配置脚本" echo "==============================================" echo "" if [[ "$1" == "-h" || "$1" == "--help" ]]; then show_help exit 0 fi log_info "SOCKS5服务器: ${SOCKS5_HOST}:${SOCKS5_PORT}" log_info "认证信息: ${USERNAME}:${PASSWORD}" echo "" # 测试连接 if ! test_connection; then log_error "请确保SOCKS5服务器正在运行并且配置正确" exit 1 fi # 检测操作系统并配置 OS=$(detect_os) case $OS in "macos") log_info "检测到macOS系统" configure_docker_desktop configure_docker_client ;; "linux") log_info "检测到Linux系统" configure_docker_client if systemctl is-active --quiet docker; then configure_docker_systemd else log_warn "Docker服务未运行,跳过systemd配置" fi ;; *) log_warn "未知操作系统,仅配置客户端" configure_docker_client ;; esac echo "" setup_env_vars echo "" log_success "Docker代理配置完成!" log_info "请重启Docker Desktop或执行 'sudo systemctl restart docker' 使配置生效" echo "" echo "测试命令:" echo " docker pull hello-world" echo " docker run hello-world" } # 运行主函数 main "$@"