Cara Port Mapping Docker dengan CLI dan Compose
Port mapping Docker dilakukan dengan format -p HOST_PORT:CONTAINER_PORT ketika kamu membuat container. Sebagai contoh, perintah docker run -d --name web -p 8080:80 nginx:alpine meneruskan permintaan dari port 8080 pada host ke port 80 di dalam container.
Setelah perintah tersebut berjalan, aplikasi dapat dibuka melalui http://localhost:8080 dari host. Panduan ini membahas prosesnya dari persiapan, penerapan melalui CLI dan Docker Compose, pembatasan akses, hingga troubleshooting.
Memahami Urutan Host Port dan Container Port
Docker mengisolasi jaringan container dari host. Karena itu, aplikasi yang berjalan pada port tertentu di dalam container belum otomatis dapat diakses dari browser atau perangkat lain.
|
1 |
docker run -p HOST_PORT:CONTAINER_PORT nama-image |
Bagian kiri merupakan port pada host, sedangkan bagian kanan merupakan port yang didengarkan aplikasi di dalam container. Jika aplikasi menggunakan port 3000 di dalam container dan kamu ingin membukanya melalui port 8080 pada host, gunakan -p 8080:3000.
Port mapping juga sering disebut port publishing. Jika kamu masih mempelajari konsep image, container, dan jaringan, baca panduan Docker untuk pemula sebelum melanjutkan.
Persiapan Sebelum Melakukan Port Mapping
Pastikan Docker Engine atau Docker Desktop sudah aktif dan akunmu dapat menjalankan perintah Docker. Pengguna server Ubuntu dapat mengikuti panduan cara install Docker di Ubuntu jika Docker belum tersedia.
Kamu juga perlu mengetahui port yang digunakan aplikasi di dalam container. Informasi tersebut biasanya tersedia pada dokumentasi image, konfigurasi aplikasi, atau instruksi EXPOSE di Dockerfile.
Sebelum memilih host port, pastikan port tersebut belum digunakan proses lain. Port host yang sama tidak dapat dipakai oleh dua container secara bersamaan pada alamat IP dan protokol yang sama.
Cara Port Mapping Docker dengan docker run
1. Jalankan Container dengan Port yang Dipublikasikan
Contoh berikut menjalankan Nginx di latar belakang dengan nama container web. Docker meneruskan trafik dari port 8080 pada host menuju port 80 di dalam container.
|
1 |
docker run -d --name web -p 8080:80 nginx:alpine |
Urutan port tidak boleh tertukar karena kedua angka memiliki fungsi berbeda. Port 8080 dapat diganti dengan host port lain yang tersedia, sedangkan port 80 harus sesuai dengan port layanan di dalam image Nginx.
2. Periksa Port yang Sudah Dipublikasikan
Gunakan docker ps untuk melihat container yang sedang berjalan dan kolom PORTS. Kamu juga dapat meminta Docker menampilkan pemetaan milik satu container melalui perintah docker port.
|
1 2 |
docker ps docker port web |
Output seperti 0.0.0.0:8080->80/tcp menunjukkan bahwa port 8080 tersedia pada seluruh antarmuka host dan diteruskan ke port 80 TCP di dalam container. Pada server ber-IP publik, kondisi tersebut dapat membuat layanan dijangkau dari jaringan luar apabila aturan jaringan lain mengizinkannya.
3. Uji Akses dari Host
Buka http://localhost:8080 melalui browser atau uji responsnya dengan curl. Respons HTTP membuktikan bahwa container berjalan, aplikasi mendengarkan port yang benar, dan pemetaan dapat digunakan dari host.
|
1 |
curl -I http://localhost:8080 |
Jika pengujian dilakukan pada VPS dari komputer lain, ganti localhost dengan alamat IP atau domain server. Pastikan kamu hanya membuka port yang memang dibutuhkan oleh aplikasi.
Jika kamu membutuhkan server yang dapat dikonfigurasi untuk menjalankan container, kamu dapat melihat pilihan Cloud VPS DomaiNesia. Sesuaikan spesifikasi server dengan jumlah container, beban aplikasi, serta kebutuhan penyimpananmu.
Variasi Port Mapping yang Perlu Diketahui
1. Memetakan Lebih dari Satu Port
Tambahkan opsi -p untuk setiap port yang benar-benar perlu dipublikasikan. Contoh berikut meneruskan dua host port ke dua port berbeda pada container yang sama.
|
1 2 3 4 |
docker run -d --name aplikasi \ -p 8080:80 \ -p 8443:443 \ nama-image |
Jangan memublikasikan port database hanya karena aplikasi menggunakannya. Container yang berada pada user-defined network dapat berkomunikasi menggunakan nama service atau nama container tanpa membuka port database ke host.
2. Membatasi Port agar Hanya Dapat Diakses dari Host
Docker mengikat port yang dipublikasikan ke seluruh antarmuka host secara default. Tambahkan 127.0.0.1 jika layanan hanya boleh diakses dari mesin yang sama, misalnya ketika aplikasi berada di belakang reverse proxy.
|
1 2 3 |
docker run -d --name web-lokal \ -p 127.0.0.1:8080:80 \ nginx:alpine |
Format lengkapnya adalah HOST_IP:HOST_PORT:CONTAINER_PORT. Pembatasan ini mengurangi risiko layanan internal terbuka langsung ke internet, tetapi kamu tetap perlu mengatur autentikasi dan keamanan aplikasi.
3. Memublikasikan Port UDP
Docker menggunakan TCP ketika protokol tidak ditulis. Tambahkan akhiran /udp jika aplikasi menerima trafik UDP.
|
1 2 3 |
docker run -d --name layanan-udp \ -p 5353:5353/udp \ nama-image |
Satu nomor port dapat dipublikasikan untuk TCP dan UDP secara terpisah ketika aplikasi memerlukan keduanya. Tuliskan dua opsi -p agar konfigurasi protokolnya jelas.
4. Membiarkan Docker Memilih Host Port
Kamu dapat menulis port container tanpa menentukan host port, misalnya -p 80. Docker akan memilih host port yang tersedia secara otomatis, lalu kamu dapat memeriksanya melalui docker port nama-container.
|
1 2 |
docker run -d --name web-acak -p 80 nginx:alpine docker port web-acak |
Pola ini berguna untuk pengujian sementara atau ketika sistem lain akan menemukan port secara dinamis. Untuk layanan yang diakses pengguna melalui alamat tetap, host port eksplisit biasanya lebih mudah dikelola.
Cara Port Mapping dengan Docker Compose
Docker Compose menyimpan konfigurasi container dalam berkas sehingga tim dapat menjalankan lingkungan yang konsisten. Konfigurasi jaringan antarlayanan dan port publik memiliki fungsi berbeda, sebagaimana dijelaskan dalam pembahasan network di Docker.
1. Buat Berkas compose.yaml
Contoh berikut memublikasikan Nginx melalui port 8080 pada host. Tanda kutip pada nilai port membantu mencegah YAML membaca format tersebut sebagai tipe data lain.
|
1 2 3 4 5 6 |
services: web: image: nginx:alpine container_name: web-compose ports: - "8080:80" |
2. Jalankan dan Periksa Service
Jalankan service dari direktori yang menyimpan compose.yaml. Setelah itu, periksa status dan port yang diterapkan oleh Docker Compose.
|
1 2 |
docker compose up -d docker compose ps |
Kamu dapat membuka http://localhost:8080 untuk menguji layanan. Jika konfigurasi port diubah, jalankan kembali docker compose up -d agar Compose membuat ulang container dengan konfigurasi baru.
3. Batasi Akses Service jika Tidak Perlu Dibuka ke Internet
Tambahkan alamat host ke nilai ports untuk membatasi akses. Contoh "127.0.0.1:8080:80" membuat layanan hanya menerima koneksi dari host.
|
1 2 3 4 5 |
services: web: image: nginx:alpine ports: - "127.0.0.1:8080:80" |
Service database yang hanya digunakan service lain biasanya tidak memerlukan bagian ports. Letakkan service pada network Compose yang sama, lalu gunakan nama service sebagai hostname internal.
Keamanan Port Mapping untuk Server Produksi
Port yang dipublikasikan tanpa host IP tertentu akan terikat ke 0.0.0.0 dan :: secara default. Artinya, layanan dapat menerima koneksi melalui seluruh antarmuka host sehingga kamu perlu memperlakukannya sebagai permukaan serangan.
Publikasikan hanya port aplikasi yang dibutuhkan pengguna. Batasi layanan internal ke 127.0.0.1 atau jaringan container, lalu periksa aturan firewall pada host dan lapisan jaringan penyedia server.
Untuk aplikasi web produksi, letakkan container di belakang reverse proxy agar pengelolaan domain, HTTPS, header, dan routing lebih terpusat. Kamu dapat menggunakan panduan setup Nginx reverse proxy sebagai langkah lanjutan.
Troubleshooting Port Mapping Docker
Jika aplikasi belum dapat diakses, periksa setiap lapisan secara berurutan. Pendekatan ini membantu membedakan masalah container, aplikasi, pemetaan port, dan jaringan host tanpa mengubah banyak konfigurasi sekaligus.
1. Pastikan Container Berjalan
Perintah docker ps -a menampilkan container yang berjalan maupun berhenti. Jika statusnya Exited, baca log agar kamu mengetahui penyebab proses aplikasi berhenti.
|
1 2 |
docker ps -a docker logs web |
2. Cocokkan Host Port dan Container Port
Jalankan docker port web dan pastikan container port sesuai dengan port yang didengarkan aplikasi. Pemetaan 8080:3000 tidak akan membantu jika aplikasi sebenarnya mendengarkan port 8000.
|
1 |
docker port web |
3. Pastikan Aplikasi Mendengarkan pada 0.0.0.0
Aplikasi yang hanya terikat ke 127.0.0.1 di dalam container tidak dapat menerima trafik yang diteruskan ke antarmuka container. Atur aplikasi agar mendengarkan 0.0.0.0 pada container port yang benar, lalu buat ulang atau restart container sesuai mekanisme deployment.
Kamu dapat memeriksa socket yang aktif dari dalam container jika image menyediakan utilitas yang diperlukan. Perintahnya dapat berupa ss -lntp, netstat -lntp, atau pemeriksaan konfigurasi aplikasi.
4. Periksa Konflik pada Host Port
Docker biasanya menolak menjalankan container jika host port sudah digunakan. Pesan error sering memuat keterangan seperti address already in use atau kegagalan mengikat port.
|
1 2 |
sudo ss -lntp | grep ':8080' docker ps --filter publish=8080 |
Hentikan proses yang tidak diperlukan atau pilih host port lain. Jangan mengubah container port kecuali aplikasi di dalam container juga dikonfigurasi untuk menggunakan port baru.
5. Uji dari Host Sebelum Menguji dari Internet
Jalankan curl http://127.0.0.1:8080 pada host terlebih dahulu. Jika pengujian lokal berhasil tetapi akses dari perangkat lain gagal, fokuskan pemeriksaan pada alamat bind, firewall, security group, router, atau jaringan penyedia.
Jika pengujian lokal juga gagal, periksa status container, log aplikasi, dan kesesuaian container port. Panduan error Docker yang sering terjadi dapat membantu saat pesan error mengarah ke masalah Docker yang lebih umum.
6. Buat Ulang Container Setelah Mengubah Mapping
Port publishing ditetapkan ketika container dibuat. Karena itu, hentikan dan buat ulang container jika kamu perlu mengganti pemetaan pada deployment berbasis docker run.
|
1 2 |
docker rm -f web docker run -d --name web -p 8081:80 nginx:alpine |
Pada Docker Compose, ubah nilai ports di compose.yaml, lalu jalankan kembali docker compose up -d. Compose akan menerapkan perubahan dengan membuat ulang service yang terdampak.
FAQ tentang Port Mapping Docker
Apa Perbedaan EXPOSE dan Port Mapping?
EXPOSE mendokumentasikan port yang digunakan image, tetapi tidak memublikasikannya ke antarmuka host. Opsi -p pada docker run atau bagian ports pada Compose membuat aturan penerusan dari host ke container.
Apakah Container dalam Satu Network Memerlukan Port Mapping?
Container pada user-defined network dapat berkomunikasi melalui nama container atau nama service dan container port. Port mapping hanya diperlukan ketika layanan harus diakses dari host atau jaringan di luar network Docker tersebut.
Apakah Satu Container Port Dapat Dipetakan ke Host Port yang Berbeda?
Container port dapat dipetakan ke host port yang berbeda selama host port tersebut tersedia. Sebagai contoh, -p 8080:80 dan -p 8081:80 dapat digunakan pada dua container berbeda agar keduanya menjalankan layanan internal pada port 80.
Mengapa Port Sudah Dipetakan tetapi Aplikasi Tetap Tidak Bisa Diakses?
Penyebab yang umum mencakup container berhenti, container port salah, aplikasi hanya mendengarkan 127.0.0.1 di dalam container, konflik host port, atau pembatasan firewall. Periksa masalah dari container menuju jaringan luar secara berurutan agar penyebabnya lebih cepat ditemukan.
Kesimpulan
Cara port mapping Docker yang paling dasar menggunakan -p HOST_PORT:CONTAINER_PORT, sedangkan Docker Compose menempatkan nilai yang sama pada bagian ports. Setelah menerapkan mapping, selalu periksa hasilnya dengan docker port atau docker compose ps, lalu uji akses dari host.
Pada server produksi, hindari membuka semua layanan ke seluruh antarmuka. Batasi port internal, gunakan network Docker untuk komunikasi antarkontainer, dan tempatkan aplikasi web di belakang reverse proxy ketika membutuhkan domain serta HTTPS.