Pendahuluan
Dalam lingkungan Docker, container dapat saling berkomunikasi jika berada di dalam jaringan yang sama. Salah satu tantangan yang muncul adalah ketika container sudah ada dan IP atau jaringan berubah (misalnya, saat berpindah WiFi). Solusi yang efektif untuk mengatasi masalah ini adalah dengan menggunakan nama container sebagai hostname. Dengan cara ini, container dapat tetap berkomunikasi meskipun alamat IP berubah, tanpa perlu memetakan ulang IP.
Artikel ini akan membahas cara menambahkan container yang sudah ada ke dalam jaringan Docker yang sama, serta bagaimana menggunakan Axios untuk komunikasi antar container melalui hostname.
Masalah: Perubahan IP Saat Pindah Jaringan atau WiFi
Saat container Docker sudah berjalan secara terpisah tanpa jaringan yang sama, komunikasi antar container bisa terhambat, terutama jika IP dari host atau container berubah ketika berpindah WiFi atau jaringan. Hal ini bisa menyebabkan request antar container gagal.
Dengan memanfaatkan jaringan internal Docker dan menggunakan nama container sebagai hostname, masalah ini dapat diatasi. Container dapat berkomunikasi melalui nama container tanpa khawatir tentang perubahan IP.
Solusi: Menggunakan Nama Container sebagai Hostname dengan Axios
Untuk membuat container Docker yang sudah ada bisa berkomunikasi, kita dapat menambahkan container ke jaringan Docker yang sama dan kemudian menggunakan nama container sebagai hostname untuk komunikasi. Axios akan memanfaatkan nama container ini untuk mengirim request.
Langkah 1: Membuat Jaringan Docker (Jika Belum Ada)
Jika jaringan Docker belum dibuat, buat jaringan baru yang akan digunakan oleh container-container yang perlu berkomunikasi. Gunakan perintah berikut untuk membuat jaringan baru:
docker network create my-network
Jaringan my-network akan digunakan untuk menghubungkan container yang sudah ada.
Langkah 2: Menambahkan Container yang Sudah Berjalan ke Jaringan Docker
Jika container sudah berjalan, gunakan perintah docker network connect untuk menghubungkan container ke jaringan my-network tanpa perlu menghentikan atau memulai ulang container.
- Untuk container pertama (misalnya
service1-container):docker network connect my-network service1-container - Untuk container kedua (misalnya
service2-container):docker network connect my-network service2-container
Sekarang, kedua container tersebut sudah terhubung ke jaringan my-network dan dapat berkomunikasi menggunakan nama container sebagai hostname.
Langkah 3: Menyiapkan File .env
Agar komunikasi antara container lebih fleksibel, URL service target dapat disimpan di file .env. Misalnya, buat file .env di root proyek dengan konten berikut:
SERVICE2_URL=http://service2-container:3000
Di sini, service2-container adalah nama container yang digunakan sebagai hostname, dan port 3000 adalah port yang digunakan oleh service tersebut.
Langkah 4: Memuat Variabel dari .env di Node.js
Gunakan package dotenv untuk memuat variabel dari file .env ke dalam aplikasi Node.js. Jika belum terpasang, instal dotenv terlebih dahulu:
npm install dotenv
Kemudian, tambahkan kode berikut di file JavaScript yang memerlukan URL dari .env:
require('dotenv').config();
Langkah 5: Menggunakan Axios dengan Nama Container dari .env
Setelah file .env siap dan variabel dimuat, Axios dapat digunakan untuk mengirim request ke container lain menggunakan nama container sebagai hostname.
Berikut adalah contoh kode lengkapnya:
require('dotenv').config(); // Memuat variabel dari .env
const axios = require('axios');
// Mengambil URL dari variabel .env
const service2Url = process.env.SERVICE2_URL;
axios.get(`${service2Url}/api/data`)
.then(response => {
console.log('Response:', response.data);
})
.catch(error => {
console.error('Error:', error);
});
Dengan konfigurasi ini, Axios akan mengirim request ke service2-container melalui nama container, yang berfungsi sebagai hostname. Ini memastikan komunikasi tetap lancar meskipun ada perubahan IP atau jaringan.
Keuntungan Solusi Ini
- Mengatasi Masalah Perubahan IP: Dengan menggunakan nama container sebagai hostname, komunikasi antar container tetap berjalan meskipun IP berubah akibat perpindahan jaringan.
- Konfigurasi Fleksibel: Menyimpan URL di file
.envmemungkinkan perubahan konfigurasi tanpa perlu mengubah kode aplikasi. Ini sangat berguna dalam lingkungan pengembangan dan produksi. - Komunikasi Antar Container Stabil: Container yang berada di jaringan Docker yang sama dapat saling berkomunikasi tanpa perlu memetakan ulang IP, cukup menggunakan nama container.
Kesimpulan
Jika container Docker sudah berjalan terpisah, komunikasi antar container tetap bisa dilakukan dengan cara menambahkan container ke jaringan yang sama menggunakan perintah docker network connect. Setelah itu, Axios dapat digunakan untuk mengirim request antar container menggunakan nama container sebagai hostname, dengan URL yang diambil dari file .env.
Dengan solusi ini, komunikasi antar container Docker menjadi stabil, fleksibel, dan tidak terpengaruh oleh perubahan IP akibat perpindahan jaringan atau WiFi.