Kontainer Docker sering membutuhkan akses ke sumber daya eksternal melalui proxy — untuk pengambilan data, pengujian dari berbagai wilayah, atau menghindari pembatasan. Pengaturan proxy yang salah dapat menyebabkan kesalahan koneksi, kebocoran IP asli, dan kegagalan dalam aplikasi. Dalam artikel ini, kita akan membahas semua cara untuk mengatur proxy di Docker: dari variabel lingkungan sederhana hingga skenario lanjutan dengan docker-compose dan jaringan kustom.
Mengapa perlu proxy dalam kontainer Docker
Kontainer Docker digunakan dalam berbagai skenario di mana proxy menjadi kebutuhan. Mari kita lihat tugas utama yang diselesaikan oleh proxy dalam aplikasi yang tercontainerisasi.
Pemrosesan dan pengumpulan data: Jika Anda menjalankan pemroses dalam kontainer Docker untuk mengumpulkan data dari marketplace (Wildberries, Ozon), media sosial, atau mesin pencari, proxy melindungi dari pemblokiran berdasarkan IP. Kontainer memungkinkan untuk menskalakan pemrosesan — menjalankan 10-50 instance secara bersamaan, masing-masing dengan proxy-nya sendiri.
Pengujian dari berbagai wilayah: Saat mengembangkan aplikasi web atau API mobile, sering kali perlu memeriksa bagaimana layanan berfungsi dari berbagai negara. Kontainer Docker dengan proxy dari berbagai geolokasi memungkinkan untuk mengotomatisasi pengujian semacam itu dalam pipeline CI/CD.
Automasi dan bot: Kontainer dengan Selenium, Puppeteer, atau Playwright untuk automasi browser memerlukan proxy untuk bekerja dengan banyak akun. Setiap kontainer mendapatkan proxy dan lingkungan terisolasi.
Menghindari pembatasan korporat: Dalam beberapa infrastruktur, kontainer Docker harus melewati proxy korporat untuk mengakses internet. Tanpa pengaturan yang benar, kontainer tidak akan dapat mengunduh paket atau mengakses API eksternal.
Penting: Kontainer Docker mewarisi pengaturan jaringan dari sistem host, tetapi proxy perlu diatur secara eksplisit. Hanya memiliki proxy di host tidak berarti bahwa kontainer secara otomatis menggunakannya.
Pengaturan dasar melalui variabel lingkungan
Cara paling sederhana untuk mengatur proxy dalam kontainer Docker adalah dengan mengirimkan variabel lingkungan saat menjalankan. Metode ini bekerja untuk sebagian besar aplikasi yang menghormati variabel standar HTTP_PROXY, HTTPS_PROXY, dan NO_PROXY.
Menjalankan kontainer dengan proxy melalui 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
Penjelasan parameter:
HTTP_PROXY— proxy untuk permintaan HTTPHTTPS_PROXY— proxy untuk permintaan HTTPS (gunakan http://, bukan https://)NO_PROXY— daftar alamat yang tidak boleh melalui proxy
Contoh dengan 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
Kesalahan umum: Menggunakan https:// dalam URL proxy untuk HTTPS_PROXY. Sebaiknya gunakan http:// atau socks5://, bahkan untuk lalu lintas HTTPS. Protokol dalam URL menunjukkan jenis server proxy, bukan jenis lalu lintas.
Pengaturan proxy untuk daemon Docker (berpengaruh pada semua kontainer):
Jika Anda ingin semua kontainer secara default menggunakan proxy, atur daemon Docker. Buat file /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"
Setelah perubahan, restart Docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
Pengaturan proxy dalam Dockerfile
Ketika Anda membangun image Docker yang harus mengunduh paket melalui proxy (misalnya, apt-get, pip, npm), Anda perlu mengatur proxy pada tahap pembangunan. Docker mendukung argumen build-time untuk ini.
Contoh Dockerfile dengan dukungan proxy:
FROM python:3.11-slim
# Argumen untuk proxy (dikirim saat membangun)
ARG HTTP_PROXY
ARG HTTPS_PROXY
ARG NO_PROXY
# Mengatur variabel lingkungan untuk pembangunan
ENV HTTP_PROXY=${HTTP_PROXY}
ENV HTTPS_PROXY=${HTTPS_PROXY}
ENV NO_PROXY=${NO_PROXY}
# Menginstal dependensi melalui proxy
RUN apt-get update && apt-get install -y curl
# Menginstal paket Python
COPY requirements.txt .
RUN pip install --proxy ${HTTP_PROXY} -r requirements.txt
# Menyalin aplikasi
COPY . /app
WORKDIR /app
# Menghapus variabel proxy untuk runtime (opsional)
ENV HTTP_PROXY=
ENV HTTPS_PROXY=
CMD ["python", "app.py"]
Membangun image dengan mengirimkan proxy:
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 .
Untuk aplikasi Node.js (npm melalui proxy):
FROM node:18-alpine
ARG HTTP_PROXY
ARG HTTPS_PROXY
# Mengatur npm untuk bekerja melalui proxy
RUN npm config set proxy ${HTTP_PROXY}
RUN npm config set https-proxy ${HTTPS_PROXY}
COPY package*.json ./
RUN npm install
# Menghapus pengaturan proxy untuk npm
RUN npm config delete proxy
RUN npm config delete https-proxy
COPY . .
CMD ["node", "server.js"]
Tip: Jika proxy hanya diperlukan untuk pembangunan, bukan untuk menjalankan aplikasi, hapus variabel lingkungan di akhir Dockerfile. Ini akan mencegah kebocoran kredensial secara tidak sengaja dalam log kontainer.
Konfigurasi proxy dalam docker-compose.yml
Docker Compose menyederhanakan pengelolaan proxy untuk aplikasi multi-kontainer. Anda dapat mengatur proxy secara global atau untuk layanan tertentu.
Konfigurasi dasar dengan proxy untuk satu layanan:
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
# Database tidak menggunakan proxy
environment:
- POSTGRES_PASSWORD=secret
Penggunaan file .env untuk penyimpanan kredensial yang aman:
Buat file .env di direktori dengan docker-compose.yml:
PROXY_URL=http://username:password@proxy.example.com:8080
NO_PROXY=localhost,127.0.0.1
Rujuk ke variabel dalam 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
Konfigurasi proxy untuk membangun image dalam 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"
Menskalakan dengan proxy yang berbeda untuk setiap instance:
Jika Anda perlu menjalankan beberapa pemroses, masing-masing dengan proxy-nya sendiri, gunakan layanan terpisah:
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
Pengaturan proxy pada tingkat aplikasi
Beberapa aplikasi tidak mendukung variabel lingkungan standar HTTP_PROXY. Dalam kasus seperti itu, Anda perlu mengatur proxy dalam kode aplikasi atau file konfigurasi.
Python (perpustakaan requests):
import os
import requests
# Mendapatkan proxy dari variabel lingkungan
proxy_url = os.getenv('PROXY_URL', 'http://proxy.example.com:8080')
proxies = {
'http': proxy_url,
'https': proxy_url
}
# Menggunakan proxy dalam permintaan
response = requests.get('https://api.example.com/data', proxies=proxies)
print(response.json())
# Untuk proxy SOCKS5, instal pip install requests[socks]
# proxies = {
# 'http': 'socks5://user:pass@proxy.example.com:1080',
# 'https': 'socks5://user:pass@proxy.example.com:1080'
# }
Python (aiohttp untuk permintaan asinkron):
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 (perpustakaan 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 (modul https bawaan):
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 dengan proxy dalam kontainer 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')
# Mengatur proxy untuk Chrome
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument(f'--proxy-server={proxy_url}')
# Untuk autentikasi, gunakan ekstensi atau SSH tunnel
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://example.com')
print(driver.title)
driver.quit()
Puppeteer dengan proxy:
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();
// Autentikasi untuk proxy
await page.authenticate({
username: 'your-username',
password: 'your-password'
});
await page.goto('https://example.com');
console.log(await page.title());
await browser.close();
})();
Jenis proxy apa yang dipilih untuk Docker
Pemilihan jenis proxy tergantung pada tugas yang diselesaikan aplikasi Anda dalam kontainer Docker. Mari kita bahas skenario utama dan rekomendasi.
| Jenis proxy | Kapan digunakan | Keuntungan | Kekurangan |
|---|---|---|---|
| Datacenter | Pemrosesan, permintaan API, pengujian | Kecepatan tinggi, harga rendah, stabilitas | Mudah terdeteksi, diblokir di situs yang aman |
| Residensial | Bekerja dengan media sosial, marketplace, situs yang kompleks | IP nyata, risiko pemblokiran rendah, geografi yang luas | Lebih mahal, lebih lambat daripada datacenter, lalu lintas terbatas |
| Mobile | Pengujian API mobile, menghindari pemblokiran yang ketat | Anonymity maksimum, IP dari operator seluler | Harga tinggi, geografi terbatas |
Rekomendasi pemilihan untuk tugas tertentu:
Pemrosesan marketplace dan katalog produk: Jika Anda memproses Wildberries, Ozon, atau marketplace lainnya melalui kontainer Docker, gunakan proxy residensial. Platform-platform ini aktif memblokir IP datacenter. Atur rotasi proxy setiap 5-10 menit untuk meniru pengguna yang berbeda.
Pengujian dan pengembangan API: Untuk menguji API Anda sendiri atau integrasi dengan layanan eksternal, proxy datacenter cocok digunakan. Mereka menawarkan kecepatan tinggi dan stabilitas koneksi, yang penting untuk pengujian otomatis dalam CI/CD.
Automasi Selenium/Puppeteer: Saat menjalankan automasi browser dalam kontainer untuk bekerja dengan situs yang aman (media sosial, bank, aplikasi web yang kompleks), pilih proxy residensial. Mereka mengurangi kemungkinan captcha dan pemblokiran.
Pengujian geolokasi terdistribusi: Jika perlu memeriksa ketersediaan layanan dari berbagai negara, gunakan proxy residensial dengan pilihan geolokasi tertentu. Jalankan beberapa kontainer Docker, masing-masing dengan proxy dari negara mereka sendiri.
Tip untuk penskalaan: Saat menjalankan 10+ kontainer dengan proxy, gunakan kumpulan proxy dengan rotasi otomatis. Ini menyederhanakan pengelolaan dan mencegah penggunaan satu IP oleh beberapa kontainer.
Memecahkan masalah umum
Saat bekerja dengan proxy dalam kontainer Docker, muncul masalah umum. Mari kita bahas masalah yang paling sering terjadi dan cara mengatasinya.
Masalah 1: Kontainer tidak dapat terhubung ke proxy
Gejala: Kesalahan "Connection refused", "Proxy connection failed", timeout saat menjalankan kontainer.
Solusi:
- Periksa ketersediaan proxy dari host:
curl -x http://proxy:port https://example.com - Pastikan server proxy dapat diakses dari jaringan Docker. Jika proxy berada di localhost host, gunakan
host.docker.internal(Mac/Windows) atau IP host di jaringan bridge - Periksa aturan firewall — kontainer Docker mungkin diblokir untuk koneksi keluar
- Untuk proxy dengan autentikasi, periksa keakuratan username dan password, dan escape karakter khusus dalam URL
Contoh akses ke proxy di host:
# Mac/Windows
docker run -e HTTP_PROXY=http://host.docker.internal:8080 my-image
# Linux (temukan IP host di jaringan bridge)
ip addr show docker0 # Biasanya 172.17.0.1
docker run -e HTTP_PROXY=http://172.17.0.1:8080 my-image
Masalah 2: DNS tidak teratasi melalui proxy
Gejala: Kesalahan "Could not resolve host", permintaan DNS tidak melewati proxy.
Solusi:
- Gunakan proxy SOCKS5 alih-alih HTTP — SOCKS5 meneruskan permintaan DNS
- Atur DNS di Docker: tambahkan
--dns 8.8.8.8saat menjalankan kontainer - Untuk aplikasi yang tidak mendukung DNS melalui proxy, gunakan proxychains di dalam kontainer
# Dockerfile dengan proxychains
FROM python:3.11-slim
RUN apt-get update && apt-get install -y proxychains4
# Konfigurasi proxychains
RUN echo "strict_chain\nproxy_dns\n[ProxyList]\nsocks5 proxy.example.com 1080" > /etc/proxychains4.conf
# Menjalankan aplikasi melalui proxychains
CMD ["proxychains4", "python", "app.py"]
Masalah 3: Kebocoran IP asli kontainer
Gejala: Layanan target melihat IP host atau kontainer alih-alih IP proxy.
Solusi:
- Periksa apakah aplikasi benar-benar menggunakan proxy — lakukan permintaan ke https://api.ipify.org
- Pastikan semua klien HTTP dalam kode diatur untuk menggunakan proxy
- Untuk koneksi WebRTC dan WebSocket, proxy mungkin tidak berfungsi — matikan WebRTC di browser
- Periksa header permintaan — beberapa perpustakaan menambahkan X-Forwarded-For dengan IP asli
Uji kebocoran IP di kontainer:
# Tanpa proxy
docker run --rm curlimages/curl:latest curl https://api.ipify.org
# Dengan proxy
docker run --rm \
-e HTTPS_PROXY=http://proxy.example.com:8080 \
curlimages/curl:latest curl https://api.ipify.org
Masalah 4: Kinerja lambat melalui proxy
Gejala: Latensi tinggi, timeout, lambat dalam memuat data.
Solusi:
- Periksa kecepatan proxy secara langsung dari host — mungkin masalah ada pada proxy itu sendiri
- Perpanjang timeout dalam aplikasi untuk bekerja dengan proxy yang lambat
- Gunakan koneksi keep-alive untuk menggunakan kembali koneksi TCP
- Untuk proxy residensial, kecepatan lambat adalah hal yang normal, optimalkan jumlah permintaan
- Atur kumpulan koneksi dalam klien HTTP untuk permintaan paralel
Masalah 5: Proxy berfungsi untuk HTTP, tetapi tidak untuk HTTPS
Gejala: Permintaan HTTP berhasil, tetapi HTTPS mengembalikan kesalahan SSL/TLS.
Solusi:
- Pastikan variabel HTTPS_PROXY diatur (tidak hanya HTTP_PROXY)
- Gunakan http:// dalam URL proxy untuk HTTPS_PROXY, bukan https://
- Periksa apakah proxy mendukung metode CONNECT untuk tunneling HTTPS
- Untuk proxy dengan sertifikat self-signed, matikan verifikasi SSL (hanya untuk pengujian!)
Keamanan dan pengelolaan kredensial
Menyimpan kredensial proxy dalam kontainer Docker memerlukan perhatian khusus terhadap keamanan. Pengelolaan password yang tidak benar dapat menyebabkan kebocoran dalam log, image, atau repositori.
Gunakan Docker Secrets untuk produksi:
Docker Swarm mendukung mekanisme secrets untuk penyimpanan password yang aman. Buat secret:
echo "http://username:password@proxy.example.com:8080" | docker secret create proxy_url -
Gunakan dalam docker-compose untuk 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
Variabel lingkungan melalui file (.env):
Untuk pengembangan, gunakan file .env, tetapi JANGAN pernah meng-commit-nya ke Git. Tambahkan ke .gitignore:
# .gitignore
.env
.env.local
*.env
Buat .env.example tanpa kredensial yang nyata:
# .env.example
PROXY_URL=http://username:password@proxy.example.com:8080
NO_PROXY=localhost,127.0.0.1
Hindari hardcoding kredensial dalam image:
Berbahaya: Jangan pernah menulis password langsung dalam Dockerfile menggunakan ENV. Nilai-nilai ini disimpan dalam lapisan image dan dapat diakses bahkan setelah dihapus.
# ❌ BURUK - password akan tetap ada dalam image
FROM python:3.11
ENV HTTP_PROXY=http://user:secretpass@proxy.com:8080
COPY . /app
# ✅ BAIK - kirim melalui argumen build atau variabel runtime
FROM python:3.11
ARG HTTP_PROXY
# Hanya digunakan selama pembangunan, tidak disimpan dalam image akhir
Gunakan multi-stage builds untuk membersihkan kredensial:
# Tahap pembangunan dengan proxy
FROM python:3.11 AS builder
ARG HTTP_PROXY
ENV HTTP_PROXY=${HTTP_PROXY}
COPY requirements.txt .
RUN pip install -r requirements.txt
# Tahap akhir tanpa variabel proxy
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"]
Rotasi kredensial proxy:
Jika penyedia proxy Anda mendukung API untuk menghasilkan kredensial sementara, gunakan itu alih-alih password statis. Buat skrip init di dalam kontainer:
#!/bin/bash
# entrypoint.sh
# Mendapatkan kredensial sementara dari API
PROXY_CREDS=$(curl -s https://api.proxyservice.com/generate-temp-auth)
export HTTP_PROXY="http://${PROXY_CREDS}@proxy.example.com:8080"
# Menjalankan aplikasi
exec python app.py
Logging tanpa kebocoran password:
Atur logging sehingga variabel dengan proxy tidak muncul dalam output:
import os
import re
def safe_log_env():
"""Logging variabel lingkungan tanpa password"""
for key, value in os.environ.items():
if 'PROXY' in key:
# Menyembunyikan password dalam URL
safe_value = re.sub(r'://([^:]+):([^@]+)@', r'://\1:****@', value)
print(f"{key}={safe_value}")
else:
print(f"{key}={value}")
safe_log_env()
Kesimpulan
Mengatur proxy dalam kontainer Docker adalah keterampilan penting bagi pengembang yang bekerja dengan pemrosesan data, automasi, dan sistem terdistribusi. Anda telah belajar bagaimana mengatur proxy melalui variabel lingkungan, Dockerfile, dan docker-compose, bagaimana mengintegrasikan proxy dalam kode aplikasi di Python dan Node.js, serta cara menyelesaikan masalah umum dengan koneksi dan keamanan.
Poin kunci untuk bekerja dengan sukses dengan proxy di Docker: gunakan variabel lingkungan untuk fleksibilitas, simpan kredensial dengan aman melalui secrets atau file .env, pilih jenis proxy sesuai dengan tugas, dan selalu uji untuk memastikan tidak ada kebocoran IP asli sebelum menjalankan di produksi.
Untuk sebagian besar tugas pemrosesan dan automasi dalam kontainer Docker, kami merekomendasikan menggunakan proxy residensial — mereka memberikan anonimitas tinggi dan risiko pemblokiran minimal saat bekerja dengan situs dan API yang aman. Namun, jika Anda memerlukan kecepatan maksimum untuk pengujian API atau tugas internal, pertimbangkan untuk menggunakan proxy datacenter.