You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
6.5 KiB
248 lines
6.5 KiB
5 days ago
|
#!/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 "$@"
|