Wie man Docker-Container durch ProxyScrape-Proxies leitet
Leiten Sie Container-Traffic, Image-Pulls und Compose-Dienste über ProxyScrape HTTP- oder SOCKS5-Endpunkte, indem Sie Umgebungsvariablen, Client- und Daemon-Proxy-Konfiguration sowie App-Einstellungen verwenden.
Überblick
Docker-Container sind von Ihrer Host-Shell und deren Proxy-Einstellungen isoliert, sodass ein Proxy, der in Ihrem Terminal funktioniert, nicht automatisch innerhalb von docker run oder docker compose gilt. Es gibt drei praktische Stellen, um einen ProxyScrape-Endpunkt einzufügen: innerhalb des Containers als Umgebungsvariablen, auf Docker-Client- oder Daemon-Ebene, damit Image-Pulls und Builds den Proxy verwenden, und in der Anwendungskonfiguration für Tools, die Umgebungsvariablen ignorieren oder SOCKS5 benötigen.
ProxyScrape bietet Residential-, Datacenter- und Mobile-Proxies über http und socks5 an, die entweder pay-as-you-go oder als monatlicher Pauschalplan abgerechnet werden, sodass Sie den Pool und das Abrechnungsmodell an die Workload anpassen können, die Sie containerisieren. Der Endpunkt-Host, der Port und die Anmeldeinformationen sind in Ihrem ProxyScrape-Dashboard aufgeführt.
Dieses Tutorial behandelt alle drei Ebenen und zeigt, wie Sie bestätigen können, dass der Container-Traffic tatsächlich über den Proxy geleitet wird.
Was Sie benötigen
- Docker Engine 20.10 oder neuer, oder Docker Desktop
- Docker Compose v2 (
docker compose) - Ein ProxyScrape-Abonnement sowie den Host, Port, Benutzernamen und das Passwort aus Ihrem Dashboard
- Ausgehender Zugriff auf den Proxy-Port in Ihrem Netzwerk
Auswahl, wo der Proxy angewendet werden soll
| Ebene | Gilt für | Protokolle | Hinweise |
|---|---|---|---|
| Container-Umgebungsvariablen | Clients, die HTTP_PROXY lesen (curl, pip, apt, viele SDKs) |
http |
Am schnellsten einzurichten; SOCKS5-URLs werden von den meisten Runtimes ignoriert |
| Docker-Client- oder Daemon-Konfiguration | docker pull, docker build, docker push |
http |
Änderungen auf Daemon-Ebene erfordern einen Dienstneustart |
| Anwendungskonfiguration oder ein Forwarder | Tools mit eigenen Proxy-Einstellungen oder reine SOCKS5-Anforderungen | http, socks5 |
Am zuverlässigsten für nicht standardmäßige Clients |
Beginnen Sie mit Umgebungsvariablen und gehen Sie erst in der Tabelle weiter nach unten, wenn ein Tool sie ignoriert.
Schritte
1. Speichern Sie Ihre Anmeldeinformationen außerhalb des Images
Erstellen Sie die Proxy-URL für das Protokoll, das Sie verwenden möchten:
http://<username>:<password>@<host>:<port>
socks5h://<username>:<password>@<host>:<port>
Bewahren Sie die Werte in einer Datei auf, die niemals in einen Build-Kontext oder ein Git-Repository gelangt.
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
Wenn das Passwort @, :, / oder # enthält, kodieren Sie diese Zeichen prozentual, bevor Sie es in eine URL einfügen.
2. Überprüfen Sie den Endpunkt vom Host aus
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
Verwenden Sie socks5h:// anstelle von socks5://, damit die Hostnamenauflösung beim Proxy statt lokal erfolgt. Wenn nur einer der beiden Befehle erfolgreich ist, verwenden Sie dieses Protokoll für den Rest dieses Setups.
3. Übergeben Sie den Proxy an einen einzelnen Container
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
Viele Runtimes lesen nur die kleingeschriebenen Namen und einige nur die großgeschriebenen, daher sollten Sie beide setzen. NO_PROXY hält Loopback- und containerinternen Traffic vom Proxy fern.
4. Verwalten Sie den Proxy mit Docker Compose
Erstellen Sie eine .env-Datei im Compose-Projektverzeichnis, damit Compose die Werte interpolieren kann, und fügen Sie sie zu .gitignore hinzu.
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
Beachten Sie, dass Werte, die in einer env_file platziert werden, in den Container injiziert, aber nicht für die ${...}-Interpolation verwendet werden. Compose liest diese aus der Shell-Umgebung oder der Projekt-.env-Datei.
5. Leiten Sie Image-Pulls und Builds durch den Proxy
Konfigurieren Sie für einen einzelnen Benutzer den Docker-Client so, dass Builds den Proxy erben. Speichern Sie dies als ~/.docker/config.json:
{
"proxies": {
"default": {
"httpProxy": "http://<username>:<password>@<host>:<port>",
"httpsProxy": "http://<username>:<password>@<host>:<port>",
"noProxy": "localhost,127.0.0.1"
}
}
}
Die Proxy-Konfiguration von Docker-Client und -Daemon unterstützt nur HTTP-Proxies, verwenden Sie hier also einen http://-Endpunkt, auch wenn Sie SOCKS5 innerhalb von Containern verwenden.
Fügen Sie auf Linux-Hosts, auf denen der Daemon selbst eine Registry erreichen muss, stattdessen ein systemd-Drop-in hinzu:
# /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
6. Konfigurieren Sie Tools, die Umgebungsvariablen ignorieren
Einige Paketmanager und Runtimes benötigen explizite Einstellungen.
apt in einem Debian-basierten Image:
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
Für reine SOCKS5-Tools bietet proxychains-ng einen Wrapper, der Verbindungen durch den Proxy erzwingt:
# /etc/proxychains4.conf (excerpt)
strict_chain
proxy_dns
[ProxyList]
socks5 <host> <port> <username> <password>
proxychains4 curl -sS https://api.ipify.org; echo
7. Überprüfen Sie den Egress und beobachten Sie die Nutzung
Bestätigen Sie die Adresse, die der Container sieht, und vergleichen Sie sie mit der Adresse, die Sie ohne gesetzte Proxy-Variablen erhalten. Wenn beide übereinstimmen, wird der Proxy nicht verwendet.
docker run --rm \
-e HTTPS_PROXY="http://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT" \
curlimages/curl:latest -sS https://api.ipify.org; echo
Rotierende Endpunkte können bei jeder Anfrage eine andere Exit-IP aus dem Pool zurückgeben, was für Scraping- und Monitoring-Workloads zu erwarten ist. Wenn Ihr ProxyScrape-Plan Sitzungs- oder Sticky-Optionen bietet, fügen Sie die Sitzungskennung wie in Ihrem Dashboard beschrieben zum Benutzernamenfeld hinzu, und behalten Sie dort die Nutzung im Auge, da das Anforderungsvolumen gemessen wird.
Fehlerbehebung
407 Proxy-Authentifizierung erforderlich
Der Benutzername oder das Passwort ist falsch, oder das Passwort enthält Zeichen, die nicht prozentual kodiert wurden. Kopieren Sie die Anmeldeinformationen erneut aus dem ProxyScrape-Dashboard und erstellen Sie die URL neu.
Der Host funktioniert, aber der Container schlägt fehl
- Bestätigen Sie, dass sowohl groß- als auch kleingeschriebene Proxy-Variablen innerhalb des Containers gesetzt sind.
- Überprüfen Sie, ob der Container den Proxy-Hostnamen auflösen kann:
docker run --rm curlimages/curl:latest -sS -I http://<host>. - Bei Docker Desktop erreichen Container das Internet über eine VM. Stellen Sie daher sicher, dass der Proxy-Port nicht durch eine Host-Firewall blockiert wird.
- Geben Sie die Variablen aus, um leere Werte auszuschließen:
docker run --rm --env-file ~/.config/proxyscrape/proxy.env alpine env | grep -i proxy.
Verbindungen laufen in eine Zeitüberschreitung
- Der Egress-Port kann durch eine Unternehmensfirewall oder ein lokales VPN blockiert sein. Testen Sie zuerst vom Host aus.
- HTTP- und SOCKS5-Endpunkte lauschen üblicherweise auf unterschiedlichen Ports. Verwenden Sie den Port, der dem von Ihnen konfigurierten Protokoll entspricht.
SOCKS5-URLs werden ignoriert
Die meisten Runtimes implementieren nur HTTP-Proxy-Umgebungsvariablen. Verwenden Sie eine Einstellung auf Anwendungsebene wie --proxy, einen proxychains-ng-Wrapper oder das eigene Proxy-Argument der Bibliothek, anstatt sich auf ALL_PROXY zu verlassen.
docker pull schlägt auch nach der Daemon-Konfiguration fehl
Führen Sie docker info | grep -i proxy aus, um zu bestätigen, dass der Daemon die Variablen übernommen hat, und denken Sie daran, dass ~/.docker/config.json nur für den aktuellen Benutzer gilt. Überprüfen Sie Ihre noProxy-Liste auf Einträge, die versehentlich den Registry-Hostnamen abdecken.
TLS- oder Zertifikatsfehler
HTTPS-Ziele erfordern, dass der Proxy die CONNECT-Methode unterstützt, die curl und der Docker-Client automatisch verwenden. Wenn Sie eine HTTP-Proxy-URL konfiguriert haben, überprüfen Sie, ob der Zielport von Ihrem ProxyScrape-Endpunkt zugelassen wird.
Zusammenfassung
- Container erben keine Host-Proxy-Einstellungen, übergeben Sie die Anmeldeinformationen daher explizit mit
HTTP_PROXY,HTTPS_PROXYund deren kleingeschriebenen Entsprechungen. - Verwenden Sie
~/.docker/config.jsonoder ein systemd-Drop-in, um Image-Pulls und Builds zu leiten, und denken Sie daran, dass die Proxy-Konfiguration von Docker selbst nur HTTP unterstützt. - Einige Tools wie
apt,pipund reine SOCKS5-Clients benötigen ihre eigene Konfiguration oder einenproxychains-ng-Wrapper. - Überprüfen Sie immer die Egress-IP von innerhalb des Containers und bewahren Sie Anmeldeinformationen in einer Datei auf, die von der Versionskontrolle ausgeschlossen ist.
- Die Residential-, Datacenter- und Mobile-Pools von ProxyScrape über
httpundsocks5, mit pay-as-you-go- oder monatlicher Pauschalabrechnung, bieten Ihnen Optionen, um jede containerisierte Workload abzudecken.