Skip to content
Intermediate / 3 min read

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.

Linux SOCKS5 HTTP(S) Autre

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_PROXY et leurs équivalents en minuscules.
  • Utilisez ~/.docker/config.json ou 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, pip et les clients SOCKS5 uniquement nécessitent leur propre configuration ou un wrapper proxychains-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 http et socks5, en facturation à l'usage ou forfait mensuel fixe, vous offrent des options pour correspondre à chaque charge de travail conteneurisée.