Ketika membuat Docker Container, terkadang saya lupa tidak menambahkan parameter expose port. Setelah Docker Container berjalan dengan baik sesuai dengan yang diinginkan, baru deh keinget bahwa portnya belum di expose.
Jika terjadi seperti itu, biasanya saya buat lagi Docker Container baru dengan image hasil commit Container yang sudah dibuat sebelumnya. Sebenarnya, ada cara lain apabila saya tidak mau membuat Container baru. Diantaranya :
# Menggunakan IPTABLES
Jika menggunakan iptables, yang harus diketahui adalah IP yang digunakan oleh Container tersebut. Untuk mengeceknya, bisa attach Container yang telah dibuat (docker attach id-container) dan dicek IP nya. Atau dicek dengan perintah Docker inspect
docker inspect id-container | grep IPAddress
Setelah IP Address diketahui, kemudian buat rule menggunakan iptables. Konsepnya mirip dengan DNAT pada Mikrotik. Sebagai contoh. Saya akan meng-expose port 80 pada Docker Container agar dapat diakses dari luar
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to ip-pada-container
Dengan perintah diatas, saya bisa akses IP address Host Container dari PC lain untuk membuka web server yang sudah diinstall dan dikonfigurasi pada Docker Container. Contoh http://192.168.11.12
Jika ingin membuat custom port, cukup tambahkan port yang diakses setelah ip-pada-container. Contoh. Saya akan akses port 8080 pada Host Container. Namun port tersebut merujuk pada port 80 pada Docker Container
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to ip-pada-container:80
Dengan perintah diatas, saya bisa akses IP address Host Container dengan custom port 8080 dari PC lain untuk membuka web server yang sudah diinstall dan dikonfigurasi pada Docker Container. Contoh http://192.168.11.12:8080
# Edit/Update konfigurasi Container
Selain cara iptables diatas, container existing bisa dimodifikasi agar port nya dapat di expose. Namun cara ini bisa dilakukan dengan kondisi service Docker dalam keadaan stop. Berikut adalah tahapannya
– Dapatkan lokasi dari konfigurasi Container. Dalam contoh disini, saya cari HostnamePath
docker inspect id-container | grep HostnamePath
Berikut contoh hasilnya
"HostnamePath": "/var/lib/docker/containers/1e5f210c87a86547f95a5f64f25b93d85f944e1b5d110007451cbd86aeead90c/hostname",
– Stop service Docker
systemctl stop docker
– Masuk pada folder hasil inspect diatas
cd /var/lib/docker/containers/1e5f210c87a86547f95a5f64f25b93d85f944e1b5d110007451cbd86aeead90c
– Backup file hostconfig.json dan config.v2.json
cp hostconfig.json backup-hostconfig.json
cp config.v2.json backup-config.v2.json
– Buka file hostconfig.json
vi hostconfig.json
Sesuaikan isian pada bagian PortBindings. Contoh
"PortBindings":{"22/tcp":[{"HostIp":"","HostPort":"22"}],"80/tcp":[{"HostIp":"","HostPort":"8080"}]}
Pada konfigurasi diatas, saya melakukan expose port 22 dan port 80 yang ada pada Container. Sedangkan disisi Host, saya menggunakan port 22 untuk akses port 22 pada Container, dan custom port 8080 untuk akses port 80 pada Container.
Keterangan :
– “22/tcp” dan “80/tcp” adalah port yang listen pada Container
– [{“HostIp”:””,”HostPort”:”22″}] dan [{“HostIp”:””,”HostPort”:”8080″}] adalah port yang listen pada Host
– Buka file config.v2.json
vi config.v2.json
Tambahkan parameter ExposedPorts pada bagian “Config” sebelum “Hostname”. Contoh
"ExposedPorts":{"22/tcp":{},"80/tcp":{}},
– Setelah selesai dimodifikasi, jalankan kembali service Dockernya dan start Container nya
systemctl start docker
docker start container-id
Berikut ini adalah tampilan sebelum dan sesudah dilakukan modifikasi
Sebelum
root@lenovo:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1e5f210c87a8 ubuntu:18.04 "/bin/bash" 5 seconds ago Up 4 seconds webserver
Sesudah
root@lenovo:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1e5f210c87a8 ubuntu:18.04 "/bin/bash" 35 minutes ago Up 2 minutes 0.0.0.0:22->22/tcp, 0.0.0.0:8080->80/tcp webserver
Sekarang port 22 dan 80 sudah ter-expose disisi Host
Silakan dicoba dan semoga bermanfaat 🙂
One comment