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
EXPOSEdan-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:
EXPOSETIDAK 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
8080di host - Diteruskan ke port
80di 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.
| Aspek | EXPOSE | -p / –publish |
|---|---|---|
| Membuka port ke host | ❌ Tidak | ✅ Ya |
| Hanya dokumentasi | ✅ Ya | ❌ Tidak |
| Wajib agar bisa diakses | ❌ Tidak | ✅ Ya |
| Digunakan di | Dockerfile | docker run / compose |
Kesimpulan singkat:
EXPOSE= memberi tahu-p= benar-benar membuka akses
Bagaimana Docker Melakukan Port Mapping? #
Di balik layar, Docker melakukan beberapa hal:
- Membuat network namespace untuk container
- Menghubungkan container ke docker bridge (
docker0) - Menambahkan aturan iptables / NAT di host
- 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:3306untuk database - Mengekspos Redis, MongoDB, MySQL langsung ke publik
Best Practice Keamanan #
- Jangan expose database ke host
- Gunakan
127.0.0.1:port:portuntuk lokal - Gunakan reverse proxy (Nginx, Traefik)
- Batasi port hanya untuk kebutuhan
Best Practice Port Mapping & Exposure #
Beberapa praktik terbaik yang direkomendasikan:
Gunakan
EXPOSEsebagai dokumentasiJangan mengandalkan
EXPOSEuntuk securityGunakan port mapping hanya di edge service
Hindari hardcode port jika tidak perlu
Untuk production, gunakan:
- Load balancer
- Reverse proxy
- Orchestrator (Kubernetes)
Kesimpulan #
Port exposure dan port mapping adalah dua konsep yang berbeda tetapi saling melengkapi:
EXPOSEmembantu 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