{"id":2328,"date":"2025-08-16T10:29:48","date_gmt":"2025-08-16T03:29:48","guid":{"rendered":"https:\/\/www.jagoweb.com\/kb\/?post_type=ht_kb&#038;p=2328"},"modified":"2025-08-16T10:29:48","modified_gmt":"2025-08-16T03:29:48","slug":"tutorial-menggunakan-docker-compose","status":"publish","type":"ht_kb","link":"https:\/\/www.jagoweb.com\/kb\/knowledge-base-jagoweb\/tutorial-menggunakan-docker-compose\/","title":{"rendered":"Tutorial Menggunakan Docker Compose"},"content":{"rendered":"<p><strong>Tutorial Menggunakan Docker Compose<\/strong> &#8211; Bayangkan kita ingin menjalankan situs WordPress. Kita butuh setidaknya dua komponen:<\/p>\n<ol start=\"1\">\n<li><b>Web server<\/b> dengan PHP (tempat WordPress berjalan).<\/li>\n<li><b>Database<\/b> (tempat WordPress menyimpan semua postingan dan pengaturan).<\/li>\n<\/ol>\n<p>Menjalankan dan menghubungkan dua kontainer ini secara manual menggunakan perintah <code>docker run<\/code> bisa menjadi rumit dan panjang. Docker Compose memungkinkan kita mendefinisikan seluruh &#8220;tumpukan&#8221; (stack) aplikasi kita dalam satu file konfigurasi sederhana.<\/p>\n<p>&nbsp;<\/p>\n<h3 id=\"langkah-1-verifikasi-instalasi-docker-compose\" ><b>Langkah 1: Verifikasi Instalasi Docker Compose<\/b><\/h3>\n<p>Pada tutorial Docker sebelumnya, kita sudah menginstal plugin docker-compose-plugin. Mari kita pastikan plugin tersebut siap digunakan.<\/p>\n<p>Jalankan perintah ini di terminal kita:<\/p>\n<div class=\"code-block ng-tns-c1437408396-233 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation\">\n<div class=\"formatted-code-block-internal-container ng-tns-c1437408396-233\">\n<div class=\"animated-opacity ng-tns-c1437408396-233\">\n<pre class=\"ng-tns-c1437408396-233\"><code class=\"code-container formatted ng-tns-c1437408396-233\" role=\"text\" data-test-id=\"code-content\">docker compose version\r\n<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<p>Jika kita melihat output yang menunjukkan versi Docker Compose, berarti kita siap untuk melanjutkan! Jika tidak, kita bisa menginstalnya kembali dengan <code>sudo apt-get install docker-compose-plugin<\/code>.<\/p>\n<p>&nbsp;<\/p>\n<h3 id=\"langkah-2-menyiapkan-proyek-wordpress\" ><b>Langkah 2: Menyiapkan Proyek WordPress\u00a0<\/b><\/h3>\n<p>Setiap proyek Docker Compose sebaiknya memiliki direktorinya sendiri. Ini membantu menjaga semuanya tetap terorganisir.<\/p>\n<ol start=\"1\">\n<li><b>Buat sebuah direktori baru<\/b> untuk proyek WordPress kita dan masuk ke dalamnya.\n<div class=\"code-block ng-tns-c1437408396-234 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation\">\n<div class=\"formatted-code-block-internal-container ng-tns-c1437408396-234\">\n<div class=\"animated-opacity ng-tns-c1437408396-234\">\n<pre class=\"ng-tns-c1437408396-234\"><code class=\"code-container formatted ng-tns-c1437408396-234\" role=\"text\" data-test-id=\"code-content\">mkdir situs-wordpress\r\n<span class=\"hljs-built_in\">cd<\/span> situs-wordpress\r\n<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/li>\n<li><b>Buat file konfigurasi.<\/b> Di dalam direktori ini, kita akan membuat file utama yang menjadi &#8220;cetak biru&#8221; aplikasi kita.\n<div class=\"code-block ng-tns-c1437408396-235 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation\">\n<div class=\"formatted-code-block-internal-container ng-tns-c1437408396-235\">\n<div class=\"animated-opacity ng-tns-c1437408396-235\">\n<pre class=\"ng-tns-c1437408396-235\"><code class=\"code-container formatted ng-tns-c1437408396-235\" role=\"text\" data-test-id=\"code-content\">nano docker-compose.yml\r\n<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<h3 id=\"langkah-3-merancang-cetak-biru-aplikasi-kita\" ><b>Langkah 3: Merancang Cetak Biru Aplikasi Kita<\/b><\/h3>\n<p>&nbsp;<\/p>\n<p>Sekarang kita berada di dalam editor nano. Salin dan tempel (copy-paste) konfigurasi berikut ke dalam file docker-compose.yml. YAML sangat sensitif terhadap spasi (indentasi), jadi pastikan formatnya persis seperti di bawah.<\/p>\n<div class=\"code-block ng-tns-c1437408396-236 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation\">\n<div class=\"formatted-code-block-internal-container ng-tns-c1437408396-236\">\n<div class=\"animated-opacity ng-tns-c1437408396-236\">\n<pre class=\"ng-tns-c1437408396-236\"><code class=\"code-container formatted ng-tns-c1437408396-236\" role=\"text\" data-test-id=\"code-content\"><span class=\"hljs-attr\">version:<\/span> <span class=\"hljs-string\">'3.8'<\/span>\r\n\r\n<span class=\"hljs-attr\">services:<\/span>\r\n  <span class=\"hljs-attr\">db:<\/span>\r\n    <span class=\"hljs-attr\">image:<\/span> <span class=\"hljs-string\">mariadb:10.6<\/span>\r\n    <span class=\"hljs-attr\">container_name:<\/span> <span class=\"hljs-string\">wordpress_db<\/span>\r\n    <span class=\"hljs-attr\">restart:<\/span> <span class=\"hljs-string\">always<\/span>\r\n    <span class=\"hljs-attr\">command:<\/span> <span class=\"hljs-string\">'--default-authentication-plugin=mysql_native_password'<\/span>\r\n    <span class=\"hljs-attr\">volumes:<\/span>\r\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-string\">db_data:\/var\/lib\/mysql<\/span>\r\n    <span class=\"hljs-attr\">environment:<\/span>\r\n      <span class=\"hljs-attr\">MYSQL_ROOT_PASSWORD:<\/span> <span class=\"hljs-string\">password_super_rahasia<\/span>\r\n      <span class=\"hljs-attr\">MYSQL_DATABASE:<\/span> <span class=\"hljs-string\">wordpress<\/span>\r\n      <span class=\"hljs-attr\">MYSQL_USER:<\/span> <span class=\"hljs-string\">wordpress_user<\/span>\r\n      <span class=\"hljs-attr\">MYSQL_PASSWORD:<\/span> <span class=\"hljs-string\">password_user_wp<\/span>\r\n\r\n  <span class=\"hljs-attr\">wordpress:<\/span>\r\n    <span class=\"hljs-attr\">image:<\/span> <span class=\"hljs-string\">wordpress:latest<\/span>\r\n    <span class=\"hljs-attr\">container_name:<\/span> <span class=\"hljs-string\">wordpress_web<\/span>\r\n    <span class=\"hljs-attr\">restart:<\/span> <span class=\"hljs-string\">always<\/span>\r\n    <span class=\"hljs-attr\">ports:<\/span>\r\n      <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-string\">\"8000:80\"<\/span>\r\n    <span class=\"hljs-attr\">environment:<\/span>\r\n      <span class=\"hljs-attr\">WORDPRESS_DB_HOST:<\/span> <span class=\"hljs-string\">db<\/span>\r\n      <span class=\"hljs-attr\">WORDPRESS_DB_USER:<\/span> <span class=\"hljs-string\">wordpress_user<\/span>\r\n      <span class=\"hljs-attr\">WORDPRESS_DB_PASSWORD:<\/span> <span class=\"hljs-string\">password_user_wp<\/span>\r\n      <span class=\"hljs-attr\">WORDPRESS_DB_NAME:<\/span> <span class=\"hljs-string\">wordpress<\/span>\r\n\r\n<span class=\"hljs-attr\">volumes:<\/span>\r\n  <span class=\"hljs-attr\">db_data:<\/span>\r\n<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<p><b>Mari kita bedah satu persatu:<\/b><\/p>\n<ul>\n<li><code>services<\/code>: Di sini kita mendefinisikan setiap &#8220;layanan&#8221; atau kontainer kita.<\/li>\n<li><code>db<\/code>: Ini adalah layanan database kita.\n<ul>\n<li><code>image: mariadb:10.6<\/code>: Kita menggunakan gambar MariaDB.<\/li>\n<li><code>restart: always<\/code>: Jika kontainer ini crash, Docker akan otomatis menyalakannya kembali.<\/li>\n<li><code>volumes: - db_data:\/var\/lib\/mysql<\/code>: Ini sangat penting! Kita membuat <b>volume<\/b> bernama <code>db_data<\/code>. Ini akan menyimpan data database kita secara permanen di server, bahkan jika kita menghapus kontainernya.<\/li>\n<li><code>environment<\/code>: Di sini kita mengatur variabel-variabel penting seperti password root dan membuat user database khusus untuk WordPress.<\/li>\n<\/ul>\n<\/li>\n<li><code>wordpress<\/code>: Ini adalah layanan web server kita.\n<ul>\n<li><code>image: wordpress:latest<\/code>: Kita menggunakan gambar WordPress resmi terbaru.<\/li>\n<li><code>ports: - \"8000:80\"<\/code>: Kita memetakan port 8000 di server kita ke port 80 di dalam kontainer WordPress.<\/li>\n<li><code>environment<\/code>: Kita memberitahu WordPress cara terhubung ke database kita. Perhatikan <code>WORDPRESS_DB_HOST: db<\/code>, nama <code>db<\/code> ini merujuk ke nama layanan database yang kita definisikan di atas. Docker Compose secara otomatis membuat jaringan agar mereka bisa saling &#8220;berbicara&#8221;.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Setelah selesai, simpan file dan keluar dari nano (<b>Ctrl+X<\/b>, lalu <b>Y<\/b>, lalu <b>Enter<\/b>).<\/p>\n<p>&nbsp;<\/p>\n<h3 id=\"langkah-4-coba-jalankan\" ><b>Langkah 4: Coba Jalankan<\/b><\/h3>\n<p>Sekarang bagian yang paling memuaskan. Dari dalam direktori situs-wordpress kita, jalankan satu perintah ini:<\/p>\n<div class=\"code-block ng-tns-c1437408396-237 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation\">\n<div class=\"formatted-code-block-internal-container ng-tns-c1437408396-237\">\n<div class=\"animated-opacity ng-tns-c1437408396-237\">\n<pre class=\"ng-tns-c1437408396-237\"><code class=\"code-container formatted ng-tns-c1437408396-237\" role=\"text\" data-test-id=\"code-content\">docker compose up -d\r\n<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<p>Opsi -d (detached) akan menjalankan semuanya di latar belakang.<\/p>\n<p>Docker Compose akan membaca file docker-compose.yml kita, mengunduh gambar mariadb dan wordpress (jika belum ada), membuat jaringan, membuat volume, dan akhirnya menyalakan kedua kontainer sesuai konfigurasi kita.<\/p>\n<p>Kita bisa memeriksa statusnya dengan:<\/p>\n<div class=\"code-block ng-tns-c1437408396-238 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation\">\n<div class=\"formatted-code-block-internal-container ng-tns-c1437408396-238\">\n<div class=\"animated-opacity ng-tns-c1437408396-238\">\n<pre class=\"ng-tns-c1437408396-238\"><code class=\"code-container formatted ng-tns-c1437408396-238\" role=\"text\" data-test-id=\"code-content\">docker compose ps\r\n<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<p>Kita akan melihat dua kontainer (wordpress_db dan wordpress_web) dalam keadaan &#8220;running&#8221;.<\/p>\n<p>&nbsp;<\/p>\n<h3 id=\"langkah-5-mengunjungi-situs-wordpress-baru-kita\" ><b>Langkah 5: Mengunjungi Situs WordPress Baru Kita<\/b><\/h3>\n<p>Saatnya melihat hasil kerja keras kita. Buka browser dan navigasikan ke alamat IP server kita, dengan port :8000.<\/p>\n<p><code>http:\/\/ALAMAT_IP_SERVER_KITA:8000<\/code><\/p>\n<p>Kita akan disambut oleh halaman instalasi WordPress yang terkenal! Kita bisa melanjutkan proses instalasi 5 menit yang legendaris itu. Semua data yang kita masukkan akan disimpan dengan aman di dalam volume database yang sudah kita buat.<\/p>\n<p>&nbsp;<\/p>\n<h3 id=\"langkah-6-cara-mematikan-aplikasi\" ><b>Langkah 6: Cara Mematikan Aplikasi<\/b><\/h3>\n<p>&nbsp;<\/p>\n<p>Jika kita ingin menghentikan dan membersihkan aplikasi kita, Docker Compose membuatnya sama mudahnya.<\/p>\n<p>Dari direktori situs-wordpress yang sama, jalankan:<\/p>\n<div class=\"code-block ng-tns-c1437408396-239 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation\">\n<div class=\"formatted-code-block-internal-container ng-tns-c1437408396-239\">\n<div class=\"animated-opacity ng-tns-c1437408396-239\">\n<pre class=\"ng-tns-c1437408396-239\"><code class=\"code-container formatted ng-tns-c1437408396-239\" role=\"text\" data-test-id=\"code-content\">docker compose down\r\n<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<p>Perintah ini akan menghentikan dan menghapus kontainer serta jaringan yang dibuat. Namun, <strong>volume db_data<\/strong><b> akan tetap ada<\/b>, jadi data kita aman jika kita ingin menyalakan kembali aplikasinya nanti.<\/p>\n","protected":false},"author":3,"comment_status":"open","ping_status":"closed","template":"","format":"standard","meta":[],"ht_kb_category":[107],"ht_kb_tag":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.jagoweb.com\/kb\/wp-json\/wp\/v2\/ht_kb\/2328"}],"collection":[{"href":"https:\/\/www.jagoweb.com\/kb\/wp-json\/wp\/v2\/ht_kb"}],"about":[{"href":"https:\/\/www.jagoweb.com\/kb\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/www.jagoweb.com\/kb\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jagoweb.com\/kb\/wp-json\/wp\/v2\/comments?post=2328"}],"version-history":[{"count":1,"href":"https:\/\/www.jagoweb.com\/kb\/wp-json\/wp\/v2\/ht_kb\/2328\/revisions"}],"predecessor-version":[{"id":2329,"href":"https:\/\/www.jagoweb.com\/kb\/wp-json\/wp\/v2\/ht_kb\/2328\/revisions\/2329"}],"wp:attachment":[{"href":"https:\/\/www.jagoweb.com\/kb\/wp-json\/wp\/v2\/media?parent=2328"}],"wp:term":[{"taxonomy":"ht_kb_category","embeddable":true,"href":"https:\/\/www.jagoweb.com\/kb\/wp-json\/wp\/v2\/ht_kb_category?post=2328"},{"taxonomy":"ht_kb_tag","embeddable":true,"href":"https:\/\/www.jagoweb.com\/kb\/wp-json\/wp\/v2\/ht_kb_tag?post=2328"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}