<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://bahrani.my.id/feed.xml" rel="self" type="application/atom+xml" /><link href="https://bahrani.my.id/" rel="alternate" type="text/html" /><updated>2026-04-13T11:29:22+07:00</updated><id>https://bahrani.my.id/feed.xml</id><title type="html">Bahrani’s Blog</title><subtitle>Blog catatan pribadi untuk berbagi pengetahuan dan pengalaman tentang Network Engineering, DevOps, dan System Administration.</subtitle><author><name>Bahrani</name></author><entry><title type="html">Bimble</title><link href="https://bahrani.my.id/catatan/Bimble/" rel="alternate" type="text/html" title="Bimble" /><published>2026-03-08T00:00:00+07:00</published><updated>2026-03-08T00:00:00+07:00</updated><id>https://bahrani.my.id/catatan/Bimble</id><content type="html" xml:base="https://bahrani.my.id/catatan/Bimble/"><![CDATA[<h3 id="perbandingan-website-tryout--bimbel-online">Perbandingan Website Tryout &amp; Bimbel Online</h3>

<table>
  <thead>
    <tr>
      <th>No</th>
      <th>Website Similar</th>
      <th>Cocok untuk</th>
      <th>Kelebihan</th>
      <th>Kekurangan</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td><a href="https://pusattryout.id/syaratdanketentuan/?utm_source=chatgpt.com">Pusattryout</a></td>
      <td>UTBK-SNBT, Ujian Mandiri, CPNS, Kedinasan, RB BUMN, PPPK</td>
      <td>Menyediakan berbagai tryout dan simulasi ujian dengan analisis hasil yang lengkap.</td>
      <td>Fokus utama hanya pada tryout, kurang pada bimbingan atau pembelajaran materi secara mendalam.</td>
    </tr>
    <tr>
      <td>2</td>
      <td><a href="https://indoasn.com/?utm_source=chatgpt.com">Indoasn</a></td>
      <td>CPNS, PPPK, UTBK, Kedinasan, tes bahasa</td>
      <td>Platform tryout online yang luas dengan berbagai ujian seleksi.</td>
      <td>Tidak ada layanan bimbingan langsung atau materi pembelajaran terstruktur.</td>
    </tr>
    <tr>
      <td>3</td>
      <td><a href="https://tryoutmasterofficial.com/about?utm_source=chatgpt.com">Try Out Master</a></td>
      <td>UTBK/SNBT, CPNS, kedinasan</td>
      <td>Menawarkan tryout online dengan bank soal dan pembahasan soal.</td>
      <td>Lebih fokus pada simulasi ujian, tidak memberikan kelas bimbingan atau latihan materi.</td>
    </tr>
    <tr>
      <td>4</td>
      <td><a href="https://btwedutech.com/?utm_source=chatgpt.com">BTW Edutech</a></td>
      <td>PTN, kedinasan, TNI/Polri, CPNS</td>
      <td>Memadukan bimbingan kelas dan tryout, cocok untuk persiapan lebih komprehensif.</td>
      <td>Biaya cenderung lebih tinggi dibandingkan platform yang hanya menyediakan tryout.</td>
    </tr>
    <tr>
      <td>5</td>
      <td><a href="https://www.ruangguru.com/brain-academy-center-sma?utm_source=chatgpt.com">Ruangguru / Brain Academy</a></td>
      <td>UTBK-SNBT, kedinasan, belajar online/offline</td>
      <td>Menyediakan bimbingan tatap muka dan online dengan fitur tryout.</td>
      <td>Fokus utama pada bimbel dengan harga relatif lebih mahal.</td>
    </tr>
    <tr>
      <td>6</td>
      <td><a href="https://www.zenius.net/?utm_source=chatgpt.com">Zenius</a></td>
      <td>SNBT/UTBK, TKA, latihan rutin</td>
      <td>Menggabungkan pembelajaran online dan tryout dengan konten yang lengkap.</td>
      <td>Lebih cocok untuk siswa sekolah, kurang fokus pada ujian kedinasan atau CPNS.</td>
    </tr>
    <tr>
      <td>7</td>
      <td><a href="https://www.quipper.com/id/video/content/?utm_source=chatgpt.com">Quipper</a></td>
      <td>Belajar online, tryout, latihan soal</td>
      <td>Integrasi antara belajar materi dan tryout yang terstruktur.</td>
      <td>Tidak ada bimbingan langsung, hanya materi pembelajaran dan latihan soal.</td>
    </tr>
  </tbody>
</table>]]></content><author><name>Bahrani</name></author><category term="Catatan" /><category term="Catatan" /><summary type="html"><![CDATA[Memilih Bimbel pas buat periapan saya]]></summary></entry><entry><title type="html">MCP — Model Context Protocol Lengkap + Cara Setup</title><link href="https://bahrani.my.id/catatan/MCP/" rel="alternate" type="text/html" title="MCP — Model Context Protocol Lengkap + Cara Setup" /><published>2026-03-07T00:00:00+07:00</published><updated>2026-03-07T00:00:00+07:00</updated><id>https://bahrani.my.id/catatan/MCP</id><content type="html" xml:base="https://bahrani.my.id/catatan/MCP/"><![CDATA[<h2 id="apa-itu-mcp">Apa itu MCP?</h2>

<p><strong>MCP (Model Context Protocol)</strong> adalah protokol standar yang memungkinkan <em>Large Language Model</em> (LLM) seperti Claude, ChatGPT, atau Grok untuk <strong>berinteraksi langsung</strong> dengan aplikasi eksternal, sistem, dan layanan pihak ketiga.</p>

<p>Bayangkan MCP seperti <strong>USB-C universal</strong> untuk AI — satu protokol yang bisa menghubungkan AI ke berbagai aplikasi:</p>
<ul>
  <li>Browser Chrome</li>
  <li>Google Drive, Figma</li>
  <li>Database, GitHub</li>
  <li>Aplikasi internal perusahaan</li>
</ul>

<p>Tanpa MCP, AI hanya bisa “bercerita” berdasarkan teks yang kamu kasih. Dengan MCP, AI bisa <strong>melihat data real-time</strong>, <strong>mengambil tindakan</strong>, dan <strong>memberikan jawaban yang benar-benar kontekstual</strong>.</p>

<hr />

<h2 id="kenapa-mcp-penting">Kenapa MCP Penting?</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Sebelum MCP:  
AI → <span class="s2">"Tolong cek performa websitenya"</span>  
AI → <span class="s2">"Maaf, saya tidak bisa akses website secara langsung."</span>

Setelah MCP:  
AI → <span class="s2">"Tolong cek performa websitenya"</span>  
AI → ✅ <span class="s2">"Saya sudah cek via Chrome DevTools. Loading time 3.2s, ada 5 gambar belum di-optimize."</span>
</code></pre></div></div>

<p>MCP membuat AI <strong>10x lebih berguna</strong> untuk:</p>
<ul>
  <li>Developer (debugging, code review)</li>
  <li>Product Manager (cek UI/UX real-time)</li>
  <li>Data Analyst (akses database langsung)</li>
  <li>Operations (monitoring server)</li>
</ul>

<hr />

<h2 id="cara-kerja-mcp-diagram-sederhana">Cara Kerja MCP (Diagram Sederhana)</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>┌─────────────┐    ┌──────────────┐    ┌─────────────────┐
│   Your AI   │◄──►│   MCP        │◄──►│ External Apps   │
│ (Claude/Grok│    │ Server       │    │ Chrome/Figma/   │
│  ChatGPT)   │    │ (Bridge)     │    │  Database/Git   │
└─────────────┘    └──────────────┘    └─────────────────┘
</code></pre></div></div>

<p><strong>Alur kerjanya:</strong></p>
<ol>
  <li>Kamu tanya AI → <em>“Cek performa website”</em></li>
  <li>AI kirim permintaan ke <strong>MCP Server</strong></li>
  <li>MCP Server jalankan perintah di aplikasi eksternal</li>
  <li>Hasil dikirim balik ke AI → Kamu dapat jawaban akurat</li>
</ol>

<hr />

<h2 id="jenis-mcp-server-populer">Jenis MCP Server Populer</h2>

<p>Berikut beberapa MCP server yang paling sering digunakan:</p>

<h3 id="1-chrome-devtools-mcp">1. Chrome DevTools MCP</h3>
<p><strong>Fungsi:</strong> AI bisa akses Chrome Developer Tools secara langsung.<br />
<strong>Kegunaan:</strong> Cek performa website, analisis DOM, screenshot halaman.</p>

<h3 id="2-context7">2. Context7</h3>
<p><strong>Fungsi:</strong> Dokumentasi dan tracking update aplikasi.<br />
<strong>Kegunaan:</strong> AI bisa baca changelog, track versi fitur.</p>

<h3 id="3-figma-context-mcp">3. Figma Context MCP</h3>
<p><strong>Fungsi:</strong> AI bisa akses file Figma.<br />
<strong>Kegunaan:</strong> Review UI/UX design, generate kode dari Figma.</p>

<hr />

<h2 id="konfigurasi-mcp-server-lengkap">Konfigurasi MCP Server Lengkap</h2>

<p><strong>Simpan sebagai <code class="language-plaintext highlighter-rouge">mcp.json</code>:</strong></p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"mcpServers"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"chrome-devtools"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"stdio"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"npx"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"args"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="s2">"-y"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"chrome-devtools-mcp@latest"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"--isolated"</span><span class="w">
      </span><span class="p">],</span><span class="w">
      </span><span class="nl">"autoApprove"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="s2">"take_snapshot"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"navigate_page"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"list_console_messages"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"take_screenshot"</span><span class="w">
      </span><span class="p">]</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"context7"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"npx"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"args"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="s2">"-y"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"@upstash/context7-mcp"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"--api-key"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"YOUR_CONTEXT7_API_KEY"</span><span class="w">
      </span><span class="p">]</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"github.com/GLips/Figma-Context-MCP"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cmd"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"args"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="s2">"/c"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"npx"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"-y"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"figma-developer-mcp"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"--figma-api-key=YOUR_FIGMA_API_KEY"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"--stdio"</span><span class="w">
      </span><span class="p">],</span><span class="w">
      </span><span class="nl">"disabled"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
      </span><span class="nl">"autoApprove"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="s2">"get_figma_data"</span><span class="w">
      </span><span class="p">]</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="cara-setup-mcp-langkah-demi-langkah">Cara Setup MCP (Langkah Demi Langkah)</h2>

<h3 id="prasyarat">Prasyarat</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Node.js 18+ ✅
Chrome Browser ✅
API Keys (Context7, Figma) ✅
</code></pre></div></div>

<h3 id="1-install-dependencies">1. Install Dependencies</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm <span class="nb">install</span> <span class="nt">-g</span> npx
<span class="c"># Atau langsung pakai npx (sudah include)</span>
</code></pre></div></div>

<h3 id="2-jalankan-server">2. Jalankan Server</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Chrome DevTools MCP</span>
npx <span class="nt">-y</span> chrome-devtools-mcp@latest <span class="nt">--isolated</span>

<span class="c"># Context7 MCP</span>
npx <span class="nt">-y</span> @upstash/context7-mcp <span class="nt">--api-key</span><span class="o">=</span>YOUR_API_KEY

<span class="c"># Figma MCP (Windows)</span>
cmd /c <span class="s2">"npx -y figma-developer-mcp --figma-api-key=YOUR_FIGMA_KEY --stdio"</span>
</code></pre></div></div>

<h3 id="3-hubungkan-ke-ai-client">3. Hubungkan ke AI Client</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Claude Desktop / Cursor / VSCode → Settings → MCP Server URL
http://localhost:8080/mcp
</code></pre></div></div>

<hr />

<h2 id="contoh-penggunaan-nyata">Contoh Penggunaan Nyata</h2>

<h3 id="debugging-website">Debugging Website</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>User: "Websiteku lambat di mobile, cek dong"
AI: ✅ "Chrome DevTools check:
     - Largest Contentful Paint: 4.2s ❌
     - 8 gambar &gt; 500KB belum di-compress
     - CSS file 245KB bisa di-minify jadi 89KB"
</code></pre></div></div>

<h3 id="figma-design-review">Figma Design Review</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>User: "Review landing page Figma"
AI: ✅ "Figma data analysis:
     - Button spacing tidak konsisten (12px vs 16px)
     - Primary color #FF5733 kontras ratio 3.2:1 (minimal 4.5:1)
     - Text hierarchy kurang jelas"
</code></pre></div></div>

<h3 id="context-tracking">Context Tracking</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>User: "Update terakhir fitur login?"
AI: ✅ "Context7 log:
     v2.3.1 (3 hari lalu): 
     + 2FA support
     + Fix forgot password race condition
     - Performance 12% lebih cepat"
</code></pre></div></div>

<hr />

<h2 id="troubleshooting-umum">Troubleshooting Umum</h2>

<table>
  <thead>
    <tr>
      <th>Error</th>
      <th>Solusi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">port already in use</code></td>
      <td><code class="language-plaintext highlighter-rouge">killall node</code> atau ganti port</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Chrome not found</code></td>
      <td>Install Chrome stable</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">API key invalid</code></td>
      <td>Regenerate di dashboard</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Permission denied</code></td>
      <td>Tambah ke <code class="language-plaintext highlighter-rouge">autoApprove[]</code></td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="tips-keamanan--best-practices">Tips Keamanan &amp; Best Practices</h2>

<h3 id="-yang-harus-dilakukan">✅ Yang Harus Dilakukan:</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>- Selalu gunakan --isolated mode
- Batasi autoApprove hanya perintah aman
- Jangan commit API key ke Git
- Monitor memory usage Chrome DevTools
</code></pre></div></div>

<h3 id="-jangan">❌ Jangan:</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>- Jalankan di production tanpa auth
- Berikan akses database production
- Auto-approve semua perintah
</code></pre></div></div>

<hr />

<h2 id="daftar-mcp-server-lainnya">Daftar MCP Server Lainnya</h2>

<table>
  <thead>
    <tr>
      <th>Server</th>
      <th>Fungsi</th>
      <th>Command</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Filesystem MCP</td>
      <td>Baca/tulis file lokal</td>
      <td><code class="language-plaintext highlighter-rouge">filesystem-mcp</code></td>
    </tr>
    <tr>
      <td>GitHub MCP</td>
      <td>Clone repo, PR review</td>
      <td><code class="language-plaintext highlighter-rouge">github-mcp</code></td>
    </tr>
    <tr>
      <td>PostgreSQL MCP</td>
      <td>Query database</td>
      <td><code class="language-plaintext highlighter-rouge">postgres-mcp</code></td>
    </tr>
    <tr>
      <td>Slack MCP</td>
      <td>Kirim notifikasi</td>
      <td><code class="language-plaintext highlighter-rouge">slack-mcp</code></td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="kesimpulan">Kesimpulan</h2>

<p><strong>MCP = AI yang Bisa Bekerja Nyata, Bukan Cuma Ngobrol.</strong></p>

<p>Dengan satu file <code class="language-plaintext highlighter-rouge">mcp.json</code>, kamu ubah AI biasa jadi <strong>super assistant</strong> yang:</p>
<ul>
  <li>✅ Debug website real-time</li>
  <li>✅ Review Figma design</li>
  <li>✅ Track changelog aplikasi</li>
  <li>✅ Akses database langsung</li>
</ul>]]></content><author><name>Bahrani</name></author><category term="Catatan" /><category term="Catatan" /><category term="MCP" /><category term="AI" /><category term="Developer" /><summary type="html"><![CDATA[apa itu, manfaatnya, dan cara konfigurasi server seperti Chrome DevTools & Context7.]]></summary></entry><entry><title type="html">Panduan Lengkap Docker untuk Pemula</title><link href="https://bahrani.my.id/catatan/docker/" rel="alternate" type="text/html" title="Panduan Lengkap Docker untuk Pemula" /><published>2026-03-03T00:00:00+07:00</published><updated>2026-03-03T00:00:00+07:00</updated><id>https://bahrani.my.id/catatan/docker</id><content type="html" xml:base="https://bahrani.my.id/catatan/docker/"><![CDATA[<h2 id="quick-start-">Quick Start ⚡</h2>

<p>Baru mulai dengan Docker? Ikuti langkah ini:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 1. Cek instalasi</span>
docker <span class="nt">--version</span>

<span class="c"># 2. Jalankan container pertama kamu</span>
docker run hello-world

<span class="c"># 3. Coba web server</span>
docker run <span class="nt">-d</span> <span class="nt">-p</span> 8080:80 <span class="nt">--name</span> webserver nginx

<span class="c"># 4. Buka browser → http://localhost:8080</span>
</code></pre></div></div>

<hr />

<h2 id="apa-itu-docker">Apa itu Docker?</h2>

<p>Docker adalah sebuah <strong>container engine</strong> yang digunakan untuk menjalankan layanan atau aplikasi di dalam sebuah wadah terisolasi yang disebut <strong>container</strong>.</p>

<h3 id="-analogi-sederhana">🎭 Analogi Sederhana</h3>

<p>Bayangkan Docker seperti</p>

<table>
  <thead>
    <tr>
      <th>Istilah</th>
      <th>Analogi</th>
      <th>Penjelasan</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Image</strong></td>
      <td>Resep masakan</td>
      <td>Blueprint/cetakan untuk membuat container</td>
    </tr>
    <tr>
      <td><strong>Container</strong></td>
      <td>Makanan yang disajikan</td>
      <td>Instance yang berjalan dari image</td>
    </tr>
    <tr>
      <td><strong>Dockerfile</strong></td>
      <td>Buku resep</td>
      <td>Instruksi untuk membuat image</td>
    </tr>
    <tr>
      <td><strong>Docker Hub</strong></td>
      <td>Perpustakaan resep</td>
      <td>Tempat download image siap pakai</td>
    </tr>
    <tr>
      <td><strong>Volume</strong></td>
      <td>Tupperware</td>
      <td>Penyimpanan data yang tetap ada walau container dihapus</td>
    </tr>
  </tbody>
</table>

<h3 id="mengapa-menggunakan-docker">Mengapa Menggunakan Docker?</h3>

<p>Dengan Docker, kita bisa dengan mudah:</p>

<ul>
  <li>✅ Menjalankan beberapa layanan di komputer yang sama tanpa konflik</li>
  <li>✅ Mengemas aplikasi menjadi satu paket utuh yang mudah dipindahkan</li>
  <li>✅ Mengotomatisasi proses deployment</li>
  <li>✅ Memastikan “apa yang berjalan di laptop juga akan berjalan di server”</li>
</ul>

<blockquote>
  <p>💡 <strong>Sederhananya:</strong> Docker membantu pengembang dan sysadmin memastikan bahwa “apa yang berjalan di laptop juga akan berjalan di server.”</p>
</blockquote>

<h3 id="-alur-kerja-docker">🔄 Alur Kerja Docker</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>┌────────────┐     ┌────────────┐     ┌────────────┐
│ Dockerfile │────▶│   Image    │────▶│ Container  │
│  (resep)   │     │  (blueprint)│    │ (berjalan) │
└────────────┘     └────────────┘     └────────────┘
      │                  │                  │
      │ docker build     │ docker run       │
      └──────────────────┴──────────────────┘
</code></pre></div></div>

<hr />

<h2 id="command-docker">Command Docker</h2>

<p>Perintah Docker digunakan untuk mengelola image, container, dan komponen sistem lainnya.</p>

<h3 id="menampilkan-versi-docker">Menampilkan versi Docker</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker <span class="nt">--version</span>
</code></pre></div></div>

<h3 id="mengunduh-image-dari-docker-hub">Mengunduh image dari Docker Hub</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker pull &lt;nama_image&gt;
</code></pre></div></div>

<p>Contoh:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker pull nginx
docker pull mysql
docker pull python:3.10
</code></pre></div></div>

<h3 id="melihat-daftar-image-lokal">Melihat daftar image lokal</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker images
</code></pre></div></div>

<h3 id="menjalankan-container">Menjalankan container</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run &lt;nama_image&gt;
</code></pre></div></div>

<p>Contoh lengkap:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">-d</span> <span class="nt">-p</span> 8080:80 <span class="nt">--name</span> webserver nginx
</code></pre></div></div>

<p>Penjelasan flag:</p>

<table>
  <thead>
    <tr>
      <th>Flag</th>
      <th>Keterangan</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">-d</code></td>
      <td>Mode background (detached)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">-p 8080:80</code></td>
      <td>Mapping port (host:container)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">--name</code></td>
      <td>Memberi nama container</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">-e</code></td>
      <td>Set environment variable</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">-v</code></td>
      <td>Mount volume</td>
    </tr>
  </tbody>
</table>

<h3 id="melihat-container-berjalan">Melihat container berjalan</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker ps
</code></pre></div></div>

<p>Melihat semua container (termasuk yang berhenti):</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker ps <span class="nt">-a</span>
</code></pre></div></div>

<h3 id="menghentikan-container">Menghentikan container</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker stop &lt;container_id&gt;
</code></pre></div></div>

<p>Menghentikan semua container berjalan:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker stop <span class="si">$(</span>docker ps <span class="nt">-q</span><span class="si">)</span>
</code></pre></div></div>

<h3 id="menghapus-container">Menghapus container</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker <span class="nb">rm</span> &lt;container_id&gt;
</code></pre></div></div>

<p>Menghapus semua container yang berhenti:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker <span class="nb">rm</span> <span class="si">$(</span>docker ps <span class="nt">-a</span> <span class="nt">-q</span><span class="si">)</span>
</code></pre></div></div>

<h3 id="melihat-log-container">Melihat log container</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker logs &lt;container_id&gt;
</code></pre></div></div>

<p>Mode live (mengikuti log secara real-time):</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker logs <span class="nt">-f</span> &lt;container_id&gt;
</code></pre></div></div>

<h3 id="masuk-ke-dalam-container">Masuk ke dalam container</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker <span class="nb">exec</span> <span class="nt">-it</span> &lt;container_id&gt; bash
</code></pre></div></div>

<p>Atau menggunakan sh jika bash tidak tersedia:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker <span class="nb">exec</span> <span class="nt">-it</span> &lt;container_id&gt; sh
</code></pre></div></div>

<h3 id="menghapus-image">Menghapus image</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker rmi &lt;image_id&gt;
</code></pre></div></div>

<h3 id="membersihkan-resource-tidak-terpakai">Membersihkan resource tidak terpakai</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker system prune
</code></pre></div></div>

<hr />

<h2 id="docker-volume">Docker Volume</h2>

<p>Volume digunakan untuk menyimpan data secara persisten, sehingga data tidak hilang saat container dihapus.</p>

<h3 id="membuat-volume">Membuat volume</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker volume create my_volume
</code></pre></div></div>

<h3 id="melihat-daftar-volume">Melihat daftar volume</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker volume <span class="nb">ls</span>
</code></pre></div></div>

<h3 id="menggunakan-volume-saat-run">Menggunakan volume saat run</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">-d</span> <span class="nt">-v</span> my_volume:/var/lib/mysql mysql:8.0
</code></pre></div></div>

<h3 id="menghapus-volume">Menghapus volume</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker volume <span class="nb">rm </span>my_volume
</code></pre></div></div>

<hr />

<h2 id="docker-network">Docker Network</h2>

<p>Network memungkinkan container saling berkomunikasi.</p>

<h3 id="melihat-daftar-network">Melihat daftar network</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker network <span class="nb">ls</span>
</code></pre></div></div>

<h3 id="membuat-network-baru">Membuat network baru</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker network create my_network
</code></pre></div></div>

<h3 id="menghubungkan-container-ke-network">Menghubungkan container ke network</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">-d</span> <span class="nt">--network</span> my_network <span class="nt">--name</span> app nginx
</code></pre></div></div>

<h3 id="menghapus-network">Menghapus network</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker network <span class="nb">rm </span>my_network
</code></pre></div></div>

<hr />

<h2 id="contoh-penerapan-menjalankan-mysql">Contoh Penerapan: Menjalankan MySQL</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">-d</span> <span class="se">\</span>
  <span class="nt">--name</span> mysql-db <span class="se">\</span>
  <span class="nt">-e</span> <span class="nv">MYSQL_ROOT_PASSWORD</span><span class="o">=</span>secret <span class="se">\</span>
  <span class="nt">-e</span> <span class="nv">MYSQL_DATABASE</span><span class="o">=</span>mydb <span class="se">\</span>
  <span class="nt">-p</span> 3306:3306 <span class="se">\</span>
  <span class="nt">-v</span> mysql_data:/var/lib/mysql <span class="se">\</span>
  mysql:8.0
</code></pre></div></div>

<p>Cek container:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker ps
</code></pre></div></div>

<p>Masuk ke MySQL:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker <span class="nb">exec</span> <span class="nt">-it</span> mysql-db mysql <span class="nt">-u</span> root <span class="nt">-p</span>
</code></pre></div></div>

<hr />

<h2 id="dockerfile">Dockerfile</h2>

<p>Dockerfile adalah file teks berisi instruksi langkah demi langkah untuk membangun sebuah Docker image.</p>

<h3 id="analogi-sederhana">Analogi Sederhana</h3>

<table>
  <thead>
    <tr>
      <th>Dockerfile</th>
      <th>Image</th>
      <th>Container</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Resep masakan</td>
      <td>Hasil masakan</td>
      <td>Makanan yang disajikan</td>
    </tr>
  </tbody>
</table>

<h3 id="struktur-dasar-dockerfile">Struktur Dasar Dockerfile</h3>

<div class="language-dockerfile highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 1. Base image</span>
<span class="k">FROM</span><span class="s"> php:8.2-cli</span>

<span class="c"># 2. Tentukan direktori kerja di dalam container</span>
<span class="k">WORKDIR</span><span class="s"> /app</span>

<span class="c"># 3. Copy file ke container</span>
<span class="k">COPY</span><span class="s"> . .</span>

<span class="c"># 4. Install dependency</span>
<span class="k">RUN </span>docker-php-ext-install pdo pdo_mysql

<span class="c"># 5. Expose port (opsional)</span>
<span class="k">EXPOSE</span><span class="s"> 8000</span>

<span class="c"># 6. Command saat container dijalankan</span>
<span class="k">CMD</span><span class="s"> ["php", "artisan", "serve", "--host=0.0.0.0", "--port=8000"]</span>
</code></pre></div></div>

<h3 id="contoh-dockerfile-python">Contoh Dockerfile Python</h3>

<div class="language-dockerfile highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">FROM</span><span class="s"> python:3.10</span>

<span class="k">WORKDIR</span><span class="s"> /app</span>

<span class="k">COPY</span><span class="s"> requirements.txt .</span>

<span class="k">RUN </span>pip <span class="nb">install</span> <span class="nt">-r</span> requirements.txt

<span class="k">COPY</span><span class="s"> . .</span>

<span class="k">EXPOSE</span><span class="s"> 5000</span>

<span class="k">CMD</span><span class="s"> ["python", "app.py"]</span>
</code></pre></div></div>

<h3 id="build-image-dari-dockerfile">Build image dari Dockerfile</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker build <span class="nt">-t</span> myapp:latest <span class="nb">.</span>
</code></pre></div></div>

<h3 id="menjalankan-image-yang-sudah-di-build">Menjalankan image yang sudah di-build</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">-d</span> <span class="nt">-p</span> 5000:5000 myapp:latest
</code></pre></div></div>

<hr />

<h2 id="docker-compose">Docker Compose</h2>

<p>Docker Compose adalah tool untuk mendefinisikan dan menjalankan aplikasi multi-container. Dengan Docker Compose, kita bisa menjalankan banyak container dengan satu perintah.</p>

<h3 id="contoh-docker-composeyml">Contoh docker-compose.yml</h3>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">3.8'</span>

<span class="na">services</span><span class="pi">:</span>
  <span class="c1"># Web Server</span>
  <span class="na">web</span><span class="pi">:</span>
    <span class="na">image</span><span class="pi">:</span> <span class="s">nginx:latest</span>
    <span class="na">ports</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s2">"</span><span class="s">8080:80"</span>
    <span class="na">volumes</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">./html:/usr/share/nginx/html</span>
    <span class="na">depends_on</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">php</span>

  <span class="c1"># PHP Application</span>
  <span class="na">php</span><span class="pi">:</span>
    <span class="na">image</span><span class="pi">:</span> <span class="s">php:8.2-fpm</span>
    <span class="na">volumes</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">./html:/usr/share/nginx/html</span>

  <span class="c1"># Database</span>
  <span class="na">db</span><span class="pi">:</span>
    <span class="na">image</span><span class="pi">:</span> <span class="s">mysql:8.0</span>
    <span class="na">environment</span><span class="pi">:</span>
      <span class="na">MYSQL_ROOT_PASSWORD</span><span class="pi">:</span> <span class="s">rootsecret</span>
      <span class="na">MYSQL_DATABASE</span><span class="pi">:</span> <span class="s">myapp</span>
      <span class="na">MYSQL_USER</span><span class="pi">:</span> <span class="s">appuser</span>
      <span class="na">MYSQL_PASSWORD</span><span class="pi">:</span> <span class="s">secret</span>
    <span class="na">ports</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s2">"</span><span class="s">3306:3306"</span>
    <span class="na">volumes</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">db_data:/var/lib/mysql</span>

  <span class="c1"># Redis Cache</span>
  <span class="na">redis</span><span class="pi">:</span>
    <span class="na">image</span><span class="pi">:</span> <span class="s">redis:alpine</span>
    <span class="na">ports</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s2">"</span><span class="s">6379:6379"</span>

<span class="na">volumes</span><span class="pi">:</span>
  <span class="na">db_data</span><span class="pi">:</span>
</code></pre></div></div>

<h3 id="perintah-docker-compose">Perintah Docker Compose</h3>

<p>Menjalankan semua service:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker compose up <span class="nt">-d</span>
</code></pre></div></div>

<p>Menghentikan semua service:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker compose down
</code></pre></div></div>

<p>Melihat status service:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker compose ps
</code></pre></div></div>

<p>Melihat log:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker compose logs <span class="nt">-f</span>
</code></pre></div></div>

<p>Rebuild dan restart:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker compose up <span class="nt">-d</span> <span class="nt">--build</span>
</code></pre></div></div>

<hr />

<h2 id="perbedaan-dockerfile-vs-docker-compose">Perbedaan Dockerfile vs Docker Compose</h2>

<table>
  <thead>
    <tr>
      <th>Aspek</th>
      <th>Dockerfile</th>
      <th>Docker Compose</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Fungsi</td>
      <td>Membuat image</td>
      <td>Menjalankan banyak container</td>
    </tr>
    <tr>
      <td>Isi</td>
      <td>Instruksi build</td>
      <td>Konfigurasi layanan</td>
    </tr>
    <tr>
      <td>Perintah</td>
      <td><code class="language-plaintext highlighter-rouge">docker build</code></td>
      <td><code class="language-plaintext highlighter-rouge">docker compose up</code></td>
    </tr>
    <tr>
      <td>Use case</td>
      <td>Build custom image</td>
      <td>Orkestrasi multi-container</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="tips-dan-best-practices">Tips dan Best Practices</h2>

<h3 id="1-gunakan-dockerignore">1. Gunakan .dockerignore</h3>

<p>Buat file <code class="language-plaintext highlighter-rouge">.dockerignore</code> untuk mengecualikan file yang tidak perlu:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>node_modules
.git
.env
*.log
</code></pre></div></div>

<h3 id="2-jangan-jalankan-sebagai-root">2. Jangan Jalankan sebagai Root</h3>

<div class="language-dockerfile highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">RUN </span>useradd <span class="nt">-m</span> myuser
<span class="k">USER</span><span class="s"> myuser</span>
</code></pre></div></div>

<h3 id="3-multi-stage-build">3. Multi-stage Build</h3>

<div class="language-dockerfile highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Build stage</span>
<span class="k">FROM</span><span class="w"> </span><span class="s">golang:1.21</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="s">builder</span>
<span class="k">WORKDIR</span><span class="s"> /app</span>
<span class="k">COPY</span><span class="s"> . .</span>
<span class="k">RUN </span>go build <span class="nt">-o</span> myapp

<span class="c"># Runtime stage</span>
<span class="k">FROM</span><span class="s"> alpine:latest</span>
<span class="k">COPY</span><span class="s"> --from=builder /app/myapp /usr/local/bin/</span>
<span class="k">CMD</span><span class="s"> ["myapp"]</span>
</code></pre></div></div>

<h3 id="4-gunakan-specific-version-tags">4. Gunakan Specific Version Tags</h3>

<p>Hindari menggunakan <code class="language-plaintext highlighter-rouge">latest</code>, gunakan version spesifik:</p>

<div class="language-dockerfile highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">FROM</span><span class="s"> node:20.10-alpine  # Baik</span>
<span class="k">FROM</span><span class="s"> node:latest        # Kurang baik</span>
</code></pre></div></div>

<h3 id="5-manfaatkan-build-cache">5. Manfaatkan Build Cache</h3>

<p>Urutkan instruksi dari yang paling jarang berubah ke yang paling sering berubah:</p>

<div class="language-dockerfile highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">FROM</span><span class="s"> node:20-alpine</span>
<span class="k">WORKDIR</span><span class="s"> /app</span>
<span class="k">COPY</span><span class="s"> package*.json ./    # Jarang berubah</span>
<span class="k">RUN </span>npm <span class="nb">install</span>          <span class="c"># Dependency</span>
<span class="k">COPY</span><span class="s"> . .                 # Sering berubah</span>
<span class="k">CMD</span><span class="s"> ["npm", "start"]</span>
</code></pre></div></div>

<hr />

<h2 id="ringkasan-perintah-penting">Ringkasan Perintah Penting</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Image</span>
docker pull &lt;image&gt;        <span class="c"># Unduh image</span>
docker images              <span class="c"># Daftar image</span>
docker rmi &lt;image&gt;         <span class="c"># Hapus image</span>
docker build <span class="nt">-t</span> name <span class="nb">.</span>     <span class="c"># Build image</span>

<span class="c"># Container</span>
docker run &lt;image&gt;         <span class="c"># Jalankan container</span>
docker ps                  <span class="c"># Container berjalan</span>
docker ps <span class="nt">-a</span>               <span class="c"># Semua container</span>
docker stop &lt;<span class="nb">id</span><span class="o">&gt;</span>           <span class="c"># Hentikan container</span>
docker <span class="nb">rm</span> &lt;<span class="nb">id</span><span class="o">&gt;</span>             <span class="c"># Hapus container</span>
docker logs &lt;<span class="nb">id</span><span class="o">&gt;</span>           <span class="c"># Lihat log</span>
docker <span class="nb">exec</span> <span class="nt">-it</span> &lt;<span class="nb">id</span><span class="o">&gt;</span> bash  <span class="c"># Masuk container</span>

<span class="c"># Volume &amp; Network</span>
docker volume <span class="nb">ls</span>           <span class="c"># Daftar volume</span>
docker network <span class="nb">ls</span>          <span class="c"># Daftar network</span>

<span class="c"># Docker Compose</span>
docker compose up <span class="nt">-d</span>       <span class="c"># Jalankan semua service</span>
docker compose down        <span class="c"># Hentikan semua service</span>
docker compose logs <span class="nt">-f</span>     <span class="c"># Lihat log semua service</span>

<span class="c"># Cleanup</span>
docker system prune        <span class="c"># Bersihkan resource tidak terpakai</span>
</code></pre></div></div>

<hr />

<h2 id="kesimpulan">Kesimpulan</h2>

<p>Docker membantu developer menjalankan aplikasi secara konsisten tanpa perlu khawatir perbedaan environment. Dengan memahami command dasar, Dockerfile, dan Docker Compose, kamu sudah siap menggunakan Docker untuk development maupun deployment.</p>

<h3 id="konsep-kunci">Konsep Kunci</h3>

<table>
  <thead>
    <tr>
      <th>Istilah</th>
      <th>Penjelasan</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Dockerfile</strong></td>
      <td>Cara membuat image</td>
    </tr>
    <tr>
      <td><strong>Image</strong></td>
      <td>Blueprint aplikasi</td>
    </tr>
    <tr>
      <td><strong>Container</strong></td>
      <td>Aplikasi yang berjalan</td>
    </tr>
    <tr>
      <td><strong>Docker Compose</strong></td>
      <td>Menjalankan banyak container sekaligus</td>
    </tr>
    <tr>
      <td><strong>Volume</strong></td>
      <td>Penyimpanan data persisten</td>
    </tr>
    <tr>
      <td><strong>Network</strong></td>
      <td>Koneksi antar container</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="-troubleshooting-error-yang-sering-terjadi">🔧 Troubleshooting: Error yang Sering Terjadi</h2>

<h3 id="1-port-sudah-digunakan">1. Port sudah digunakan</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Error: port is already allocated
</code></pre></div></div>

<p><strong>Solusi:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Cek apa yang menggunakan port</span>
netstat <span class="nt">-ano</span> | findstr :8080

<span class="c"># Gunakan port lain</span>
docker run <span class="nt">-d</span> <span class="nt">-p</span> 8081:80 nginx
</code></pre></div></div>

<h3 id="2-container-tidak-bisa-dihapus">2. Container tidak bisa dihapus</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Error: container is running
</code></pre></div></div>

<p><strong>Solusi:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Hentikan dulu, lalu hapus</span>
docker stop &lt;container_id&gt;
docker <span class="nb">rm</span> &lt;container_id&gt;

<span class="c"># Atau force remove</span>
docker <span class="nb">rm</span> <span class="nt">-f</span> &lt;container_id&gt;
</code></pre></div></div>

<h3 id="3-permission-denied-linux">3. Permission denied (Linux)</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Error: permission denied <span class="k">while </span>trying to connect to the Docker daemon
</code></pre></div></div>

<p><strong>Solusi:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Tambahkan user ke grup docker</span>
<span class="nb">sudo </span>usermod <span class="nt">-aG</span> docker <span class="nv">$USER</span>

<span class="c"># Logout dan login kembali</span>
</code></pre></div></div>

<h3 id="4-no-space-left-on-device">4. No space left on device</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Error: no space left on device
</code></pre></div></div>

<p><strong>Solusi:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Bersihkan semua resource tidak terpakai</span>
docker system prune <span class="nt">-a</span>

<span class="c"># Lihat penggunaan disk</span>
docker system <span class="nb">df</span>
</code></pre></div></div>

<h3 id="5-image-tidak-ditemukan">5. Image tidak ditemukan</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Error: image not found
</code></pre></div></div>

<p><strong>Solusi:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Pull image terlebih dahulu</span>
docker pull &lt;nama_image&gt;

<span class="c"># Atau cek nama image yang benar</span>
docker images
</code></pre></div></div>

<hr />

<h2 id="-skenario-praktis">📋 Skenario Praktis</h2>

<h3 id="skenario-1-setup-development-web-server">Skenario 1: Setup Development Web Server</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Jalankan Nginx untuk development</span>
docker run <span class="nt">-d</span> <span class="se">\</span>
  <span class="nt">--name</span> dev-web <span class="se">\</span>
  <span class="nt">-p</span> 8080:80 <span class="se">\</span>
  <span class="nt">-v</span> <span class="si">$(</span><span class="nb">pwd</span><span class="si">)</span>/html:/usr/share/nginx/html <span class="se">\</span>
  nginx:alpine

<span class="c"># Edit file di folder html/ dan refresh browser</span>
</code></pre></div></div>

<h3 id="skenario-2-database-sementara-untuk-testing">Skenario 2: Database Sementara untuk Testing</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Jalankan PostgreSQL untuk testing</span>
docker run <span class="nt">-d</span> <span class="se">\</span>
  <span class="nt">--name</span> test-db <span class="se">\</span>
  <span class="nt">-e</span> <span class="nv">POSTGRES_PASSWORD</span><span class="o">=</span><span class="nb">test</span> <span class="se">\</span>
  <span class="nt">-e</span> <span class="nv">POSTGRES_DB</span><span class="o">=</span>testdb <span class="se">\</span>
  <span class="nt">-p</span> 5432:5432 <span class="se">\</span>
  postgres:15-alpine

<span class="c"># Connect ke database</span>
docker <span class="nb">exec</span> <span class="nt">-it</span> test-db psql <span class="nt">-U</span> postgres <span class="nt">-d</span> testdb

<span class="c"># Hapus setelah selesai (data akan hilang)</span>
docker <span class="nb">rm</span> <span class="nt">-f</span> test-db
</code></pre></div></div>

<h3 id="skenario-3-menjalankan-aplikasi-nodejs">Skenario 3: Menjalankan Aplikasi Node.js</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Struktur folder</span>
<span class="c"># my-app/</span>
<span class="c"># ├── Dockerfile</span>
<span class="c"># ├── package.json</span>
<span class="c"># └── index.js</span>

<span class="c"># Dockerfile</span>
FROM node:20-alpine
WORKDIR /app
COPY package<span class="k">*</span>.json ./
RUN npm <span class="nb">install
</span>COPY <span class="nb">.</span> <span class="nb">.</span>
EXPOSE 3000
CMD <span class="o">[</span><span class="s2">"npm"</span>, <span class="s2">"start"</span><span class="o">]</span>

<span class="c"># Build dan jalankan</span>
docker build <span class="nt">-t</span> my-node-app <span class="nb">.</span>
docker run <span class="nt">-d</span> <span class="nt">-p</span> 3000:3000 my-node-app
</code></pre></div></div>

<hr />

<h2 id="-perintah-lengkap-cheat-sheet">📚 Perintah Lengkap (Cheat Sheet)</h2>

<h3 id="image-commands">Image Commands</h3>

<table>
  <thead>
    <tr>
      <th>Perintah</th>
      <th>Fungsi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker pull &lt;image&gt;</code></td>
      <td>Unduh image dari registry</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker images</code></td>
      <td>Daftar image lokal</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker rmi &lt;image&gt;</code></td>
      <td>Hapus image</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker build -t &lt;name&gt; .</code></td>
      <td>Build image dari Dockerfile</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker tag &lt;id&gt; &lt;new_name&gt;</code></td>
      <td>Tag image dengan nama baru</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker push &lt;image&gt;</code></td>
      <td>Upload image ke registry</td>
    </tr>
  </tbody>
</table>

<h3 id="container-commands">Container Commands</h3>

<table>
  <thead>
    <tr>
      <th>Perintah</th>
      <th>Fungsi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker run &lt;image&gt;</code></td>
      <td>Buat dan jalankan container</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker ps</code></td>
      <td>Daftar container berjalan</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker ps -a</code></td>
      <td>Daftar semua container</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker stop &lt;id&gt;</code></td>
      <td>Hentikan container</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker start &lt;id&gt;</code></td>
      <td>Jalankan container yang berhenti</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker rm &lt;id&gt;</code></td>
      <td>Hapus container</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker logs &lt;id&gt;</code></td>
      <td>Lihat log container</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker exec -it &lt;id&gt; bash</code></td>
      <td>Masuk ke container</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker cp &lt;file&gt; &lt;id&gt;:/path</code></td>
      <td>Copy file ke container</td>
    </tr>
  </tbody>
</table>

<h3 id="docker-compose-commands">Docker Compose Commands</h3>

<table>
  <thead>
    <tr>
      <th>Perintah</th>
      <th>Fungsi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker compose up -d</code></td>
      <td>Jalankan semua service</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker compose down</code></td>
      <td>Hentikan dan hapus</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker compose ps</code></td>
      <td>Status service</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker compose logs -f</code></td>
      <td>Lihat log</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker compose restart</code></td>
      <td>Restart service</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">docker compose build</code></td>
      <td>Build ulang image</td>
    </tr>
  </tbody>
</table>

<hr />

<blockquote>
  <p>🎉 <strong>Selamat belajar Docker!</strong> Mulailah dengan project kecil dan tingkatkan secara bertahap.</p>
</blockquote>]]></content><author><name>Bahrani</name></author><category term="Catatan" /><category term="Docker" /><category term="DevOps" /><category term="Container" /><summary type="html"><![CDATA[Cheat sheet Docker lengkap dengan perintah dasar, Dockerfile, dan Docker Compose untuk developer dan sysadmin.]]></summary></entry><entry><title type="html">Selamat Datang di Catatan Saya</title><link href="https://bahrani.my.id/blog/selamat-datang/" rel="alternate" type="text/html" title="Selamat Datang di Catatan Saya" /><published>2026-03-02T00:00:00+07:00</published><updated>2026-03-02T00:00:00+07:00</updated><id>https://bahrani.my.id/blog/selamat-datang</id><content type="html" xml:base="https://bahrani.my.id/blog/selamat-datang/"><![CDATA[<h2 id="halo-dunia">Halo Dunia!</h2>

<p>Ini adalah post pertama di blog catatan pribadi saya. Saya menggunakan:</p>

<ul>
  <li><strong>Jekyll</strong> - Static site generator</li>
  <li><strong>Minimal Mistakes</strong> - Tema yang fleksibel dan keren</li>
  <li><strong>GitLab Pages</strong> - Hosting gratis</li>
</ul>

<h2 id="mengapa-jekyll">Mengapa Jekyll?</h2>

<p>Jekyll sangat cocok untuk:</p>

<ol>
  <li><strong>Blog pribadi</strong> - Mudah menulis dalam Markdown</li>
  <li><strong>Catatan belajar</strong> - Organisasi dengan kategori dan tag</li>
  <li><strong>Portofolio</strong> - Tampilan profesional</li>
  <li><strong>Gratis hosting</strong> - Bisa di GitLab Pages atau GitHub Pages</li>
</ol>

<h2 id="fitur-minimal-mistakes">Fitur Minimal Mistakes</h2>

<p>Tema ini memiliki banyak fitur:</p>

<ul>
  <li>Responsive design</li>
  <li>SEO friendly</li>
  <li>Dark mode support</li>
  <li>Search functionality</li>
  <li>Comment system</li>
  <li>Dan masih banyak lagi!</li>
</ul>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Contoh code highlighting</span>
<span class="k">def</span> <span class="nf">hello_world</span>
  <span class="nb">puts</span> <span class="s2">"Hello, Jekyll!"</span>
<span class="k">end</span>
</code></pre></div></div>

<blockquote>
  <p>“Jekyll adalah cara yang bagus untuk membuat website statis dengan mudah.” - Someone</p>
</blockquote>

<hr />

<p>Terima kasih sudah mengunjungi blog saya! 🎉</p>]]></content><author><name>Bahrani</name></author><category term="Blog" /><category term="welcome" /><category term="jekyll" /><summary type="html"><![CDATA[Post pertama di blog catatan pribadi saya menggunakan Jekyll dengan tema Minimal Mistakes.]]></summary></entry></feed>