Contohnya, dengan penerapan konsep MVC, ada satu image yang digunakan untuk database, satu image untuk aplikasi backend dan satu image untuk aplikasi frontend. Sesi berikut akan menjelaskan bagaimana membangun multi-image yang menangani berbagai layanan yang terpisah dari sebuah aplikasi.
Pengenalan Multi Image pada Docker
- Sebagai contoh pada sesi ini, akan digunakan aplikasi SF Food Trucks yang tersedia pada github dengan url: http://github.com/prakhar1989/FoodTrucks
- Langkah pertama adalah mendownload atau melakukan clone dari link github di atas.
- Aplikasi FoodTrucks menggunakan Bahasa Python dengan library flask-app dan ElasticSearch sebagai database.
- Aplikasi ini kemudian akan memiliki dua image, yaitu image untuk aplikasi FoodTrucks dan image untuk ElasticSearch.
- Pada terminal, jalankan instruksi berikut untuk mem-pull image ElasticSearch dari docker hub.
- docker pull docker.elastic.co/elasticsearch/elasticsearch:6.3.2
- Lalu jalankan dalam mode development dengan memberikan spesifikasi port dan variable environment yang mengindikasikan Elasticsearch cluster berjalan pada satu node tunggal.
- docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.3.2
- Saat docker run dijalankan, terminal akan menampilkan keluaran seperti pada gambar berikut:
- Pada perintah di atas, image di jalankan dengan diberi nama es sesuai dengan option --name es. Hal ini untuk memudahkan penggunaan pada instruksi-instruksi berikutnya.
- Contohnya melihat log dari image Elasticsearch seperti pada gambar berikut:
- Untuk memvalidasi apakah image Elasticsearch telah berjalan dengan baik, gunakan browser untuk mengakses url: http://localhost:9200 seperti pada gambar berikut:
- Berikutnya adalah membuat image untuk layanan flask-app.
- Pada folder flask-app, telah tersedia file Dockerfile yang menjabarkan langkah-langkah pembuatan docker image.
- Selanjutnya jalankan instruksi berikut untuk membuat image dari aplikasi flask-app.
- docker build –t foodtrucks-web.
- Setelah image berhasil di buat, jalankan image yang baru dibuat dengan perintah berikut:
- docker run –P --rm foodtrucks-web
- Keluaran dari perintah di atas adalah sebagai berikut:
- 16. Hal ini menandakan bahwa aplikasi flask-app belum dapat mengakses image Elasticsearch. Hal ini disebabkan karena image flask-app tidak dapat mengakses IP dari layanan Elasticsearch yang benar.
- Hal ini dapat diatas dengan memahami konsep networking pada Docker.
Konsep Networking pada Docker
- Saat docker diinstall, instalasi ini akan membuat tiga jenis networking secara otomatis.
- Untuk melihat jenis networking docker, jalankan instruksi docker network ls seperti pada gambar berikut:
- Network bridge adalah network default pada setiap docker image yang dijalankan. Untuk memvalidasi setting ini, jalankan instruksi untuk melakukan inspeksi pada jaringan bridge.
- docker network inspect bridge
- Perintah sebelumnya akan menghasilkan keluaran seperti pada gambar berikut:
- Dari gambar, dapat dilihat bahwa image es telah terpasang di dalam jaringan bridge dengan IP: 172.17.0.2
- Untuk menguji akses ke IP image ES, masuk ke dalam environment bash dari aplikasih foodtrucks-web dengan instruksi seperti gambar berikut:
- Dari gambar terlihat bahwa aplikasi foodtrucks-web dapat mengakses layanan ES dengan IP yang tertera di jaringan bridge.
- Namun hal ini memiliki beberapa kendala:
- Bagaimana agar aplikasi foodstrucks-web dapat mengenali ES sebagai hostname dengan IP 172.17.0.2 (atau IP yang lain karena ada kemungkinan berubah)?
- Bagaimana cara melakukan isolasi jaringan? karena jaringan bridge akan membagi jaringan dengan image yang lain yang artinya menjadi tidak isolate dan aman.
- Untuk mengatasi dua masalah di atas, docker mengenalkan instruksi docker network untuk membuat jaringan yang terisolasi.
- Instruksi docker network dapat digunakan untuk membuat sebuah jaringan baru yang hanya dapat berisi image yang ditentukan oleh user.
- Instruksi untuk membuat jaringan yang baru: docker network create <nama_jaringan>
- Contoh: docker network create foodtrucks-net
- Setelah instruksi di jalankan, validasi pembuatan jaringan baru dengan perintah docker network ls.
- Pada daftar jaringan, akan terdapat nama jaringan foodtrucks-net yang baru saja dibuat.
- Setelah network berhasil dibuat, selanjutnya adalah menambahkan image ke dalam jaringan tersebut.
- Untuk menambah image ke dalam jaringan foodtrucks-net, stop dulu image yang sedang berjalan dengan instruksi berikut:
- Kemudian jalankan kembali image Elasticsear dengan tambahan option –net foodtrucks-net pada instruksi docker run.
- Contoh: docker run -d --name es --net foodtrucks-net -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.3.2
- Lalu jalankan perintah docker network inspect foodtrucks-net untuk memvalidasi bahwa image ES telah terpasa pada jaringan foodtrucks-net.
- Keluaran dari instruksi docker network inspect akan seperti pada gambar di sampin.
- Selanjutnya jalankan perintah docker run -P --rm -p 5000:5000 --net foodtrucks-net foodtrucks-web untuk menjalankan image foodtrucks-web di dalam jaringan foodtrucks-net.
- Keluarannya seperti pada gambar berikut:
- Pada gambar menunjukkan aplikasi foodtrucks-web telah berhasil berkomunikasi dengan layanan Elasticsearch karena sama-sama berada di dalam jaringan foodtrucks-net.
- Selanjutnya, untuk menguji layanan foodtrucks-web, jalankan browser dan akses url: http://localhost:5000 seperti pada gambar berikut:
- Docker menyediakan tools yang memudahkan menjalankan multi-image docker.
- Salah satunya adalah docker-compose.
- File konfigurasi yang akan digunakan oleh docker-compose adalah file dengan extension .yml
- Pada contoh proyek ini, file konfigurasi diberi nama docker-compose.yml
- Selanjutnya pada folder proyek, jalankan instruksi docker-compose up seperti pada gambar pada slide berikut.