Comment router les conteneurs Docker via les proxys ProxyScrape
Envoyez le trafic des conteneurs, les pulls d'images et les services Compose via les points de terminaison HTTP ou SOCKS5 de ProxyScrape à l'aide de variables d'environnement, de la configuration proxy du client et du démon, et des paramètres au niveau de l'application.
Aperçu
Les conteneurs Docker sont isolés de votre shell hôte et de ses paramètres proxy, donc un proxy qui fonctionne dans votre terminal ne s'applique pas automatiquement dans docker run ou docker compose. Il y a trois endroits pratiques pour insérer un point de terminaison ProxyScrape : à l'intérieur du conteneur en tant que variables d'environnement, au niveau du client ou du démon Docker afin que les pulls d'images et les builds utilisent le proxy, et dans la configuration de l'application pour les outils qui ignorent les variables d'environnement ou ont besoin de SOCKS5.
ProxyScrape propose des proxys résidentiels, datacenter et mobiles via http et socks5, facturés soit à l'usage, soit selon un forfait mensuel fixe, afin que vous puissiez faire correspondre le pool et le modèle de facturation à la charge de travail que vous conteneurisez. L'hôte, le port et les identifiants du point de terminaison sont indiqués dans votre tableau de bord ProxyScrape.
Ce tutoriel couvre les trois couches et montre comment confirmer que le trafic des conteneurs sort réellement via le proxy.
Ce dont vous avez besoin
- Docker Engine 20.10 ou version ultérieure, ou Docker Desktop
- Docker Compose v2 (
docker compose) - Un abonnement ProxyScrape ainsi que l'hôte, le port, le nom d'utilisateur et le mot de passe de votre tableau de bord
- Un accès sortant au port proxy sur votre réseau
Choisir où appliquer le proxy
| Couche | S'applique à | Protocoles | Remarques |
|---|---|---|---|
| Variables d'environnement du conteneur | Clients qui lisent HTTP_PROXY (curl, pip, apt, de nombreux SDK) |
http |
Le plus rapide à configurer ; les URL SOCKS5 sont ignorées par la plupart des runtimes |
| Configuration du client ou du démon Docker | docker pull, docker build, docker push |
http |
Les modifications au niveau du démon nécessitent un redémarrage du service |
| Configuration de l'application ou un forwarder | Outils avec leurs propres paramètres proxy, ou besoins SOCKS5 uniquement | http, socks5 |
Le plus fiable pour les clients non standard |
Commencez par les variables d'environnement et ne descendez dans le tableau que lorsqu'un outil les ignore.
Étapes
1. Stockez vos identifiants en dehors de l'image
Construisez l'URL du proxy pour le protocole que vous comptez utiliser :
http://<username>:<password>@<host>:<port>
socks5h://<username>:<password>@<host>:<port>
Conservez les valeurs dans un fichier qui n'entre jamais dans un contexte de build ou un dépôt 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
Si le mot de passe contient @, :, / ou #, encodez ces caractères en pourcentage avant de le placer dans une URL.
2. Vérifiez le point de terminaison depuis l'hôte
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
Utilisez socks5h:// plutôt que socks5:// afin que la résolution du nom d'hôte se fasse au niveau du proxy plutôt que localement. Si une seule des deux commandes réussit, utilisez ce protocole pour le reste de cette configuration.
3. Transmettez le proxy à un seul conteneur
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
De nombreux runtimes ne lisent que les noms en minuscules et certains ne lisent que les noms en majuscules, donc définissez les deux. NO_PROXY empêche le trafic loopback et interne au conteneur de passer par le proxy.
4. Gérez le proxy avec Docker Compose
Créez un fichier .env dans le répertoire du projet Compose afin que Compose puisse interpoler les valeurs, et ajoutez-le à .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
Notez que les valeurs placées dans un env_file sont injectées dans le conteneur mais ne sont pas utilisées pour l'interpolation ${...}. Compose les lit depuis l'environnement du shell ou le fichier .env du projet.
5. Acheminez les pulls d'images et les builds via le proxy
Pour un seul utilisateur, configurez le client Docker afin que les builds héritent du proxy. Enregistrez ceci sous ~/.docker/config.json :
{
"proxies": {
"default": {
"httpProxy": "http://<username>:<password>@<host>:<port>",
"httpsProxy": "http://<username>:<password>@<host>:<port>",
"noProxy": "localhost,127.0.0.1"
}
}
}
La configuration proxy du client et du démon Docker ne prend en charge que les proxys HTTP, donc utilisez un point de terminaison http:// ici même si vous utilisez SOCKS5 à l'intérieur des conteneurs.
Sur les hôtes Linux où le démon lui-même doit atteindre un registre, ajoutez plutôt un 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
6. Configurez les outils qui ignorent les variables d'environnement
Quelques gestionnaires de paquets et runtimes nécessitent des paramètres explicites.
apt dans une image basée sur 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
Pour les outils SOCKS5 uniquement, proxychains-ng fournit un wrapper qui force les connexions à passer par le proxy :
# /etc/proxychains4.conf (excerpt)
strict_chain
proxy_dns
[ProxyList]
socks5 <host> <port> <username> <password>
proxychains4 curl -sS https://api.ipify.org; echo
7. Vérifiez la sortie et surveillez l'utilisation
Confirmez l'adresse que voit le conteneur, puis comparez-la avec l'adresse obtenue sans aucune variable proxy définie. Si les deux correspondent, le proxy n'est pas utilisé.
docker run --rm \
-e HTTPS_PROXY="http://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT" \
curlimages/curl:latest -sS https://api.ipify.org; echo
Les points de terminaison rotatifs peuvent renvoyer une adresse IP de sortie différente du pool à chaque requête, ce qui est attendu pour les charges de scraping et de surveillance. Si votre forfait ProxyScrape expose des options de session ou sticky, ajoutez l'identifiant de session au champ nom d'utilisateur comme décrit dans votre tableau de bord, et surveillez l'utilisation à cet endroit car le volume de requêtes est mesuré.
Dépannage
407 Authentification proxy requise
Le nom d'utilisateur ou le mot de passe est incorrect, ou le mot de passe contient des caractères qui n'ont pas été encodés en pourcentage. Recopiez les identifiants depuis le tableau de bord ProxyScrape et reconstruisez l'URL.
L'hôte fonctionne mais le conteneur échoue
- Confirmez que les variables proxy en majuscules et en minuscules sont définies dans le conteneur.
- Vérifiez que le conteneur peut résoudre le nom d'hôte du proxy :
docker run --rm curlimages/curl:latest -sS -I http://<host>. - Sur Docker Desktop, les conteneurs accèdent à Internet via une VM, donc vérifiez que le port proxy n'est pas bloqué par un pare-feu hôte.
- Affichez les variables pour écarter les valeurs vides :
docker run --rm --env-file ~/.config/proxyscrape/proxy.env alpine env | grep -i proxy.
Les connexions expirent
- Le port de sortie peut être bloqué par un pare-feu d'entreprise ou un VPN local. Testez d'abord depuis l'hôte.
- Les points de terminaison HTTP et SOCKS5 écoutent généralement sur des ports différents. Utilisez le port correspondant au protocole que vous avez configuré.
Les URL SOCKS5 sont ignorées
La plupart des runtimes n'implémentent que les variables d'environnement de proxy HTTP. Utilisez un paramètre au niveau de l'application tel que --proxy, un wrapper proxychains-ng, ou l'argument proxy propre à la bibliothèque au lieu de vous fier à ALL_PROXY.
docker pull échoue toujours après la configuration du démon
Exécutez docker info | grep -i proxy pour confirmer que le démon a pris en compte les variables, et rappelez-vous que ~/.docker/config.json ne s'applique qu'à l'utilisateur actuel. Vérifiez votre liste noProxy pour les entrées qui couvrent accidentellement le nom d'hôte du registre.
Erreurs TLS ou de certificat
Les cibles HTTPS nécessitent que le proxy prenne en charge la méthode CONNECT, que curl et le client Docker utilisent automatiquement. Si vous avez configuré une URL de proxy HTTP, vérifiez que le port cible est autorisé par votre point de terminaison ProxyScrape.
Résumé
- Les conteneurs n'héritent pas des paramètres proxy de l'hôte, donc transmettez explicitement les identifiants avec
HTTP_PROXY,HTTPS_PROXYet leurs équivalents en minuscules. - Utilisez
~/.docker/config.jsonou un drop-in systemd pour acheminer les pulls d'images et les builds, en gardant à l'esprit que la configuration proxy propre à Docker est limitée à HTTP. - Certains outils tels que
apt,pipet les clients SOCKS5 uniquement nécessitent leur propre configuration ou un wrapperproxychains-ng. - Vérifiez toujours l'adresse IP de sortie depuis l'intérieur du conteneur et conservez les identifiants dans un fichier exclu du contrôle de version.
- Les pools résidentiels, datacenter et mobiles de ProxyScrape via
httpetsocks5, en facturation à l'usage ou forfait mensuel fixe, vous offrent des options pour correspondre à chaque charge de travail conteneurisée.