Tips Expose Port pada Docker Container Existing

Posted by

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

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.