Port Mapping & Exposure #

Salah satu konsep yang paling sering dipakai tetapi juga paling sering disalahpahami di Docker adalah port mapping dan port exposure. Banyak developer bisa menjalankan container dengan -p 8080:80, tetapi tidak benar-benar memahami apa yang sebenarnya terjadi di level OS, network namespace, dan Docker networking.

Agar lebih mudah dipahami, mari kita mulai dengan gambaran besar berikut.

+-------------------+        +-------------------+
|     Host OS       |        |   Docker Network  |
|                   |        |                   |
|  Browser / Client | -----> |  veth / bridge    |
|   localhost:8080  |        |                   |
|                   |        |   Container       |
|                   |        |   App :80         |
+-------------------+        +-------------------+
        ^                                ^
        |                                |
        +------ Port Mapping (8080:80)---+

Diagram di atas menunjukkan bahwa:

  • Aplikasi di dalam container tidak langsung terekspos ke host
  • Docker membuat jembatan jaringan (bridge) dan port forwarding
  • Port mapping adalah mekanisme agar aplikasi di dalam container bisa diakses dari luar

Artikel ini akan membahas secara mendalam:

  • Apa itu port exposure
  • Apa itu port mapping
  • Perbedaan EXPOSE dan -p
  • Bagaimana Docker melakukan forwarding port
  • Best practice dan kesalahan umum

Apa Itu Port Exposure di Docker? #

Port exposure adalah konsep di mana sebuah container mendeklarasikan port yang digunakan oleh aplikasinya.

Di Docker, ini biasanya dilakukan melalui instruksi:

EXPOSE 80

Hal penting yang sering disalahpahami:

EXPOSE TIDAK membuat port bisa diakses dari host atau internet.

EXPOSE hanya berfungsi sebagai:

  • Dokumentasi internal image
  • Informasi bagi Docker dan orchestration tool
  • Petunjuk port default yang digunakan container

Fungsi Utama EXPOSE #

  • Menjelaskan port mana yang digunakan aplikasi
  • Membantu tooling seperti Docker Compose atau Kubernetes
  • Menjadi metadata image

Tanpa EXPOSE, container tetap bisa berjalan dan menerima traffic selama port mapping dilakukan.


Apa Itu Port Mapping di Docker? #

Port mapping adalah mekanisme untuk menghubungkan port di host dengan port di dalam container.

Contoh paling umum:

docker run -p 8080:80 nginx

Artinya:

  • Port 8080 di host
  • Diteruskan ke port 80 di container

Sehingga:

http://localhost:8080  --->  container:80

Sintaks Port Mapping #

-p <host_port>:<container_port>

Contoh lain:

-p 127.0.0.1:8080:80

Artinya:

  • Port hanya bisa diakses dari localhost
  • Tidak terbuka ke network lain

Perbedaan EXPOSE vs -p #

Ini adalah salah satu bagian terpenting.

AspekEXPOSE-p / –publish
Membuka port ke host❌ Tidak✅ Ya
Hanya dokumentasi✅ Ya❌ Tidak
Wajib agar bisa diakses❌ Tidak✅ Ya
Digunakan diDockerfiledocker run / compose

Kesimpulan singkat:

  • EXPOSE = memberi tahu
  • -p = benar-benar membuka akses

Bagaimana Docker Melakukan Port Mapping? #

Di balik layar, Docker melakukan beberapa hal:

  1. Membuat network namespace untuk container
  2. Menghubungkan container ke docker bridge (docker0)
  3. Menambahkan aturan iptables / NAT di host
  4. Meneruskan traffic dari host port ke IP container

Secara konseptual:

Host Port (8080)
     |
     v
iptables (DNAT)
     |
     v
Container IP:80

Inilah alasan kenapa:

  • Container punya IP sendiri
  • Aplikasi di container tidak sadar dirinya diakses lewat port berbeda

Port Mapping di Docker Compose #

Contoh di docker-compose.yml:

services:
  web:
    image: nginx
    ports:
      - "8080:80"

Docker Compose secara otomatis:

  • Membuat network
  • Mengatur bridge
  • Mengatur port forwarding

Mode Singkat #

ports:
  - "80"

Artinya:

  • Container expose port 80
  • Host port dipilih secara random

Cek dengan:

docker ps

Port Exposure Tanpa Port Mapping #

Container tetap bisa berkomunikasi antar container tanpa port mapping.

Contoh:

services:
  api:
    image: my-api
  web:
    image: my-web

Jika web mengakses api:

http://api:8080

Ini bekerja karena:

  • Docker network bersifat internal
  • Tidak perlu expose ke host

Ini sangat umum di arsitektur microservices.


Keamanan: Risiko Port Mapping #

Membuka port berarti:

  • Membuka permukaan serangan
  • Bisa diakses dari luar jika tidak dibatasi

Kesalahan umum:

  • Menggunakan -p 0.0.0.0:3306:3306 untuk database
  • Mengekspos Redis, MongoDB, MySQL langsung ke publik

Best Practice Keamanan #

  • Jangan expose database ke host
  • Gunakan 127.0.0.1:port:port untuk lokal
  • Gunakan reverse proxy (Nginx, Traefik)
  • Batasi port hanya untuk kebutuhan

Best Practice Port Mapping & Exposure #

Beberapa praktik terbaik yang direkomendasikan:

  1. Gunakan EXPOSE sebagai dokumentasi

  2. Jangan mengandalkan EXPOSE untuk security

  3. Gunakan port mapping hanya di edge service

  4. Hindari hardcode port jika tidak perlu

  5. Untuk production, gunakan:

    • Load balancer
    • Reverse proxy
    • Orchestrator (Kubernetes)

Kesimpulan #

Port exposure dan port mapping adalah dua konsep yang berbeda tetapi saling melengkapi:

  • EXPOSE membantu manusia dan tooling memahami image
  • Port mapping (-p) memungkinkan komunikasi dari host ke container

Memahami cara kerja port mapping di Docker akan membantu Anda:

  • Mendesain arsitektur yang lebih aman
  • Menghindari kesalahan konfigurasi
  • Lebih percaya diri saat masuk ke Docker Compose dan Kubernetes

Pada artikel berikutnya, konsep ini akan menjadi dasar untuk memahami:

  • Docker networking lebih lanjut
  • Reverse proxy
  • Service mesh dan ingress di Kubernetes
About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact