Di artikel sebelumnya, kita telah membahas langkah-langkah Setup Docker di VPS Linux: Menjaga Aplikasi Tetap Aktif 24/7 Tanpa Takut Reboot untuk membangun fondasi server yang stabil dan terproteksi.
Setelah mesin Docker siap dan container mulai dijalankan, tantangan arsitektur berikutnya yang sering dihadapi adalah:
"Bagaimana cara menghubungkan beberapa container terpisahβseperti aplikasi web, database, dan reverse proxyβagar dapat bertukar data secara aman tanpa membuka port ke internet publik?"
Di sinilah peran penting Docker Network. Fitur ini bukan sekadar alat penghubung, melainkan lapisan isolasi dan keamanan yang memungkinkan aplikasi berkomunikasi secara privat di dalam server host.
Artikel ini mengulas alur praktis pengelolaan jaringan di Docker, mulai dari konsep dasar isolasi hingga teknik menghubungkan container lintas direktori di lingkungan produksi.
ποΈ 1. Konsep Dasar: Mengapa Container Butuh Jaringan Privat?
Secara default, Docker mengisolasi setiap container dalam ruang lingkup (namespace) tersendiri. Container tidak memiliki akses langsung ke container lain kecuali mereka ditempatkan pada jaringan virtual yang sama.
Docker Network berfungsi sebagai virtual switch di dalam server host:
- Komunikasi Privat: Seluruh pertukaran data antar-container berlangsung melalui antarmuka virtual internal server, tanpa pernah melintasi internet publik.
- Minimalisir Serangan (Reduced Attack Surface): Layanan sensitif seperti database MySQL atau Redis cache tidak perlu memetakan port (port binding) ke IP publik, sehingga terlindung dari pemindaian bot luar.
Gambaran Alur Arsitektur Jaringan:
[ Internet Publik ]
β
βΌ (Hanya port tertentu via Firewall)
ββββββββββββββββββββ [ Server Host / VPS ] ββββββββββββββββββββ
β β
β βββββββββββββββββββββββββ β
β β Docker Network Switch β β
β βββββββββββββ¬ββββββββββββ β
β β β
β βββββββββββββββββ΄ββββββββββββββββ β
β βΌ βΌ β
β [ Container Web ] [ Container Database ] β
β (Port 3000 Internal) (Port 5432 Privat) β
β β² β² β
β ββββββ Komunikasi Privat ββββββββ β
β (Tanpa Buka Port Luar) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β οΈ 2. Jebakan Jaringan Bawaan (bridge Default)
Saat pertama kali mengelola Docker, Anda mungkin menyadari bahwa Docker sudah menyediakan jaringan bawaan bertipe bridge secara otomatis:
NAME DRIVER SCOPE
bridge bridge local
host host local
none null local
(Catatan: Mode host dan none adalah mode khusus untuk bypass jaringan atau isolasi mutlak yang jarang digunakan pada kebutuhan aplikasi web standar).
Banyak developer mengira mereka cukup memasukkan semua container ke dalam jaringan bridge bawaan ini. Namun, ada satu batasan krusial:
Jaringan
bridgebawaan Docker TIDAK mendukung DNS otomatis (Service Discovery).
Artinya:
- Container yang berjalan di jaringan
bridgebawaan tidak bisa saling memanggil menggunakan nama container. - Aplikasi web Anda tidak bisa memanggil
http://database:5432. - Anda terpaksa harus menggunakan alamat IP privat yang dinamis, yang akan langsung berubah dan memutus koneksi setiap kali container di-restart.
π 3. Solusi Standar: Membuat Jaringan Sendiri (Service Discovery)
Untuk mengatasi batasan di atas, best practice di industri adalah selalu membuat jaringan sendiri (User-Defined Network).
Ketika Anda membuat jaringan sendiri bertipe bridge, Docker secara otomatis mengaktifkan Embedded DNS Server (127.0.0.11) di balik layar:
- Setiap container yang terhubung ke jaringan tersebut dapat saling memanggil cukup dengan menggunakan nama container atau nama service sebagai hostname.
- Anda tidak perlu lagi bergantung pada alamat IP yang dinamis.
Alur Kerja DNS Internal di Balik Layar:
[ Container Web ] [ Embedded DNS: 127.0.0.11 ]
β β
ββββ 1. "Siapa alamat IP untuk host 'database-app'?" ββββββββββββΊβ
β β
ββββ 2. "Alamat IP privatnya adalah 172.18.0.3" ββββββββββββββββββ
β
βΌ 3. Koneksi privat langsung terbentuk
[ Container Database: 172.18.0.3 ]
Contoh Penerapan pada Konfigurasi Aplikasi:
Pada variabel koneksi database di aplikasi web, Anda cukup merujuk pada nama container database:
DATABASE_URL=postgresql://user:password@database-app:5432/production_db
Konfigurasi aplikasi Anda menjadi portabel, konsisten, dan kebal terhadap perubahan alamat IP saat container di-deploy ulang.
π 4. Arsitektur Multi-Direktori dengan Jaringan Eksternal
Dalam arsitektur server yang teratur, aplikasi biasanya dipisahkan ke dalam beberapa direktori independen dengan file docker-compose.yml masing-masing (misalnya: direktori aplikasi web terpisah dari direktori reverse proxy atau tunnel).
Secara default, Docker Compose hanya menghubungkan container di dalam direktori yang sama. Untuk menjembatani komunikasi lintas direktori, kita dapat menerapkan User-Defined External Network.
Peta Arsitektur Lintas Direktori:
βββββββββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββββββββ
β Direktori: /opt/web-store/ β β Direktori: /opt/tunnel/ β
β (docker-compose.yml) β β (docker-compose.yml) β
β β β β
β [ Service: web ] β β [ Service: proxy ] β
ββββββββββββββββββ¬βββββββββββββββββ ββββββββββββββββββ¬βββββββββββββββββ
β β
βββββββββββββββββΊ [ gateway-net ] βββββββββββββββββ
(Jaringan Eksternal Bersama)
Langkah Penerapan:
Langkah 1: Membuat Jaringan Bersama Mandiri
Jalankan perintah pembuatan jaringan melalui terminal:
docker network create gateway-net
Langkah 2: Menghubungkan Service via Docker Compose
Di dalam file docker-compose.yml masing-masing layanan, cantumkan jaringan tersebut dengan parameter external: true:
services:
web-service:
image: web-app:latest
container_name: web-service
restart: unless-stopped
networks:
- gateway-net
networks:
gateway-net:
external: true
Keuntungan Arsitektur Ini:
- Modularitas Tinggi: Pembaruan atau restart pada satu layanan tidak akan menghentikan siklus hidup layanan lain.
- Keteraturan Proyek: Setiap komponen aplikasi memiliki folder dan konfigurasi yang rapi dan terisolasi.
- Keamanan Maksimal: Hanya layanan yang benar-benar membutuhkan integrasi bersama yang didaftarkan ke jaringan eksternal tersebut.
π§° 5. Perintah Esensial Manajemen Docker Network
Berikut adalah perintah CLI standar untuk memelihara dan memeriksa status jaringan di server Anda:
# Menampilkan seluruh daftar jaringan yang terdaftar di sistem
docker network ls
# Membuat jaringan baru bertipe bridge
docker network create [nama-jaringan]
# Menginspeksi detail konfigurasi, subnet, dan container yang terhubung
docker network inspect [nama-jaringan]
# Menghubungkan container yang sedang aktif ke jaringan tertentu
docker network connect [nama-jaringan] [nama-container]
# Memutus koneksi container dari jaringan
docker network disconnect [nama-jaringan] [nama-container]
# Membersihkan seluruh jaringan virtual yang sudah tidak digunakan
docker network prune
π― Kesimpulan
Pengelolaan jaringan yang terstruktur adalah pilar utama dari arsitektur container yang aman dan andal:
-
Hindari Jaringan Default: Hindari menumpuk seluruh container pada jaringan
bridgebawaan pabrik karena tidak mendukung DNS otomatis. - Optimalkan Service Discovery: Gunakan User-Defined Network agar container dapat saling terhubung hanya dengan memanggil nama layanannya.
-
Terapkan External Network: Gunakan jaringan eksternal bersama (
external: true) untuk menghubungkan komponen multi-direktori secara modular tanpa membuka port publik.
π Seri Panduan Docker VPS
Artikel ini merupakan bagian dari seri dokumentasi teknis Docker untuk infrastruktur server:
- π Bagian 1: Setup Docker di VPS Linux: Menjaga Aplikasi Tetap Aktif 24/7 Tanpa Takut Reboot β Fondasi Sistem Operasi, Swap RAM, UFW Firewall, dan Auto-restart Docker.
- π Bagian 2: Panduan Praktis Docker Network: Mengelola Komunikasi Antar-Container Secara Aman dan Efektif (Artikel ini) β DNS discovery, mitigasi port, dan integrasi multi-proyek.
Bagaimana pendekatan arsitektur jaringan yang Anda terapkan dalam pengelolaan container di lingkungan kerja Anda? Bagikan pengalaman atau pandangan teknis Anda di kolom komentar.
Top comments (0)