چگونه کانتینرهای Docker را از طریق پروکسیهای ProxyScrape مسیریابی کنیم
ترافیک کانتینر، دریافت ایمیجها و سرویسهای Compose را با استفاده از متغیرهای محیطی، تنظیمات پروکسی کلاینت و دیمن، و تنظیمات سطح برنامه، از طریق نقاط پایانی HTTP یا SOCKS5 ProxyScrape عبور دهید.
مرور کلی
کانتینرهای Docker از شل میزبان و تنظیمات پروکسی آن جدا هستند، بنابراین پروکسیای که در ترمینال شما کار میکند، بهطور خودکار درون docker run یا docker compose اعمال نمیشود. سه مکان عملی برای قرار دادن یک نقطه پایانی ProxyScrape وجود دارد: درون کانتینر بهصورت متغیرهای محیطی، در سطح کلاینت یا دیمن Docker تا دریافت و ساخت ایمیجها از پروکسی استفاده کنند، و در پیکربندی برنامه برای ابزارهایی که متغیرهای محیطی را نادیده میگیرند یا به SOCKS5 نیاز دارند.
ProxyScrape پروکسیهای مسکونی، دیتاسنتر و موبایل را از طریق http و socks5 ارائه میدهد، با صورتحساب پرداخت بهازای مصرف یا طرح ماهانه ثابت، بنابراین میتوانید استخر و مدل صورتحساب را با بار کاری که کانتینری میکنید تطبیق دهید. هاست، پورت و اعتبارنامههای نقطه پایانی در داشبورد ProxyScrape شما فهرست شدهاند.
این آموزش هر سه لایه را پوشش میدهد و نشان میدهد که چگونه تأیید کنید ترافیک کانتینر واقعاً از طریق پروکسی خارج میشود.
آنچه نیاز دارید
- Docker Engine نسخه 20.10 یا جدیدتر، یا Docker Desktop
- Docker Compose v2 (
docker compose) - یک اشتراک ProxyScrape بههمراه هاست، پورت، نام کاربری و رمز عبور از داشبورد شما
- دسترسی خروجی به پورت پروکسی در شبکه شما
انتخاب محل اعمال پروکسی
| لایه | اعمال میشود به | پروتکلها | یادداشتها |
|---|---|---|---|
| متغیرهای محیطی کانتینر | کلاینتهایی که HTTP_PROXY را میخوانند (curl، pip، apt، بسیاری از SDKها) |
http |
سریعترین راهاندازی؛ URLهای SOCKS5 توسط اکثر رانتایمها نادیده گرفته میشوند |
| پیکربندی کلاینت یا دیمن Docker | docker pull، docker build، docker push |
http |
تغییرات سطح دیمن نیاز به راهاندازی مجدد سرویس دارند |
| پیکربندی برنامه یا یک فورواردر | ابزارهایی با تنظیمات پروکسی خودشان، یا نیازهای فقط SOCKS5 | http، socks5 |
قابلاعتمادترین برای کلاینتهای غیراستاندارد |
با متغیرهای محیطی شروع کنید و تنها زمانی که ابزاری آنها را نادیده گرفت، از جدول پایین بروید.
مراحل
۱. اعتبارنامههای خود را بیرون از ایمیج ذخیره کنید
URL پروکسی را برای پروتکلی که قصد استفاده از آن را دارید بسازید:
http://<username>:<password>@<host>:<port>
socks5h://<username>:<password>@<host>:<port>
مقادیر را در فایلی نگه دارید که هرگز وارد بستر ساخت یا مخزن Git نشود.
mkdir -p ~/.config/proxyscrape
cat > ~/.config/proxyscrape/proxy.env <<'EOF'
PROXY_USER=your-username
PROXY_PASS=your-password
PROXY_HOST=proxy-host-from-dashboard
PROXY_PORT=proxy-port-from-dashboard
EOF
chmod 600 ~/.config/proxyscrape/proxy.env
اگر رمز عبور شامل @، :، / یا # است، آن کاراکترها را قبل از قرار دادن در URL بهصورت درصدی کدگذاری کنید.
۲. نقطه پایانی را از میزبان تأیید کنید
set -a; . ~/.config/proxyscrape/proxy.env; set +a
curl -sS -x \"http://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT\" https://api.ipify.org; echo
curl -sS -x \"socks5h://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT\" https://api.ipify.org; echo
از socks5h:// بهجای socks5:// استفاده کنید تا حل نام میزبان در پروکسی انجام شود، نه بهصورت محلی. اگر فقط یکی از دو دستور موفق شد، از آن پروتکل برای ادامه این راهاندازی استفاده کنید.
۳. پروکسی را به یک کانتینر واحد پاس دهید
docker run --rm \\\
-e HTTP_PROXY=\"http://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT\" \\\
-e HTTPS_PROXY=\"http://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT\" \\\
-e http_proxy=\"http://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT\" \\\
-e https_proxy=\"http://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT\" \\\
-e NO_PROXY=\"localhost,127.0.0.1,::1\" \\\
curlimages/curl:latest -sS https://api.ipify.org; echo
بسیاری از رانتایمها فقط نامهای حروف کوچک را میخوانند و برخی فقط نامهای حروف بزرگ را، بنابراین هر دو را تنظیم کنید. NO_PROXY ترافیک loopback و داخلی کانتینر را از پروکسی دور نگه میدارد.
۴. مدیریت پروکسی با Docker Compose
یک فایل .env در دایرکتوری پروژه Compose ایجاد کنید تا Compose بتواند مقادیر را درونیابی کند، و آن را به .gitignore اضافه کنید.
PROXY_USER=your-username
PROXY_PASS=your-password
PROXY_HOST=proxy-host-from-dashboard
PROXY_PORT=proxy-port-from-dashboard
services:
worker:
image: python:3.12-slim
environment:
HTTP_PROXY: \"http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}\"
HTTPS_PROXY: \"http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}\"
http_proxy: \"http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}\"
https_proxy: \"http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}\"
NO_PROXY: \"localhost,127.0.0.1,::1\"
command:
- python
- -c
- \"import urllib.request; print(urllib.request.urlopen('https://api.ipify.org').read().decode())\"
docker compose up --build
docker compose logs worker
توجه داشته باشید مقادیری که در یک env_file قرار میگیرند به کانتینر تزریق میشوند اما برای درونیابی ${...} استفاده نمیشوند. Compose آنها را از محیط شل یا فایل .env پروژه میخواند.
۵. مسیریابی دریافت و ساخت ایمیجها از طریق پروکسی
برای یک کاربر واحد، کلاینت Docker را طوری پیکربندی کنید که ساختها پروکسی را به ارث ببرند. این را بهعنوان ~/.docker/config.json ذخیره کنید:
{
\"proxies\": {
\"default\": {
\"httpProxy\": \"http://<username>:<password>@<host>:<port>\",
\"httpsProxy\": \"http://<username>:<password>@<host>:<port>\",
\"noProxy\": \"localhost,127.0.0.1\"
}
}
}
پیکربندی پروکسی کلاینت و دیمن Docker فقط از پروکسیهای HTTP پشتیبانی میکند، بنابراین در اینجا از یک نقطه پایانی http:// استفاده کنید حتی اگر درون کانتینرها از SOCKS5 استفاده میکنید.
روی میزبانهای Linux که خود دیمن باید به یک رجیستری دسترسی داشته باشد، بهجای آن یک drop-in systemd اضافه کنید:
# /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment=\"HTTP_PROXY=http://<username>:<password>@<host>:<port>\"
Environment=\"HTTPS_PROXY=http://<username>:<password>@<host>:<port>\"
Environment=\"NO_PROXY=localhost,127.0.0.1\"
sudo systemctl daemon-reload
sudo systemctl restart docker
docker info | grep -i proxy
۶. پیکربندی ابزارهایی که متغیرهای محیطی را نادیده میگیرند
چند مدیر بسته و رانتایم به تنظیمات صریح نیاز دارند.
apt درون یک ایمیج مبتنی بر Debian:
echo 'Acquire::http::Proxy \"http://<username>:<password>@<host>:<port>\";' \\\
> /etc/apt/apt.conf.d/95proxy
pip:
pip install --proxy \"http://<username>:<password>@<host>:<port>\" requests
برای ابزارهای فقط SOCKS5، proxychains-ng یک wrapper فراهم میکند که اتصالات را به زور از پروکسی عبور میدهد:
# /etc/proxychains4.conf (excerpt)
strict_chain
proxy_dns
[ProxyList]
socks5 <host> <port> <username> <password>
proxychains4 curl -sS https://api.ipify.org; echo
۷. تأیید خروجی و پایش مصرف
آدرسی را که کانتینر میبیند تأیید کنید، سپس آن را با آدرسی که بدون تنظیم هیچ متغیر پروکسی دریافت میکنید مقایسه کنید. اگر آن دو مطابقت داشتند، پروکسی استفاده نمیشود.
docker run --rm \\\
-e HTTPS_PROXY=\"http://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT\" \\\
curlimages/curl:latest -sS https://api.ipify.org; echo
نقاط پایانی چرخشی ممکن است در هر درخواست یک IP خروجی متفاوت از استخر برگردانند، که برای بارهای کاری اسکرپینگ و پایش مورد انتظار است. اگر طرح ProxyScrape شما گزینههای session یا sticky را ارائه میدهد، شناسه session را همانطور که در داشبورد توضیح داده شده به فیلد نام کاربری اضافه کنید، و مراقب مصرف در آنجا باشید زیرا حجم درخواست اندازهگیری میشود.
عیبیابی
407 Proxy Authentication Required
نام کاربری یا رمز عبور اشتباه است، یا رمز عبور شامل کاراکترهایی است که بهصورت درصدی کدگذاری نشدهاند. اعتبارنامهها را دوباره از داشبورد ProxyScrape کپی کنید و URL را بازسازی کنید.
میزبان کار میکند اما کانتینر شکست میخورد
- تأیید کنید که هر دو متغیر پروکسی حروف بزرگ و کوچک درون کانتینر تنظیم شدهاند.
- بررسی کنید که کانتینر میتواند نام میزبان پروکسی را حل کند:
docker run --rm curlimages/curl:latest -sS -I http://<host>. - در Docker Desktop، کانتینرها از طریق یک VM به اینترنت دسترسی دارند، بنابراین تأیید کنید که پورت پروکسی توسط فایروال میزبان مسدود نشده است.
- متغیرها را چاپ کنید تا مقادیر خالی را رد کنید:
docker run --rm --env-file ~/.config/proxyscrape/proxy.env alpine env | grep -i proxy.
اتصالات زمانشان به پایان میرسد
- پورت خروجی ممکن است توسط فایروال شرکتی یا VPN محلی مسدود شده باشد. ابتدا از میزبان تست کنید.
- نقاط پایانی HTTP و SOCKS5 معمولاً روی پورتهای مختلف گوش میدهند. از پورتی استفاده کنید که با پروتکل پیکربندیشده شما مطابقت دارد.
URLهای SOCKS5 نادیده گرفته میشوند
اکثر رانتایمها فقط متغیرهای محیطی پروکسی HTTP را پیادهسازی میکنند. بهجای تکیه بر ALL_PROXY، از یک تنظیم سطح برنامه مانند --proxy، یک wrapper proxychains-ng، یا آرگومان پروکسی خود کتابخانه استفاده کنید.
docker pull پس از پیکربندی دیمن همچنان شکست میخورد
docker info | grep -i proxy را اجرا کنید تا تأیید کنید دیمن متغیرها را برداشته است، و به یاد داشته باشید که ~/.docker/config.json فقط برای کاربر فعلی اعمال میشود. لیست noProxy خود را برای ورودیهایی که بهطور تصادفی نام میزبان رجیستری را پوشش میدهند بررسی کنید.
خطاهای TLS یا گواهی
مقاصد HTTPS نیاز دارند پروکسی از متد CONNECT پشتیبانی کند، که curl و کلاینت Docker بهطور خودکار از آن استفاده میکنند. اگر یک URL پروکسی HTTP پیکربندی کردهاید، تأیید کنید که پورت مقصد توسط نقطه پایانی ProxyScrape شما مجاز است.
خلاصه
- کانتینرها تنظیمات پروکسی میزبان را به ارث نمیبرند، بنابراین اعتبارنامهها را بهصراحت با
HTTP_PROXY،HTTPS_PROXYو معادلهای حروف کوچک آنها پاس دهید. - از
~/.docker/config.jsonیا یک drop-in systemd برای مسیریابی دریافت و ساخت ایمیجها استفاده کنید، و به یاد داشته باشید که پیکربندی پروکسی خود Docker فقط HTTP است. - برخی ابزارها مانند
apt،pipو کلاینتهای فقط SOCKS5 به پیکربندی خودشان یا یک wrapperproxychains-ngنیاز دارند. - همیشه IP خروجی را از درون کانتینر تأیید کنید و اعتبارنامهها را در فایلی نگه دارید که از کنترل نسخه حذف شده است.
- استخرهای مسکونی، دیتاسنتر و موبایل ProxyScrape از طریق
httpوsocks5، با صورتحساب پرداخت بهازای مصرف یا ماهانه ثابت، گزینههایی برای تطبیق با هر بار کاری کانتینری به شما میدهند.