Skip to content
intermediate

Cara Mengarahkan Container Docker Melalui Proxy ProxyScrape

Kirim lalu lintas container, penarikan image, dan layanan Compose melalui endpoint HTTP atau SOCKS5 ProxyScrape menggunakan variabel lingkungan, konfigurasi proxy klien dan daemon, serta pengaturan tingkat aplikasi.

Linux SOCKS5 HTTP(S) Lainnya

Ringkasan

Container Docker terisolasi dari shell host dan pengaturan proxy-nya, jadi proxy yang berfungsi di terminal Anda tidak otomatis berlaku di dalam docker run atau docker compose. Ada tiga tempat praktis untuk menyisipkan endpoint ProxyScrape: di dalam container sebagai variabel lingkungan, di tingkat klien atau daemon Docker agar penarikan dan build image menggunakan proxy, dan di konfigurasi aplikasi untuk alat yang mengabaikan variabel lingkungan atau memerlukan SOCKS5.

ProxyScrape menawarkan proxy residential, datacenter, dan mobile melalui http dan socks5, ditagih baik secara pay-as-you-go atau paket bulanan flat, sehingga Anda dapat mencocokkan pool dan model penagihan dengan beban kerja yang Anda containerisasi. Host, port, dan kredensial endpoint tercantum di dashboard ProxyScrape Anda.

Tutorial ini mencakup ketiga lapisan dan menunjukkan cara mengonfirmasi bahwa lalu lintas container benar-benar keluar melalui proxy.

Yang Anda butuhkan

  • Docker Engine 20.10 atau lebih baru, atau Docker Desktop
  • Docker Compose v2 (docker compose)
  • Langganan ProxyScrape plus host, port, username, dan password dari dashboard Anda
  • Akses keluar ke port proxy di jaringan Anda

Memilih Tempat untuk Menerapkan Proxy

Lapisan Berlaku untuk Protokol Catatan
Variabel lingkungan container Klien yang membaca HTTP_PROXY (curl, pip, apt, banyak SDK) http Paling cepat disiapkan; URL SOCKS5 diabaikan oleh sebagian besar runtime
Konfigurasi klien atau daemon Docker docker pull, docker build, docker push http Perubahan tingkat daemon memerlukan restart layanan
Konfigurasi aplikasi atau forwarder Alat dengan pengaturan proxy sendiri, atau kebutuhan khusus SOCKS5 http, socks5 Paling andal untuk klien non-standar

Mulailah dengan variabel lingkungan dan turun ke baris berikutnya hanya ketika suatu alat mengabaikannya.

Langkah-langkah

1. Simpan kredensial Anda di luar image

Bangun URL proxy untuk protokol yang ingin Anda gunakan:

http://<username>:<password>@<host>:<port>
socks5h://<username>:<password>@<host>:<port>

Simpan nilainya dalam file yang tidak pernah masuk ke build context atau repositori 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

Jika kata sandi mengandung @, :, /, atau #, lakukan percent-encode pada karakter tersebut sebelum menempatkannya di URL.

2. Verifikasi endpoint dari host

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

Gunakan socks5h:// alih-alih socks5:// agar resolusi hostname terjadi di proxy, bukan secara lokal. Jika hanya salah satu dari dua perintah yang berhasil, gunakan protokol itu untuk sisa penyiapan ini.

3. Teruskan proxy ke satu 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

Banyak runtime hanya membaca nama huruf kecil dan sebagian hanya membaca nama huruf besar, jadi setel keduanya. NO_PROXY menjaga lalu lintas loopback dan internal container agar tidak melewati proxy.

4. Kelola proxy dengan Docker Compose

Buat file .env di direktori proyek Compose agar Compose dapat menginterpolasi nilai-nilai tersebut, dan tambahkan ke .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

Perhatikan bahwa nilai yang ditempatkan di env_file disuntikkan ke container tetapi tidak digunakan untuk interpolasi ${...}. Compose membacanya dari lingkungan shell atau file .env proyek.

5. Rutekan penarikan dan build image melalui proxy

Untuk satu pengguna, konfigurasikan klien Docker agar build mewarisi proxy. Simpan ini sebagai ~/.docker/config.json:

{
  "proxies": {
    "default": {
      "httpProxy": "http://<username>:<password>@<host>:<port>",
      "httpsProxy": "http://<username>:<password>@<host>:<port>",
      "noProxy": "localhost,127.0.0.1"
    }
  }
}

Konfigurasi proxy klien dan daemon Docker hanya mendukung proxy HTTP, jadi gunakan endpoint http:// di sini meskipun Anda menggunakan SOCKS5 di dalam container.

Pada host Linux di mana daemon sendiri harus menjangkau registry, tambahkan systemd drop-in sebagai gantinya:

# /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. Konfigurasikan alat yang mengabaikan variabel lingkungan

Beberapa manajer paket dan runtime memerlukan pengaturan eksplisit.

apt di dalam image berbasis 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

Untuk alat khusus SOCKS5, proxychains-ng menyediakan wrapper yang memaksa koneksi melalui proxy:

# /etc/proxychains4.conf (excerpt)
strict_chain
proxy_dns
[ProxyList]
socks5 <host> <port> <username> <password>
proxychains4 curl -sS https://api.ipify.org; echo

7. Verifikasi egress dan pantau penggunaan

Konfirmasi alamat yang dilihat container, lalu bandingkan dengan alamat yang Anda dapatkan tanpa variabel proxy apa pun. Jika keduanya sama, proxy tidak digunakan.

docker run --rm \
  -e HTTPS_PROXY="http://$PROXY_USER:$PROXY_PASS@$PROXY_HOST:$PROXY_PORT" \
  curlimages/curl:latest -sS https://api.ipify.org; echo

Endpoint yang berotasi dapat mengembalikan IP keluar yang berbeda dari pool pada setiap permintaan, yang memang diharapkan untuk beban kerja scraping dan monitoring. Jika paket ProxyScrape Anda menyediakan opsi sesi atau sticky, tambahkan pengenal sesi ke kolom username seperti dijelaskan di dashboard Anda, dan pantau penggunaan di sana karena volume permintaan dihitung.

Pemecahan Masalah

407 Proxy Authentication Required

Username atau kata sandi salah, atau kata sandi mengandung karakter yang tidak di-percent-encode. Salin ulang kredensial dari dashboard ProxyScrape dan bangun ulang URL.

Host berfungsi tetapi container gagal

  • Pastikan variabel proxy huruf besar dan huruf kecil keduanya disetel di dalam container.
  • Periksa bahwa container dapat me-resolve hostname proxy: docker run --rm curlimages/curl:latest -sS -I http://<host>.
  • Di Docker Desktop, container menjangkau internet melalui VM, jadi verifikasi port proxy tidak diblokir oleh firewall host.
  • Cetak variabel untuk menyingkirkan nilai kosong: docker run --rm --env-file ~/.config/proxyscrape/proxy.env alpine env | grep -i proxy.

Koneksi timeout

  • Port egress mungkin diblokir oleh firewall perusahaan atau VPN lokal. Uji dari host terlebih dahulu.
  • Endpoint HTTP dan SOCKS5 biasanya mendengarkan di port yang berbeda. Gunakan port yang sesuai dengan protokol yang Anda konfigurasikan.

URL SOCKS5 diabaikan

Sebagian besar runtime hanya mengimplementasikan variabel lingkungan proxy HTTP. Gunakan pengaturan tingkat aplikasi seperti --proxy, wrapper proxychains-ng, atau argumen proxy milik library itu sendiri alih-alih mengandalkan ALL_PROXY.

docker pull masih gagal setelah konfigurasi daemon

Jalankan docker info | grep -i proxy untuk memastikan daemon mengambil variabel tersebut, dan ingat bahwa ~/.docker/config.json hanya berlaku untuk pengguna saat ini. Periksa daftar noProxy Anda untuk entri yang secara tidak sengaja mencakup hostname registry.

Kesalahan TLS atau sertifikat

Target HTTPS mengharuskan proxy mendukung metode CONNECT, yang digunakan curl dan klien Docker secara otomatis. Jika Anda mengonfigurasi URL proxy HTTP, verifikasi bahwa port target diizinkan oleh endpoint ProxyScrape Anda.

Ringkasan

  • Container tidak mewarisi pengaturan proxy host, jadi teruskan kredensial secara eksplisit dengan HTTP_PROXY, HTTPS_PROXY, dan padanan huruf kecilnya.
  • Gunakan ~/.docker/config.json atau systemd drop-in untuk merutekan penarikan dan build image, ingat bahwa konfigurasi proxy Docker sendiri hanya HTTP.
  • Beberapa alat seperti apt, pip, dan klien khusus SOCKS5 memerlukan konfigurasi sendiri atau wrapper proxychains-ng.
  • Selalu verifikasi IP egress dari dalam container dan simpan kredensial dalam file yang dikecualikan dari kontrol versi.
  • Pool residential, datacenter, dan mobile ProxyScrape melalui http dan socks5, dengan penagihan pay-as-you-go atau flat bulanan, memberi Anda opsi untuk mencocokkan setiap beban kerja yang dikontainerisasi.