بازگشت به وبلاگ

تنظیم پروکسی در کانتینرهای داکر: راهنمای کامل با مثال‌های کد

بیاموزید چگونه پروکسی را در کانتینرهای داکر به درستی تنظیم کنید: از متغیرهای محیطی ساده تا سناریوهای پیشرفته با داکر کامپوز و شبکه‌های سفارشی.

📅۲۸ بهمن ۱۴۰۴
```html

کانتینرهای Docker اغلب به دسترسی به منابع خارجی از طریق پروکسی نیاز دارند — برای پارس کردن، تست از مناطق مختلف یا دور زدن محدودیت‌ها. تنظیم نادرست پروکسی منجر به خطاهای اتصال، نشت IP واقعی و اختلال در عملکرد برنامه‌ها می‌شود. در این مقاله به بررسی تمام روش‌های تنظیم پروکسی در Docker می‌پردازیم: از متغیرهای محیطی ساده تا سناریوهای پیشرفته با docker-compose و شبکه‌های سفارشی.

چرا به پروکسی در کانتینرهای Docker نیاز داریم

کانتینرهای Docker در سناریوهای مختلفی استفاده می‌شوند که در آن‌ها پروکسی به یک ضرورت تبدیل می‌شود. بیایید به بررسی وظایف اصلی که پروکسی در برنامه‌های کانتینری حل می‌کند، بپردازیم.

پارس کردن و جمع‌آوری داده‌ها: اگر شما پارسرهایی را در کانتینرهای Docker برای جمع‌آوری داده‌ها از بازارهای آنلاین (Wildberries، Ozon)، شبکه‌های اجتماعی یا موتورهای جستجو اجرا می‌کنید، پروکسی از مسدود شدن بر اساس IP محافظت می‌کند. کانتینرها امکان مقیاس‌پذیری پارس کردن را فراهم می‌کنند — می‌توانید 10-50 نمونه را به طور همزمان اجرا کنید، هر کدام با پروکسی خود.

تست از مناطق مختلف: هنگام توسعه برنامه‌های وب یا API های موبایل، اغلب نیاز به بررسی این است که سرویس از کشورهای مختلف چگونه کار می‌کند. کانتینرهای Docker با پروکسی‌های مختلف جغرافیایی امکان اتوماسیون چنین تست‌هایی را در CI/CD pipeline فراهم می‌کنند.

اتوماسیون و ربات‌ها: کانتینرهایی با Selenium، Puppeteer یا Playwright برای اتوماسیون مرورگرها به پروکسی برای کار با حساب‌های متعدد نیاز دارند. هر کانتینر پروکسی و محیط ایزوله خود را دریافت می‌کند.

دور زدن محدودیت‌های شرکتی: در برخی زیرساخت‌ها، کانتینرهای Docker باید از طریق پروکسی شرکتی برای دسترسی به اینترنت عبور کنند. بدون تنظیم صحیح، کانتینرها نمی‌توانند بسته‌ها را دانلود کنند یا به API های خارجی دسترسی پیدا کنند.

مهم: کانتینرهای Docker تنظیمات شبکه سیستم میزبان را به ارث می‌برند، اما پروکسی باید به طور صریح تنظیم شود. فقط وجود پروکسی در میزبان به این معنی نیست که کانتینرها به طور خودکار از آن استفاده می‌کنند.

تنظیم اولیه از طریق متغیرهای محیطی

ساده‌ترین راه برای تنظیم پروکسی در کانتینر Docker — انتقال متغیرهای محیطی هنگام راه‌اندازی است. این روش برای اکثر برنامه‌هایی که متغیرهای استاندارد HTTP_PROXY، HTTPS_PROXY و NO_PROXY را رعایت می‌کنند، کار می‌کند.

راه‌اندازی کانتینر با پروکسی از طریق docker run:

docker run -d \
  -e HTTP_PROXY="http://username:password@proxy.example.com:8080" \
  -e HTTPS_PROXY="http://username:password@proxy.example.com:8080" \
  -e NO_PROXY="localhost,127.0.0.1,.local" \
  your-image:latest

توضیح پارامترها:

  • HTTP_PROXY — پروکسی برای درخواست‌های HTTP
  • HTTPS_PROXY — پروکسی برای درخواست‌های HTTPS (از http:// استفاده کنید، نه https://)
  • NO_PROXY — لیست آدرس‌هایی که نباید از طریق پروکسی عبور کنند

نمونه‌ای با پروکسی SOCKS5:

docker run -d \
  -e HTTP_PROXY="socks5://username:password@proxy.example.com:1080" \
  -e HTTPS_PROXY="socks5://username:password@proxy.example.com:1080" \
  your-image:latest

خطای رایج: استفاده از https:// در URL پروکسی برای HTTPS_PROXY. باید از http:// یا socks5:// استفاده کنید، حتی برای ترافیک HTTPS. پروتکل در URL نوع سرور پروکسی را مشخص می‌کند، نه نوع ترافیک.

تنظیم پروکسی برای Docker daemon (بر روی تمام کانتینرها تأثیر می‌گذارد):

اگر نیاز دارید که تمام کانتینرها به طور پیش‌فرض از پروکسی استفاده کنند، Docker daemon را تنظیم کنید. یک فایل /etc/systemd/system/docker.service.d/http-proxy.conf ایجاد کنید:

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080"
Environment="HTTPS_PROXY=http://proxy.example.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,.local"

پس از تغییرات، Docker را مجدداً راه‌اندازی کنید:

sudo systemctl daemon-reload
sudo systemctl restart docker

تنظیم پروکسی در Dockerfile

هنگامی که شما یک تصویر Docker را جمع‌آوری می‌کنید که باید بسته‌ها را از طریق پروکسی دانلود کند (برای مثال، apt-get، pip، npm)، باید پروکسی را در مرحله ساخت تنظیم کنید. Docker از آرگومان‌های زمان ساخت برای این کار پشتیبانی می‌کند.

نمونه Dockerfile با پشتیبانی از پروکسی:

FROM python:3.11-slim

# آرگومان‌ها برای پروکسی (در زمان ساخت منتقل می‌شوند)
ARG HTTP_PROXY
ARG HTTPS_PROXY
ARG NO_PROXY

# تنظیم متغیرهای محیطی برای ساخت
ENV HTTP_PROXY=${HTTP_PROXY}
ENV HTTPS_PROXY=${HTTPS_PROXY}
ENV NO_PROXY=${NO_PROXY}

# نصب وابستگی‌ها از طریق پروکسی
RUN apt-get update && apt-get install -y curl

# نصب بسته‌های Python
COPY requirements.txt .
RUN pip install --proxy ${HTTP_PROXY} -r requirements.txt

# کپی کردن برنامه
COPY . /app
WORKDIR /app

# حذف متغیرهای پروکسی برای زمان اجرا (اختیاری)
ENV HTTP_PROXY=
ENV HTTPS_PROXY=

CMD ["python", "app.py"]

ساخت تصویر با انتقال پروکسی:

docker build \
  --build-arg HTTP_PROXY=http://proxy.example.com:8080 \
  --build-arg HTTPS_PROXY=http://proxy.example.com:8080 \
  --build-arg NO_PROXY=localhost,127.0.0.1 \
  -t my-app:latest .

برای برنامه‌های Node.js (npm از طریق پروکسی):

FROM node:18-alpine

ARG HTTP_PROXY
ARG HTTPS_PROXY

# تنظیم npm برای کار از طریق پروکسی
RUN npm config set proxy ${HTTP_PROXY}
RUN npm config set https-proxy ${HTTPS_PROXY}

COPY package*.json ./
RUN npm install

# پاک‌سازی تنظیمات پروکسی برای npm
RUN npm config delete proxy
RUN npm config delete https-proxy

COPY . .
CMD ["node", "server.js"]

نکته: اگر پروکسی فقط برای ساخت نیاز است و نه برای اجرای برنامه، متغیرهای محیطی را در انتهای Dockerfile پاک کنید. این کار از نشت تصادفی credentials در لاگ‌های کانتینر جلوگیری می‌کند.

پیکربندی پروکسی در docker-compose.yml

Docker Compose مدیریت پروکسی را برای برنامه‌های چند کانتینری ساده می‌کند. شما می‌توانید پروکسی را به صورت جهانی یا برای سرویس‌های خاص تنظیم کنید.

پیکربندی اولیه با پروکسی برای یک سرویس:

version: '3.8'

services:
  parser:
    image: python:3.11-slim
    environment:
      - HTTP_PROXY=http://username:password@proxy.example.com:8080
      - HTTPS_PROXY=http://username:password@proxy.example.com:8080
      - NO_PROXY=localhost,127.0.0.1,db
    volumes:
      - ./app:/app
    working_dir: /app
    command: python parser.py
    
  db:
    image: postgres:15
    # پایگاه داده از پروکسی استفاده نمی‌کند
    environment:
      - POSTGRES_PASSWORD=secret

استفاده از فایل .env برای ذخیره امن credentials:

یک فایل .env در دایرکتوری با docker-compose.yml ایجاد کنید:

PROXY_URL=http://username:password@proxy.example.com:8080
NO_PROXY=localhost,127.0.0.1

به متغیرها در docker-compose.yml ارجاع دهید:

version: '3.8'

services:
  parser:
    image: python:3.11-slim
    environment:
      - HTTP_PROXY=${PROXY_URL}
      - HTTPS_PROXY=${PROXY_URL}
      - NO_PROXY=${NO_PROXY}
    volumes:
      - ./app:/app
    working_dir: /app
    command: python parser.py

پیکربندی پروکسی برای ساخت تصویر در docker-compose:

version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        - HTTP_PROXY=${PROXY_URL}
        - HTTPS_PROXY=${PROXY_URL}
        - NO_PROXY=${NO_PROXY}
    environment:
      - HTTP_PROXY=${PROXY_URL}
      - HTTPS_PROXY=${PROXY_URL}
    ports:
      - "3000:3000"

مقیاس‌گذاری با پروکسی‌های مختلف برای هر نمونه:

اگر نیاز دارید چندین پارسر را اجرا کنید، هر کدام با پروکسی خود، از سرویس‌های جداگانه استفاده کنید:

version: '3.8'

services:
  parser-1:
    image: my-parser:latest
    environment:
      - PROXY_URL=http://user:pass@proxy1.example.com:8080
    volumes:
      - ./data:/data
    
  parser-2:
    image: my-parser:latest
    environment:
      - PROXY_URL=http://user:pass@proxy2.example.com:8080
    volumes:
      - ./data:/data
    
  parser-3:
    image: my-parser:latest
    environment:
      - PROXY_URL=http://user:pass@proxy3.example.com:8080
    volumes:
      - ./data:/data

تنظیم پروکسی در سطح برنامه

برخی برنامه‌ها از متغیرهای محیطی استاندارد HTTP_PROXY پشتیبانی نمی‌کنند. در چنین مواردی باید پروکسی را در کد برنامه یا فایل‌های پیکربندی تنظیم کنید.

Python (کتابخانه requests):

import os
import requests

# دریافت پروکسی از متغیر محیطی
proxy_url = os.getenv('PROXY_URL', 'http://proxy.example.com:8080')

proxies = {
    'http': proxy_url,
    'https': proxy_url
}

# استفاده از پروکسی در درخواست‌ها
response = requests.get('https://api.example.com/data', proxies=proxies)
print(response.json())

# برای پروکسی SOCKS5، pip install requests[socks] را نصب کنید
# proxies = {
#     'http': 'socks5://user:pass@proxy.example.com:1080',
#     'https': 'socks5://user:pass@proxy.example.com:1080'
# }

Python (aiohttp برای درخواست‌های غیر همزمان):

import os
import aiohttp
import asyncio

async def fetch_with_proxy():
    proxy_url = os.getenv('PROXY_URL')
    
    async with aiohttp.ClientSession() as session:
        async with session.get(
            'https://api.example.com/data',
            proxy=proxy_url
        ) as response:
            data = await response.json()
            print(data)

asyncio.run(fetch_with_proxy())

Node.js (کتابخانه axios):

const axios = require('axios');
const { HttpsProxyAgent } = require('https-proxy-agent');

const proxyUrl = process.env.PROXY_URL || 'http://proxy.example.com:8080';
const agent = new HttpsProxyAgent(proxyUrl);

axios.get('https://api.example.com/data', {
  httpsAgent: agent
})
.then(response => {
  console.log(response.data);
})
.catch(error => {
  console.error('Error:', error.message);
});

Node.js (ماژول https داخلی):

const https = require('https');
const { HttpsProxyAgent } = require('https-proxy-agent');

const proxyUrl = process.env.PROXY_URL;
const agent = new HttpsProxyAgent(proxyUrl);

const options = {
  hostname: 'api.example.com',
  port: 443,
  path: '/data',
  method: 'GET',
  agent: agent
};

const req = https.request(options, (res) => {
  let data = '';
  res.on('data', (chunk) => data += chunk);
  res.on('end', () => console.log(JSON.parse(data)));
});

req.on('error', (error) => console.error(error));
req.end();

Selenium با پروکسی در کانتینر Docker:

from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
import os

proxy_url = os.getenv('PROXY_URL', 'proxy.example.com:8080')

# تنظیم پروکسی برای Chrome
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument(f'--proxy-server={proxy_url}')

# برای احراز هویت از افزونه یا تونل SSH استفاده کنید
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://example.com')
print(driver.title)
driver.quit()

Puppeteer با پروکسی:

const puppeteer = require('puppeteer');

(async () => {
  const proxyUrl = process.env.PROXY_URL || 'proxy.example.com:8080';
  
  const browser = await puppeteer.launch({
    args: [`--proxy-server=${proxyUrl}`],
    headless: true
  });
  
  const page = await browser.newPage();
  
  // احراز هویت برای پروکسی
  await page.authenticate({
    username: 'your-username',
    password: 'your-password'
  });
  
  await page.goto('https://example.com');
  console.log(await page.title());
  
  await browser.close();
})();

کدام نوع پروکسی را برای Docker انتخاب کنیم

انتخاب نوع پروکسی بستگی به وظیفه‌ای دارد که برنامه شما در کانتینر Docker حل می‌کند. بیایید به بررسی سناریوهای اصلی و توصیه‌ها بپردازیم.

نوع پروکسی کی استفاده کنیم مزایا معایب
مرکز داده پارس کردن، درخواست‌های API، تست سرعت بالا، قیمت پایین، ثبات به راحتی شناسایی می‌شوند، در سایت‌های محافظت‌شده مسدود می‌شوند
مسکونی کار با شبکه‌های اجتماعی، بازارهای آنلاین، سایت‌های پیچیده IP واقعی، ریسک پایین مسدود شدن، جغرافیای وسیع گران‌تر، کندتر از مرکز داده، ترافیک محدود
موبایل تست API های موبایل، دور زدن مسدودیت‌های سخت حداکثر ناشناسی، IP اپراتورهای موبایل قیمت بالا، جغرافیای محدود

توصیه‌ها برای انتخاب برای وظایف خاص:

پارس کردن بازارهای آنلاین و کاتالوگ‌های محصولات: اگر شما Wildberries، Ozon یا دیگر بازارهای آنلاین را از طریق کانتینرهای Docker پارس می‌کنید، از پروکسی‌های مسکونی استفاده کنید. این پلتفرم‌ها به طور فعال IP های مرکز داده را مسدود می‌کنند. پروکسی‌ها را هر 5-10 دقیقه بچرخانید تا شبیه‌سازی کاربران مختلف انجام شود.

تست API و توسعه: برای تست API های خود یا ادغام با سرویس‌های خارجی، پروکسی‌های مرکز داده مناسب هستند. آن‌ها سرعت و ثبات بالایی را برای تست‌های خودکار در CI/CD فراهم می‌کنند.

اتوماسیون Selenium/Puppeteer: هنگام اجرای اتوماسیون مرورگر در کانتینرها برای کار با سایت‌های محافظت‌شده (شبکه‌های اجتماعی، بانک‌ها، برنامه‌های وب پیچیده) از پروکسی‌های مسکونی استفاده کنید. این کار احتمال CAPTCHA و مسدود شدن را کاهش می‌دهد.

تست جغرافیایی توزیع‌شده: اگر نیاز دارید دسترسی به سرویس را از کشورهای مختلف بررسی کنید، از پروکسی‌های مسکونی با انتخاب جغرافیای خاص استفاده کنید. چندین کانتینر Docker را راه‌اندازی کنید، هر کدام با پروکسی کشور خود.

نکته‌ای برای مقیاس‌گذاری: هنگام راه‌اندازی 10+ کانتینر با پروکسی، از یک استخر پروکسی با چرخش خودکار استفاده کنید. این کار مدیریت را ساده می‌کند و از استفاده مجدد یک IP توسط کانتینرهای مختلف جلوگیری می‌کند.

حل مشکلات رایج

هنگام کار با پروکسی در کانتینرهای Docker، مشکلات رایجی پیش می‌آید. بیایید به بررسی رایج‌ترین آن‌ها و راه‌حل‌هایشان بپردازیم.

مشکل 1: کانتینر نمی‌تواند به پروکسی متصل شود

علائم: خطاهای "Connection refused"، "Proxy connection failed"، زمان‌های تایم‌اوت هنگام راه‌اندازی کانتینر.

راه‌حل‌ها:

  • دسترس‌پذیری پروکسی را از میزبان بررسی کنید: curl -x http://proxy:port https://example.com
  • اطمینان حاصل کنید که سرور پروکسی از شبکه Docker قابل دسترسی است. اگر پروکسی در localhost میزبان است، از host.docker.internal (Mac/Windows) یا IP میزبان در شبکه bridge استفاده کنید
  • قوانین firewall را بررسی کنید — کانتینرهای Docker ممکن است برای اتصالات خروجی مسدود شده باشند
  • برای پروکسی‌های با احراز هویت، صحت username و password را بررسی کنید و کاراکترهای خاص را در URL فرار دهید

نمونه‌ای از دسترسی به پروکسی در میزبان:

# Mac/Windows
docker run -e HTTP_PROXY=http://host.docker.internal:8080 my-image

# Linux (IP میزبان را در شبکه bridge پیدا کنید)
ip addr show docker0  # معمولاً 172.17.0.1
docker run -e HTTP_PROXY=http://172.17.0.1:8080 my-image

مشکل 2: DNS از طریق پروکسی حل نمی‌شود

علائم: خطاهای "Could not resolve host"، درخواست‌های DNS از طریق پروکسی عبور نمی‌کنند.

راه‌حل‌ها:

  • از پروکسی SOCKS5 به جای HTTP استفاده کنید — SOCKS5 درخواست‌های DNS را پروکسی می‌کند
  • DNS را در Docker تنظیم کنید: --dns 8.8.8.8 را هنگام راه‌اندازی کانتینر اضافه کنید
  • برای برنامه‌هایی که از DNS از طریق پروکسی پشتیبانی نمی‌کنند، از proxychains درون کانتینر استفاده کنید
# Dockerfile با proxychains
FROM python:3.11-slim

RUN apt-get update && apt-get install -y proxychains4

# پیکربندی proxychains
RUN echo "strict_chain\nproxy_dns\n[ProxyList]\nsocks5 proxy.example.com 1080" > /etc/proxychains4.conf

# اجرای برنامه از طریق proxychains
CMD ["proxychains4", "python", "app.py"]

مشکل 3: نشت IP واقعی کانتینر

علائم: سرویس هدف IP میزبان یا کانتینر را به جای IP پروکسی می‌بیند.

راه‌حل‌ها:

  • بررسی کنید که آیا برنامه واقعاً از پروکسی استفاده می‌کند — یک درخواست به https://api.ipify.org ارسال کنید
  • اطمینان حاصل کنید که تمام کلاینت‌های HTTP در کد برای استفاده از پروکسی تنظیم شده‌اند
  • برای اتصالات WebRTC و WebSocket، پروکسی ممکن است کار نکند — WebRTC را در مرورگرها غیرفعال کنید
  • هدرهای درخواست را بررسی کنید — برخی کتابخانه‌ها X-Forwarded-For را با IP واقعی اضافه می‌کنند

تست نشت IP در کانتینر:

# بدون پروکسی
docker run --rm curlimages/curl:latest curl https://api.ipify.org

# با پروکسی
docker run --rm \
  -e HTTPS_PROXY=http://proxy.example.com:8080 \
  curlimages/curl:latest curl https://api.ipify.org

مشکل 4: کارکرد کند از طریق پروکسی

علائم: تأخیرهای بالا، زمان‌های تایم‌اوت، بارگذاری کند داده‌ها.

راه‌حل‌ها:

  • سرعت پروکسی را به طور مستقیم از میزبان بررسی کنید — ممکن است مشکل در خود پروکسی باشد
  • زمان‌های تایم‌اوت را در برنامه برای کار با پروکسی‌های کند افزایش دهید
  • از اتصالات keep-alive برای استفاده مجدد از اتصالات TCP استفاده کنید
  • برای پروکسی‌های مسکونی، سرعت کند طبیعی است — تعداد درخواست‌ها را بهینه کنید
  • استخر اتصالات را در کلاینت‌های HTTP برای درخواست‌های موازی تنظیم کنید

مشکل 5: پروکسی برای HTTP کار می‌کند، اما برای HTTPS نه

علائم: درخواست‌های HTTP عبور می‌کنند، HTTPS خطاهای SSL/TLS برمی‌گرداند.

راه‌حل‌ها:

  • اطمینان حاصل کنید که متغیر HTTPS_PROXY تنظیم شده است (فقط HTTP_PROXY نباشد)
  • از http:// در URL پروکسی برای HTTPS_PROXY استفاده کنید، نه https://
  • بررسی کنید که آیا پروکسی روش CONNECT را برای تونل‌سازی HTTPS پشتیبانی می‌کند
  • برای پروکسی‌های با گواهینامه‌های خودامضا، بررسی SSL را غیرفعال کنید (فقط برای تست‌ها!)

امنیت و مدیریت credentials

ذخیره credentials پروکسی در کانتینرهای Docker نیاز به توجه ویژه‌ای به امنیت دارد. مدیریت نادرست رمزها می‌تواند منجر به نشت آن‌ها در لاگ‌ها، تصاویر یا مخازن شود.

از Docker Secrets برای تولید استفاده کنید:

Docker Swarm از مکانیزم secrets برای ذخیره امن رمزها پشتیبانی می‌کند. یک secret ایجاد کنید:

echo "http://username:password@proxy.example.com:8080" | docker secret create proxy_url -

در docker-compose برای Swarm استفاده کنید:

version: '3.8'

services:
  app:
    image: my-app:latest
    secrets:
      - proxy_url
    environment:
      - PROXY_URL_FILE=/run/secrets/proxy_url
    command: sh -c 'export HTTP_PROXY=$(cat $$PROXY_URL_FILE) && python app.py'

secrets:
  proxy_url:
    external: true

متغیرهای محیطی از طریق فایل‌ها (.env):

برای توسعه از فایل‌های .env استفاده کنید، اما هرگز آن‌ها را در Git کامیت نکنید. به .gitignore اضافه کنید:

# .gitignore
.env
.env.local
*.env

یک .env.example بدون credentials واقعی ایجاد کنید:

# .env.example
PROXY_URL=http://username:password@proxy.example.com:8080
NO_PROXY=localhost,127.0.0.1

از هاردکد کردن credentials در تصاویر خودداری کنید:

خطرناک: هرگز رمزها را به طور مستقیم در Dockerfile با استفاده از ENV ثبت نکنید. این مقادیر در لایه‌های تصویر ذخیره می‌شوند و حتی پس از حذف نیز قابل دسترسی هستند.

# ❌ بد - رمز در تصویر باقی می‌ماند
FROM python:3.11
ENV HTTP_PROXY=http://user:secretpass@proxy.com:8080
COPY . /app

# ✅ خوب - از طریق آرگومان‌های ساخت یا متغیرهای زمان اجرا منتقل کنید
FROM python:3.11
ARG HTTP_PROXY
# فقط در زمان ساخت استفاده می‌شود، در تصویر نهایی ذخیره نمی‌شود

از ساخت‌های چند مرحله‌ای برای پاک‌سازی credentials استفاده کنید:

# مرحله ساخت با پروکسی
FROM python:3.11 AS builder
ARG HTTP_PROXY
ENV HTTP_PROXY=${HTTP_PROXY}
COPY requirements.txt .
RUN pip install -r requirements.txt

# مرحله نهایی بدون متغیرهای پروکسی
FROM python:3.11-slim
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY . /app
WORKDIR /app
CMD ["python", "app.py"]

چرخش credentials پروکسی:

اگر ارائه‌دهنده پروکسی شما از API برای تولید credentials موقت پشتیبانی می‌کند، از آن‌ها به جای رمزهای ثابت استفاده کنید. یک اسکریپت init در کانتینر ایجاد کنید:

#!/bin/bash
# entrypoint.sh

# دریافت credentials موقت از API
PROXY_CREDS=$(curl -s https://api.proxyservice.com/generate-temp-auth)
export HTTP_PROXY="http://${PROXY_CREDS}@proxy.example.com:8080"

# اجرای برنامه
exec python app.py

لاگ‌گذاری بدون نشت رمزها:

لاگ‌گذاری را طوری تنظیم کنید که متغیرهای پروکسی در خروجی قرار نگیرند:

import os
import re

def safe_log_env():
    """لاگ‌گذاری متغیرهای محیطی بدون رمزها"""
    for key, value in os.environ.items():
        if 'PROXY' in key:
            # مخفی کردن رمز در URL
            safe_value = re.sub(r'://([^:]+):([^@]+)@', r'://\1:****@', value)
            print(f"{key}={safe_value}")
        else:
            print(f"{key}={value}")

safe_log_env()

نتیجه‌گیری

تنظیم پروکسی در کانتینرهای Docker یک مهارت مهم برای توسعه‌دهندگانی است که با پارس کردن، اتوماسیون و سیستم‌های توزیع‌شده کار می‌کنند. شما آموختید که چگونه پروکسی را از طریق متغیرهای محیطی، Dockerfile و docker-compose تنظیم کنید، چگونه پروکسی را در کد برنامه‌های Python و Node.js ادغام کنید و چگونه مشکلات رایج با اتصال و امنیت را حل کنید.

نکات کلیدی برای کار موفق با پروکسی در Docker: از متغیرهای محیطی برای انعطاف‌پذیری استفاده کنید، credentials را به صورت امن از طریق secrets یا فایل‌های .env ذخیره کنید، نوع پروکسی را بسته به وظیفه انتخاب کنید و همیشه قبل از راه‌اندازی در تولید، عدم نشت IP واقعی را تست کنید.

برای بیشتر وظایف پارس کردن و اتوماسیون در کانتینرهای Docker، توصیه می‌کنیم از پروکسی‌های مسکونی استفاده کنید — آن‌ها ناشناسی بالایی را فراهم می‌کنند و ریسک مسدود شدن را در هنگام کار با سایت‌ها و API های محافظت‌شده به حداقل می‌رسانند. اگر به سرعت حداکثری برای تست API یا وظایف داخلی نیاز دارید، به پروکسی‌های مرکز داده توجه کنید.

```