Lewati ke isi

Server & Infrastruktur

Cara Memakai Docker Network agar Container Saling Bicara

Panduan membuat user-defined network di Docker agar container saling memanggil lewat nama, memisahkan jaringan internal, dan memakainya di Compose.

Terbit 5 menit baca

Jawaban singkat

Buat jaringan sendiri dengan docker network create, lalu jalankan container di jaringan itu. Container di user-defined network bisa saling memanggil lewat nama berkat DNS bawaan Docker, sesuatu yang tidak tersedia di jaringan bridge default.

Daftar isi
  1. Kenapa jaringan bridge default tidak cukup?
  2. Langkah membuat jaringan dan menyambungkan container
  3. 1. Lihat jaringan yang sudah ada
  4. 2. Buat jaringan baru
  5. 3. Jalankan container di jaringan itu
  6. 4. Uji pencarian nama
  7. 5. Sambungkan container yang sudah berjalan
  8. 6. Periksa isi jaringan
  9. Memisahkan jaringan publik dan internal
  10. Jaringan di Docker Compose
  11. Ringkasan driver jaringan Docker
  12. Pertanyaan yang sering diajukan

Pernah menjalankan container aplikasi dan container database terpisah, lalu aplikasinya gagal tersambung ke db:5432 dengan pesan nama host tidak ditemukan? Penyebabnya hampir selalu jaringan. Keduanya mungkin berada di jaringan bridge bawaan Docker, yang tidak menyediakan pencarian nama antar container.

Solusinya adalah membuat user-defined network. Container yang tergabung di jaringan buatanmu bisa saling memanggil lewat nama container atau alias, dan terisolasi dari container lain yang tidak ikut jaringan itu. Berikut langkahnya dari nol sampai rapi di Compose.

Kenapa jaringan bridge default tidak cukup?

Saat Docker terpasang, ia membuat jaringan bernama bridge. Container yang dijalankan tanpa opsi --network otomatis masuk ke sana. Container di jaringan ini memang bisa saling terhubung, tetapi hanya lewat alamat IP, dan IP itu bisa berubah setiap container dibuat ulang. Fitur lama --link untuk mengatasi hal ini sudah lama berstatus legacy.

User-defined bridge network memperbaiki semua itu. Dokumentasi Docker menyebut beberapa kelebihannya: pencarian nama otomatis antar container, isolasi yang lebih baik karena hanya container yang kamu masukkan yang bisa saling bicara, serta container bisa disambung dan dilepas dari jaringan tanpa harus dihentikan.

Langkah membuat jaringan dan menyambungkan container

1. Lihat jaringan yang sudah ada

docker network ls

Kamu akan melihat setidaknya bridge, host, dan none. Jaringan buatan Compose juga muncul di sini dengan nama <nama-proyek>_default.

2. Buat jaringan baru

docker network create appnet

Tanpa opsi tambahan, driver yang dipakai adalah bridge. Kalau perlu subnet tertentu agar tidak bentrok dengan jaringan kantor atau VPN, tambahkan --subnet 172.30.0.0/24.

3. Jalankan container di jaringan itu

docker run -d --name db --network appnet \
  -e POSTGRES_PASSWORD=rahasia postgres:17

docker run -d --name app --network appnet \
  -e DATABASE_HOST=db -p 8080:8080 contoh/app:latest

Perhatikan bahwa database tidak diberi -p. Ia tidak perlu dibuka ke internet, cukup dijangkau oleh app lewat jaringan internal. Hanya app yang mempublikasikan port ke host.

4. Uji pencarian nama

docker exec -it app getent hosts db

Bila keluar alamat IP diikuti nama db, DNS bawaan Docker bekerja. Di dalam container, resolver menunjuk ke 127.0.0.11, server DNS internal milik Docker yang menjawab nama container di jaringan yang sama. Kalau image tidak punya getent, coba ping db atau nslookup db bila tersedia.

5. Sambungkan container yang sudah berjalan

docker network connect appnet nama-container-lain
docker network disconnect appnet nama-container-lain

Satu container boleh tergabung di beberapa jaringan sekaligus. Ini berguna untuk reverse proxy yang harus menjangkau beberapa aplikasi yang saling terpisah.

6. Periksa isi jaringan

docker network inspect appnet

Bagian Containers menampilkan container yang tergabung beserta IP-nya. Perintah ini yang pertama kali dibuka saat ada koneksi yang tidak nyambung.

Memisahkan jaringan publik dan internal

Pola yang aman untuk server produksi adalah dua jaringan. Jaringan frontend berisi reverse proxy dan aplikasi. Jaringan backend berisi aplikasi dan database. Reverse proxy tidak bisa menyentuh database secara langsung, karena tidak satu jaringan.

Untuk jaringan yang sama sekali tidak boleh keluar ke internet, ada opsi --internal:

docker network create --internal backend

Container yang hanya tergabung di jaringan internal tidak punya rute keluar. Cocok untuk database yang tidak perlu mengunduh apa pun. Ingat juga bahwa port yang dipublikasikan dengan -p bisa melewati aturan firewall host di beberapa konfigurasi, jadi baca juga cara mengamankan Docker agar port tidak bocor.

Jaringan di Docker Compose

Compose otomatis membuat satu jaringan default per proyek, dan setiap service bisa memanggil service lain lewat nama service-nya. Untuk pemisahan seperti di atas, deklarasikan jaringan sendiri:

services:
  proxy:
    image: nginx:stable
    ports:
      - "80:80"
    networks: [frontend]

  app:
    image: contoh/app:latest
    networks: [frontend, backend]

  db:
    image: postgres:17
    environment:
      POSTGRES_PASSWORD: rahasia
    networks: [backend]

networks:
  frontend:
  backend:
    internal: true

Di sini proxy bisa memanggil app, app bisa memanggil db, tapi proxy tidak bisa menjangkau db. Kalau dua proyek Compose berbeda perlu berbagi jaringan, buat jaringan lebih dulu dengan docker network create, lalu di Compose tandai dengan external: true.

Ringkasan driver jaringan Docker

DriverKapan dipakaiPencarian nama antar container
bridge defaultUji cepat satu containerTidak
bridge buatan sendiriHampir semua kebutuhan di satu hostYa
hostContainer memakai jaringan host langsung, tanpa isolasiTidak relevan
noneContainer tanpa jaringan sama sekaliTidak
overlayBeberapa host dalam Docker SwarmYa
macvlanContainer butuh alamat MAC sendiri di LANTergantung konfigurasi

Untuk satu VPS, user-defined bridge sudah cukup di hampir semua kasus. Overlay baru relevan saat kamu menjalankan beberapa server sekaligus, topik yang dibahas di Docker Swarm atau Kubernetes untuk tim kecil.

Pertanyaan yang sering diajukan

Apakah nama container bisa dipakai lintas jaringan yang berbeda?

Tidak. DNS bawaan Docker hanya menjawab nama container yang berada di jaringan yang sama. Kalau dua container perlu bicara, keduanya harus tergabung di minimal satu jaringan yang sama.

Apakah localhost di dalam container menunjuk ke host?

Tidak. localhost di dalam container adalah container itu sendiri. Untuk menjangkau layanan di host, pakai IP gateway jaringan atau host.docker.internal yang di Linux perlu ditambahkan dengan opsi --add-host=host.docker.internal:host-gateway.

Bagaimana menghapus jaringan yang tidak terpakai?

Pakai docker network rm nama-jaringan untuk satu jaringan, atau docker network prune untuk menghapus semua jaringan yang tidak dipakai container mana pun.

Kenapa subnet jaringan Docker bentrok dengan jaringan kantor atau VPN?

Docker memilih subnet dari rentang privat secara otomatis. Bila bentrok, buat jaringan dengan --subnet yang jelas berbeda, atau atur default-address-pools di /etc/docker/daemon.json lalu restart Docker.

Checklist singkat sebelum selesai:

  • Container yang perlu saling bicara berada di user-defined network yang sama.
  • Database dan layanan internal tidak memakai -p.
  • Jaringan backend ditandai internal bila tidak butuh internet.
  • docker network inspect menampilkan anggota yang sesuai rencana.

Sumber & referensi

Baca juga