<br />
<b>Warning</b>:  Undefined variable $return_string in <b>/www/wwwroot/crocodic/wp-content/themes/crocodic22/functions.php</b> on line <b>1249</b><br />
{"id":10441,"date":"2022-09-22T09:24:00","date_gmt":"2022-09-22T02:24:00","guid":{"rendered":"https:\/\/crocodic.com\/?p=10441"},"modified":"2022-11-25T10:14:59","modified_gmt":"2022-11-25T03:14:59","slug":"membangun-aplikasi-menggunakan-docker","status":"publish","type":"post","link":"https:\/\/crocodic.com\/id\/membangun-aplikasi-menggunakan-docker\/","title":{"rendered":"Membangun Aplikasi Menggunakan Docker"},"content":{"rendered":"<p>Ada banyak tantangan yang dihadapi oleh pengembang perangkat lunak dalam membangun <a href=\"https:\/\/crocodic.com\/id\/5-kesalahan-yang-sering-dilakukan-developer-mobile-apps\/\">aplikasi<\/a> yang <em>robust<\/em>, <em>scalable <\/em>dan <em>maintainable<\/em>. Masalah yang dihadapi oleh setiap pengembang perangkat lunak salah satunya berkaitan dengan <em>deployment<\/em> yang seringkali memerlukan konfigurasi yang berbeda antara server yang digunakan untuk development dan server yang digunakan untuk deployment. Misalkan saja ketika developer membangun aplikasi <em>backend<\/em> di windows, sedangkan OS yang digunakan untuk <em>deployment<\/em> adalah linux. Bagaimana kita menjamin bahwa aplikasi yang dikembangkan saat fase development akan berjalan lancar saat sudah di deploy ke <em>cloud environment<\/em>?&nbsp;<\/p>\n\n\n<div class=\"wp-block-aioseo-table-of-contents\"><ul><li><a class=\"aioseo-toc-item\" href=\"#apa-itu-docker\">Apa itu Docker?<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-perbedaan-docker-dan-kubernetes\">Perbedaan Docker dan Kubernetes<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-docker-swarm\">Docker Swarm<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-memulai-menggunakan-docker\">Memulai Menggunakan Docker<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-penjelasan-dockerfile\">Penjelasan Dockerfile<\/a><\/li><\/ul><\/li><\/ul><\/div>\n\n\n<p>Salah satu cara untuk menjamin hal tersebut yaitu dengan \u201cmembungkus\u201d aplikasi di dalam <em>virtual machine. <\/em>Namun, penggunaan <em>virtual machine <\/em>membutuhkan <em>resource <\/em>yang tidak sedikit karena harus menjalankan semua komponen OS dan melakukan virtualisasi hardware termasuk perangkat lunak yang sebenarnya tidak diperlukan oleh aplikasi kita. Docker menyelesaikan masalah ini dengan cara hanya menjalankan komponen-komponen yang diperlukan oleh aplikasi karena Docker dijalankan dengan cara \u201cmenumpang\u201d kernel sistem operasi komputer host dalam proses yang terisolasi.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/iL-FcLTtJpzRjG4y8NAjA-woudB3YX0E6wWsKgFpd7i3Gfh29RHg_ZTe0y1nH2j2RvfQr1azcSaiWhYPxOrTZRAIuGwFUaS1GX9kCp7JxzXjmIHpav6q3YgKmaeEUVOqs1vV8WWpxkXIqNOqnmJJPF852NP-bHEgwa0MCdL4HoiB295DVMAL_MXxaQ\" alt=\"\"\/><\/figure>\n\n\n\n<p><em>Gambar kiri dengan menggunakan VM, gambar kanan dengan menggunakan docker<\/em><\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"apa-itu-docker\"><strong>Apa itu Docker?<\/strong><\/h1>\n\n\n\n<p>Docker sendiri sebenarnya merupakan <em>platform <\/em>untuk mengembangkan aplikasi berbasis kontainer sehingga dapat dijalankan pada semua sistem operasi yang dapat menjalankan <em>docker engine <\/em>. Pada docker terdapat beberapa istilah yang Anda perlu tahu diantaranya yaitu :<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-dockerfile\">Dockerfile<\/h3>\n\n\n\n<p>Dockerfile adalah sebuah file konfigurasi yang berisi langkah-langkah untuk membangun sebuah container. Dockerfile biasanya terdiri dari beberapa <em>layer<\/em>. Setiap baris perintah pada Dockerfile yang dijalankan akan menjadi <em>layer <\/em>dan mempunyai identitas tersendiri, yang akhirnya akan digabung menjadi sebuah <em>image<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-image\">Image<\/h3>\n\n\n\n<p>Image merupakan kumpulan dari perubahan file system yang perubahannya urut berdasarkan <em>layer<\/em> Dockerfile dan disimpan menjadi sebuah file <em>immutable <\/em>untuk menjalankan sebuah container.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-container\">Container<\/h3>\n\n\n\n<p>Container adalah unit dari aplikasi yang telah disatukan dengan dependensinya sehingga langsung dapat dijalankan sebagai <em>executable <\/em>menggunakan docker engine<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-perbedaan-docker-dan-kubernetes\"><strong>Perbedaan Docker dan Kubernetes<\/strong><\/h2>\n\n\n\n<p>Docker sendiri merupakan <em>container runtime<\/em>, sedangkan Kubernetes merupakan <em>container orchestration tool <\/em>yang fungsinya adalah untuk melakukan manajemen pada banyak <em>container runtime, <\/em>dan tidak hanya terbatas menggunakan Docker.<em> <\/em>Kubernetes dapat digunakan untuk men-deploy banyak container sekaligus ke kumpulan komputer host (atau biasa disebut cluster) dan dilengkapi dengan fitur <em>load balancing, auto scale, dan auto healing.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-docker-swarm\"><strong>Docker Swarm<\/strong><\/h2>\n\n\n\n<p>Sama halnya dengan Kubernetes, docker swarm juga merupakan salah satu <em>container orchestration tool <\/em>untuk melakukan management pada banyak <em>container <\/em>di banyak host, perbedaan keduanya hanya pada fitur tambahan yang ditawarkan, yang mana kubernetes lebih cocok digunakan pada aplikasi kompleks yang membutuhkan monitoring.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"aioseo-memulai-menggunakan-docker\"><strong>Memulai Menggunakan Docker<\/strong><\/h1>\n\n\n\n<p>Percobaan kali ini kita akan membuat aplikasi API simple menggunakan Node JS express yang menampilkan response \u2018Hello Docker!\u2019<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Instal docker sesuai dengan OS yang Anda gunakan. Petunjuk instalasi dapat anda lihat disini <a href=\"https:\/\/docs.docker.com\/desktop\/\">https:\/\/docs.docker.com\/desktop\/<\/a><\/li><li>Buatlah satu folder baru dengan nama hello-docker<\/li><\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>$ mkdir hello-docker\n$ cd hello-docker<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\"><li>Lalu jalankan perintah npm init untuk membuat project node js<\/li><\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>$ npm init<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\"><li>Buatlah file baru dengan nama index.js , lalu copy kode javascript dibawah<\/li><\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code><em>\/\/to run : node filename.js<\/em><br><em>const<\/em> express = require('express')<br><em>const<\/em> app = express()<br><em>const<\/em> port = 3000<br>app.get('\/', (<em>req<\/em>, <em>res<\/em>) =&gt; res.send('Hello Docker!'))<br>app.listen(port, () =&gt; console.log(`listening at http:\/\/localhost:${port}`))<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\"><li>Buatlah file baru dengan nama Dockerfile , lalu copy kode dibawah<\/li><\/ol>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<pre class=\"wp-block-code\"><code>FROM node:16-alpine<br>COPY package.json package.json<br>RUN npm install<br>COPY . .<br>CMD node index.js<\/code><\/pre>\n<\/div><\/div>\n\n\n\n<ol class=\"wp-block-list\" start=\"6\"><li>Lalu jalankan perintah untuk membuat docker image<\/li><\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker build . -t hello-docker<img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/BddSxMJoHxklcZ_Wfwr6yPV7zxCW9Dy0w6c5xjm1VOilb1P0T_TNcqQrL2buDDArrflo0bMtC8SgKOhwuELt9Td27ALkiAVDSR7HZmO2_pjHfhj8zeY7JDwxM1PvZi7fql5fJsDG7-kDi3tX-k2CX3WPEgi83e5-Nt__zvI7cyAD-xbCP0aO1h9Qyg\" width=\"602\" height=\"325\"><\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"7\"><li>Lalu jalankan docker image yang telah dibuat dengan perintah<\/li><\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>$ docker run -p 0.0.0.0:3000:3000 -d hello-docker<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"8\"><li>Akses aplikasi yang telah anda buat di http:\/\/localhost:3000\/<\/li><\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-penjelasan-dockerfile\">Penjelasan Dockerfile :<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>FROM node:16-alpine<\/li><\/ul>\n\n\n\n<p>menggunakan node js 16 alpine sebagai <em>base image. <\/em>Salah satu <em>best practice <\/em>dalam membuat Dockerfile yaitu langsung menggunakan <em>base image<\/em> aplikasi seperti node, python, golang, mysql, dll dibandingkan dengan menggunakan <em>base image<\/em> OS seperti ubuntu, debian, dll. Daftar base image dapat Anda eksplorasi lebih jauh di website docker hub<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>COPY package.json package.json<\/li><\/ul>\n\n\n\n<p>Menyalin file package.json ke dalam image<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>RUN npm install<\/li><\/ul>\n\n\n\n<p>Menjalankan perintah npm install untuk mengunduh dependensi project<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>COPY . .<\/li><\/ul>\n\n\n\n<p>Menyalin semua file di folder project ke dalam image<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>CMD node index.js<\/li><\/ul>\n\n\n\n<p>Menjalankan perintah node index.js untuk menjalankan aplikasi<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Jika anda perhatikan diatas, perintah copy dijalankan 2x dan file package.json terpisah, mengapa demikian? Hal ini dikarenakan Docker akan melakukan <em>cache <\/em>pada setiap <em>layer<\/em>. Jadi file yang tidak berubah tidak akan dibuild ulang oleh docker sehingga mempercepat waktu build. Dalam hal ini package.json hanya berisi informasi project dan list dependensi, selama tidak ada penambahan dependensi maka perintah docker build tidak akan menjalankan perintah copy package.json dan run npm install sehingga mempercepat proses build karena tidak ada proses unduh dependensi. Dapat anda lihat pada gambar langkah ke-6 terdapat label <strong>CACHED<\/strong> pada perintah COPY dan RUN npm install.<\/p>\n\n\n\n<p>Tips : <em>rule of thumb<\/em> pembuatan Dockerfile dimulai dari dependensi yang paling jarang berubah yang biasanya adalah <em>base image<\/em>.<br>Source code dapat Anda unduh disini : <a href=\"https:\/\/github.com\/wahyudotdev\/hello-docker\">https:\/\/github.com\/wahyudotdev\/hello-docker<\/a><\/p>\n\n\n\n<p><\/p>\n\n\n<div class=\"read-more\"><div class=\"title\"><strong>Baca Juga :<\/strong> <br><br><\/div><ul><li><a target=\"_blank\" href=\"https:\/\/crocodic.com\/id\/the-pre-project-checklist-memastikan-customized-software-iot-mencapai-nilai-bisnis\/\" title=\"The Pre-Project Checklist: Memastikan Customized Software &amp; IoT Mencapai Nilai Bisnis\">The Pre-Project Checklist: Memastikan Customized Software &amp; IoT Mencapai Nilai Bisnis<\/a><\/li><li><a target=\"_blank\" href=\"https:\/\/crocodic.com\/id\/target-ambisius-990-triliun-melalui-cloud-untuk-umkm-ekosistemnya-siap\/\" title=\"Target Ambisius 990 Triliun Melalui Cloud untuk UMKM, Ekosistemnya Siap?\">Target Ambisius 990 Triliun Melalui Cloud untuk UMKM, Ekosistemnya Siap?<\/a><\/li><li><a target=\"_blank\" href=\"https:\/\/crocodic.com\/id\/usd-2435-miliar-potensi-gen-ai-peluang-seperlima-pdb-bagi-enterprise-indonesia\/\" title=\"USD 243,5 Miliar Potensi Gen AI: Peluang Seperlima PDB bagi Enterprise Indonesia\">USD 243,5 Miliar Potensi Gen AI: Peluang Seperlima PDB bagi Enterprise Indonesia<\/a><\/li><\/ul><\/div>","protected":false},"excerpt":{"rendered":"<p>Ada banyak tantangan yang dihadapi oleh pengembang perangkat lunak dalam membangun aplikasi yang robust, scalable dan maintainable. Masalah yang dihadapi oleh setiap pengembang perangkat lunak salah satunya berkaitan dengan deployment yang seringkali memerlukan konfigurasi yang berbeda antara server yang digunakan untuk development dan server yang digunakan untuk deployment. Misalkan saja ketika developer membangun aplikasi backend [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":10493,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[470,1],"tags":[521],"class_list":["post-10441","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mobile-apps-development","category-uncategorized","tag-mobile-app-development-with-docker"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/crocodic.com\/id\/wp-json\/wp\/v2\/posts\/10441","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/crocodic.com\/id\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/crocodic.com\/id\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/crocodic.com\/id\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/crocodic.com\/id\/wp-json\/wp\/v2\/comments?post=10441"}],"version-history":[{"count":10,"href":"https:\/\/crocodic.com\/id\/wp-json\/wp\/v2\/posts\/10441\/revisions"}],"predecessor-version":[{"id":11436,"href":"https:\/\/crocodic.com\/id\/wp-json\/wp\/v2\/posts\/10441\/revisions\/11436"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/crocodic.com\/id\/wp-json\/wp\/v2\/media\/10493"}],"wp:attachment":[{"href":"https:\/\/crocodic.com\/id\/wp-json\/wp\/v2\/media?parent=10441"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/crocodic.com\/id\/wp-json\/wp\/v2\/categories?post=10441"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/crocodic.com\/id\/wp-json\/wp\/v2\/tags?post=10441"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}