Pemetaan Port

Publikasi port dengan -p, pemetaan ke port tetap maupun port ephemeral, dan pemeriksaannya.

Daftar isi

Topik ini membahas publikasi port container ke host, yaitu mesin tempat Docker berjalan, dengan opsi -p pada docker run. Pembahasan mencakup alasan port di dalam container tidak otomatis terlihat, format pemetaan ke port tetap maupun port acak, pengikatan ke antarmuka tertentu, pemeriksaan pemetaan yang aktif, serta penanganan konflik port pada host. Setelah membacanya, port aplikasi di dalam container dapat dipublikasikan secara terkendali dan keberadaannya dapat diverifikasi.

Tumpukan jaringan milik container#

Setiap container membawa tumpukan jaringannya sendiri. Kernel mengisolasi tumpukan tersebut melalui network namespace, yaitu lapisan isolasi yang memberi setiap container antarmuka jaringan, tabel rute, dan ruang port yang terpisah dari host. Akibatnya, aplikasi yang mendengarkan pada port 8000 di dalam container tidak otomatis dijangkau melalui port 8000 pada host. Kedua port berada di ruang yang berbeda meskipun angkanya sama.

Publikasi port mengatasi isolasi tersebut. Opsi -p memerintahkan Docker membuat aturan penerusan pada host, sehingga lalu lintas yang tiba di port tertentu pada host diteruskan ke port di dalam container. Tanpa publikasi, container tetap berjalan dan melayani permintaan, tetapi hanya dari dalam jaringan container itu sendiri. Publikasi inilah yang menghubungkan aplikasi container dengan browser dan klien lain pada host.

Format opsi -p#

Bentuk umumnya adalah -p port-host:port-container. Nilai di kiri adalah port pada host yang dibuka, sedangkan nilai di kanan adalah port di dalam container tempat aplikasi benar-benar mendengarkan. Tabel berikut merangkum variasi yang sering digunakan.

OpsiArtiPemakaian yang cocok
-p 8000:8000Port host tetap 8000 menuju port container 8000Layanan dengan alamat yang diketahui klien
-p 127.0.0.1:8000:8000Publikasi diikat (bind) hanya ke antarmuka loopbackLayanan administrasi yang hanya boleh dijangkau dari host
-p 8000Port host dipilih acak dari rentang port ephemeral, yaitu port sementara yang disediakan sistemUji coba cepat tanpa memikirkan konflik port
-PSemua port yang dideklarasikan EXPOSE pada Dockerfile dipublikasikan ke port host acakImage milik orang lain yang port pentingnya sudah dideklarasikan

Dua bentuk terakhir menyerahkan pemilihan nomor port host kepada Docker, sehingga nomor yang terpakai baru diketahui setelah container berjalan. Satu perintah docker run juga boleh membawa lebih dari satu -p, misalnya satu untuk aplikasi dan satu lagi untuk antarmuka administrasi. Contoh pemakaiannya adalah sebagai berikut.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# pemetaan port tetap
docker run -d -p 8000:8000 --name catatan-app catatan
# port host acak untuk satu port container
docker run -d -p 8000 --name catatan-uji catatan
# dua pemetaan sekaligus, yang kedua dibatasi ke loopback
docker run -d -p 8000:8000 -p 127.0.0.1:8001:8001 --name catatan-lengkap catatan

Demo penerusan port pada host#

Mekanisme yang dipanggil -p sudah dikenal sebagai teknik umum pada sisi host, yaitu proses yang mendengarkan pada port host lalu meneruskan koneksi ke tujuan lain. Demo berikut memperagakan sisi host-nya tanpa Docker. Sebuah server uji dijalankan di latar pada port 8090, keterjangkauannya diuji dengan curl, lalu prosesnya dihentikan, semuanya dalam satu blok.

bash
# mulai server uji di latar pada port 8090
python3 -m http.server 8090 --bind 127.0.0.1 >/dev/null 2>&1 &
PID_SERVER=$!
# beri waktu server siap menerima koneksi
sleep 1
# uji port dari sisi host
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8090/
# hentikan server uji
kill $PID_SERVER
text Keluaran
200

Angka 200 adalah kode status HTTP yang menyatakan permintaan berhasil, sehingga port 8090 terbukti hidup dari sudut pandang host. Pada pemetaan port Docker, peran penerusan ini diambil alih oleh aturan NAT kernel dan proses pendamping milik Docker, sehingga koneksi menuju port host diteruskan ke port container tanpa konfigurasi manual. Prinsipnya tetap sama, yaitu proses yang mendengarkan pada sisi host menerima koneksi lalu meneruskannya ke tujuan akhir.

Memeriksa pemetaan yang aktif#

Pemetaan yang sedang berjalan dapat diperiksa dengan dua cara. Perintah docker port menampilkan seluruh pemetaan milik satu container, sedangkan kolom PORTS pada docker ps menampilkan pemetaan itu di samping daftar container lain. Keduanya membaca data yang sama, yaitu aturan publikasi yang disimpan Docker untuk container tersebut. Keluarannya memasangkan sisi host dengan sisi container, lengkap dengan alamat pengikat dan protokolnya.

Pada pemetaan port acak, nomor port host hanya terlihat melalui pemeriksaan ini karena nomornya memang tidak ditentukan saat docker run. Prosedur pemeriksaannya sebagai berikut. Setelah prosedur itu, nomor port yang benar-benar dipakai menjadi pasti dan dapat dicatat untuk konfigurasi klien.

  1. Jalankan container dengan -p seperti biasa.
  2. Tampilkan pemetaan milik container tersebut dengan docker port.
  3. Cocokkan hasilnya dengan kolom PORTS pada docker ps.
bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# seluruh pemetaan milik satu container
docker port catatan-app
# pemeriksaan untuk satu port container tertentu
docker port catatan-app 8000

Kesalahan umum#

  1. Port host sudah dipakai proses lain. Docker menolak memulai container dan menampilkan pesan error yang menyebut port tidak dapat dialokasikan. Penyebabnya adalah port host yang sama sedang didengarkan proses lain, misalnya server pengembangan yang masih berjalan. Perbaikannya dengan memilih port host lain pada opsi -p atau menghentikan proses pemakai port tersebut.

  2. Memetakan ke port yang tidak didengarkan aplikasi. Container berhasil berjalan, tetapi setiap permintaan menuju port host ditolak. Penyebabnya adalah sisi kanan -p tidak sama dengan port yang benar-benar didengarkan aplikasi di dalam container. Perbaikannya dengan mencocokkan sisi kanan pemetaan dengan port aplikasi, karena publikasi tidak memaksa aplikasi berpindah port.

Ringkasan#

  • Container membawa tumpukan jaringan sendiri, sehingga port di dalamnya tidak terjangkau dari host sebelum dipublikasikan dengan -p.
  • Format -p host:container menetapkan port host, prefiks 127.0.0.1: membatasi pengikatan ke loopback, sedangkan -p port dan -P memilih port host secara acak.
  • Pemetaan aktif diperiksa dengan docker port atau kolom PORTS pada docker ps.
  • Konflik port host muncul bila port yang sama dipakai proses lain dan diselesaikan dengan mengganti port atau menghentikan proses pemakainya.

Referensi#