# Docker

# 1. Pengenalan Docker

[![image.png](https://www.32inside.com/uploads/images/gallery/2026-04/scaled-1680-/v5gimage.png)](https://www.32inside.com/uploads/images/gallery/2026-04/v5gimage.png)

#### **1. Apa Itu Docker?**

Docker adalah **alat untuk membuat dan menjalankan "container"**, yaitu kotak kecil yang berisi aplikasi lengkap dan bisa berjalan di komputer mana pun.

Bayangkan kamu membuat mie instan:

- **Kompor = Komputer**
- **Panci &amp; air = Sistem operasi**
- **Bumbu + Mie = Aplikasi**
- Nah, Docker seperti **rice cooker**: siap pakai, tidak peduli dapurnya di mana.

##### **Istilah Penting**

- **Image** = resep aplikasi (contoh: `nginx`, `mysql`, `node`)
- **Container** = aplikasi yang sudah jadi dari image
- **Dockerfile** = file resep untuk membuat image
- **Docker Hub** = tempat download image (mirip Play Store untuk Docker)

---

#### **2. Kenapa Harus Pakai Docker?**

- 💼 **Portabel**: Bisa dijalankan di laptop, server, atau cloud.
- ⚡ **Cepat**: Lebih ringan dari virtual machine (VM).
- 💻 **Konsisten**: Tidak ada lagi masalah “kok di laptop saya jalan?”

---

#### **3. Perbedaan Docker dan Virtual Machine**

Sebelum ada Docker, biasanya aplikasi diinstal langsung di sistem operasi (OS). Cara ini punya banyak kekurangan, seperti:

- Susah setup: perlu install banyak library manual
- Tidak konsisten: beda OS → bisa beda hasil
- Aplikasi bisa konflik: misalnya dua versi PHP bentrok

Dengan Docker, semua **konfigurasi, library, dan environment** dikemas ke dalam 1 box/container yang bisa langsung dijalankan di mana saja.

##### **Perbandingan :**

[![image.png](https://www.32inside.com/uploads/images/gallery/2026-04/scaled-1680-/hS5image.png)](https://www.32inside.com/uploads/images/gallery/2026-04/hS5image.png)

<div class="_tableContainer_80l1q_1" id="bkmrk-fitur-instal-langsun"><div class="_tableWrapper_80l1q_14 group flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="2241" data-start="881" style="width: 100%; height: 318.563px;"><thead data-end="1017" data-start="881"><tr data-end="1017" data-start="881" style="height: 29.7969px;"><th data-col-size="sm" data-end="914" data-start="881" style="width: 24.7563%; height: 29.7969px;">Fitur</th><th data-col-size="sm" data-end="947" data-start="914" style="width: 22.0108%; height: 29.7969px;">Instal Langsung di OS</th><th data-col-size="sm" data-end="982" data-start="947" style="width: 24.5126%; height: 29.7969px;">Virtual Machine (VM)</th><th data-col-size="sm" data-end="1017" data-start="982" style="width: 28.6012%; height: 29.7969px;">Docker Container</th></tr></thead><tbody data-end="2241" data-start="1154"><tr data-end="1289" data-start="1154" style="height: 46.5938px;"><td data-col-size="sm" data-end="1186" data-start="1154" style="width: 24.7563%; height: 46.5938px;">Kebutuhan OS</td><td data-col-size="sm" data-end="1219" data-start="1186" style="width: 22.0108%; height: 46.5938px;">Langsung pakai OS utama</td><td data-col-size="sm" data-end="1254" data-start="1219" style="width: 24.5126%; height: 46.5938px;">Perlu OS lengkap di atas host</td><td data-col-size="sm" data-end="1289" data-start="1254" style="width: 28.6012%; height: 46.5938px;">Share OS kernel dengan host</td></tr><tr data-end="1425" data-start="1290" style="height: 29.7969px;"><td data-col-size="sm" data-end="1322" data-start="1290" style="width: 24.7563%; height: 29.7969px;">Isolasi Aplikasi</td><td data-col-size="sm" data-end="1355" data-start="1322" style="width: 22.0108%; height: 29.7969px;">Minim</td><td data-col-size="sm" data-end="1390" data-start="1355" style="width: 24.5126%; height: 29.7969px;">Sangat terisolasi</td><td data-col-size="sm" data-end="1425" data-start="1390" style="width: 28.6012%; height: 29.7969px;">Cukup terisolasi</td></tr><tr data-end="1561" data-start="1426" style="height: 29.7969px;"><td data-col-size="sm" data-end="1458" data-start="1426" style="width: 24.7563%; height: 29.7969px;">Setup</td><td data-col-size="sm" data-end="1491" data-start="1458" style="width: 22.0108%; height: 29.7969px;">Ribet (manual install)</td><td data-col-size="sm" data-end="1526" data-start="1491" style="width: 24.5126%; height: 29.7969px;">Lewat template atau ISO</td><td data-col-size="sm" data-end="1561" data-start="1526" style="width: 28.6012%; height: 29.7969px;">Lewat Dockerfile + image</td></tr><tr data-end="1697" data-start="1562" style="height: 29.7969px;"><td data-col-size="sm" data-end="1594" data-start="1562" style="width: 24.7563%; height: 29.7969px;">Konflik antar aplikasi</td><td data-col-size="sm" data-end="1627" data-start="1594" style="width: 22.0108%; height: 29.7969px;">Bisa terjadi</td><td data-col-size="sm" data-end="1662" data-start="1627" style="width: 24.5126%; height: 29.7969px;">Tidak (karena OS terpisah)</td><td data-col-size="sm" data-end="1697" data-start="1662" style="width: 28.6012%; height: 29.7969px;">Tidak (pakai container)</td></tr><tr data-end="1833" data-start="1698" style="height: 46.5938px;"><td data-col-size="sm" data-end="1730" data-start="1698" style="width: 24.7563%; height: 46.5938px;">Ukuran</td><td data-col-size="sm" data-end="1763" data-start="1730" style="width: 22.0108%; height: 46.5938px;">Ringan</td><td data-col-size="sm" data-end="1798" data-start="1763" style="width: 24.5126%; height: 46.5938px;">Berat (GB-an)</td><td data-col-size="sm" data-end="1833" data-start="1798" style="width: 28.6012%; height: 46.5938px;">Ringan (puluhan MB – ratusan MB)</td></tr><tr data-end="1969" data-start="1834" style="height: 29.7969px;"><td data-col-size="sm" data-end="1866" data-start="1834" style="width: 24.7563%; height: 29.7969px;">Kecepatan boot/start</td><td data-col-size="sm" data-end="1899" data-start="1866" style="width: 22.0108%; height: 29.7969px;">Instan</td><td data-col-size="sm" data-end="1934" data-start="1899" style="width: 24.5126%; height: 29.7969px;">Lambat (menit)</td><td data-col-size="sm" data-end="1969" data-start="1934" style="width: 28.6012%; height: 29.7969px;">Cepat (detik)</td></tr><tr data-end="2105" data-start="1970" style="height: 29.7969px;"><td data-col-size="sm" data-end="2002" data-start="1970" style="width: 24.7563%; height: 29.7969px;">Portabilitas</td><td data-col-size="sm" data-end="2035" data-start="2002" style="width: 22.0108%; height: 29.7969px;">Sulit pindah</td><td data-col-size="sm" data-end="2070" data-start="2035" style="width: 24.5126%; height: 29.7969px;">Bisa, tapi besar &amp; lambat</td><td data-col-size="sm" data-end="2105" data-start="2070" style="width: 28.6012%; height: 29.7969px;">Sangat portabel &amp; cepat</td></tr><tr data-end="2241" data-start="2106" style="height: 46.5938px;"><td data-col-size="sm" data-end="2138" data-start="2106" style="width: 24.7563%; height: 46.5938px;">Cocok untuk DevOps &amp; CI/CD</td><td data-col-size="sm" data-end="2171" data-start="2138" style="width: 22.0108%; height: 46.5938px;">Tidak cocok</td><td data-col-size="sm" data-end="2206" data-start="2171" style="width: 24.5126%; height: 46.5938px;">Kurang fleksibel</td><td data-col-size="sm" data-end="2241" data-start="2206" style="width: 28.6012%; height: 46.5938px;">Sangat cocok</td></tr></tbody></table>

</div></div>Bayangkan kamu ingin install aplikasi Laravel + MySQL:

- **Cara tradisional:** install PHP, Composer, MySQL, atur environment manual.  
    Bisa error kalau beda OS atau library tidak cocok.
- **Pakai Docker:** tinggal pakai `docker-compose.yml` dan semua langsung jalan — tidak perlu install PHP atau MySQL di laptop! `docker-compose up -d`

Semua jalan di container masing-masing.

---


#### **4. Cara Kerja Docker**

1. **Kita ambil image** dari Docker Hub (misalnya `nginx`)
2. **Docker menjalankan image jadi container**
3. Kita bisa **akses aplikasi** dari browser atau terminal

```
[ Docker Image ] --> [ Docker Container ] --> [ Aplikasi Jalan ]

```

---

#### **5. Instalasi Docker (Ubuntu/Linux)**

```bash
sudo apt update
sudo apt install docker.io -y
sudo systemctl enable docker
sudo systemctl start docker

```

---

#### **6. Perintah Dasar Docker**

<table id="bkmrk-perintah-fungsi-dock"><thead><tr><th>Perintah</th><th>Fungsi</th></tr></thead><tbody><tr><td>`docker --version`</td><td>Cek versi Docker</td></tr><tr><td>`docker run hello-world`</td><td>Jalankan contoh pertama</td></tr><tr><td>`docker ps`</td><td>Lihat container yang aktif</td></tr><tr><td>`docker images`</td><td>Lihat daftar image</td></tr><tr><td>`docker pull nginx`</td><td>Download image dari Docker Hub</td></tr><tr><td>`docker run -d -p 8080:80 nginx`</td><td>Jalankan nginx di port 8080</td></tr><tr><td>`docker stop <id>`</td><td>Hentikan container</td></tr><tr><td>`docker rm <id>`</td><td>Hapus container</td></tr><tr><td>`docker rmi <id>`</td><td>Hapus image</td></tr></tbody></table>

---

#### **7. Contoh Praktik: Web + Database dengan Docker Compose**

Buat file `docker-compose.yml`:

```yaml
version: '3'
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: rahasia

```

Jalankan:

```bash
docker-compose up -d

```

Akses `localhost:8080` di browser.

---

#### **8. Kesimpulan**

Docker adalah alat keren yang membantu kita menjalankan aplikasi dengan cara cepat, ringan, dan konsisten. Cocok untuk yang ingin masuk ke dunia DevOps, sistem administrator, dan cloud.

**Docker tidak hanya soal performa, tapi soal cara kerja modern yang membuat aplikasi lebih fleksibel, konsisten, dan mudah dipindah.**  
Dengan Docker, kamu tidak lagi "install aplikasi" — kamu **menjalankan aplikasi siap pakai**, lengkap dengan semua konfigurasinya.

---

#### **Sumber Belajar Lanjut**

- https://docker.com
- https://play-with-docker.com

# 2. Instal Docker

[![image.png](https://www.32inside.com/uploads/images/gallery/2026-04/scaled-1680-/N3Vimage.png)](https://www.32inside.com/uploads/images/gallery/2026-04/N3Vimage.png)


#### **Instal Docker dengan manual command Ubuntu 22.04 LTS**

##### 1. Remove docker package untuk memastikan tidak ada bekas instalasi lama supaya clean instal.

```bash
sudo apt-get remove docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc -y
```

##### 2. Update repository agar mendapatkan package terbaru

```bash
sudo apt-get update -y
```

##### 3. Tambahkan repository untuk docker

- Install dependensi awal 
    - ```bash
        sudo apt-get install ca-certificates curl -y
        ```
        
        **Fungsi**:
        
        
        - - Menginstal paket `ca-certificates` dan `curl`.
                
                
                - `ca-certificates`: Dibutuhkan agar sistem bisa memverifikasi sertifikat SSL (HTTPS) saat mengunduh dari internet.
                - `curl`: Digunakan untuk mengambil file dari internet (misalnya GPG key Docker).
            - `-y`: Otomatis menjawab "yes" untuk konfirmasi instalasi.
                
                
                - Menginstal paket `ca-certificates` dan `curl`.
                    
                    
                    - `ca-certificates`: Dibutuhkan agar sistem bisa memverifikasi sertifikat SSL (HTTPS) saat mengunduh dari internet.
                    - `curl`: Digunakan untuk mengambil file dari internet (misalnya GPG key Docker).
                - `-y`: Otomatis menjawab "yes" untuk konfirmasi instalasi.
        
        
        - Menginstal paket `ca-certificates` dan `curl`.
            
            
            - `ca-certificates`: Dibutuhkan agar sistem bisa memverifikasi sertifikat SSL (HTTPS) saat mengunduh dari internet.
            - `curl`: Digunakan untuk mengambil file dari internet (misalnya GPG key Docker).
        - `-y`: Otomatis menjawab "yes" untuk konfirmasi instalasi.
- Membuat direktori untuk menyimpan keyring Docker 
    - ```
        sudo install -m 0755 -d /etc/apt/keyrings
        ```
        
        
        - Membuat folder `/etc/apt/keyrings` dengan permission `0755` (rwxr-xr-x).
        - Folder ini digunakan untuk menyimpan **GPG key** Docker agar lebih aman dan terpisah dari keyring global APT.

- Mengunduh GPG key Docker 
    - ```bash
        sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
        ```
        
        
        - - Mengambil **GPG key Docker** dari situs resminya, lalu menyimpannya sebagai file `docker.asc` di `/etc/apt/keyrings`.
            - Opsi:
                
                
                - `-f`: Fail silently (jika gagal, tidak menampilkan output).
                - `-s`: Silent mode.
                - `-S`: Tampilkan error kalau gagal.
                - `-L`: Ikuti redirect.
            
            GPG key ini digunakan oleh `apt` untuk **memverifikasi keaslian paket Docker**.
- Mengatur hak akses file key agar bisa dibaca 
    - ```bash
        sudo chmod a+r /etc/apt/keyrings/docker.asc
        ```
        
        
        - Memberikan permission **read untuk semua user** terhadap file `docker.asc`.
        - Diperlukan agar APT bisa membaca GPG key saat mengakses repo Docker.
- Menambahkan repository Docker ke daftar APT 
    - ```
        sudo echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable"
        ```
        
        
        - Menampilkan (bukan menyimpan) baris repository Docker APT.
        - Formatnya:
            
            
            - ```bash
                deb [arch=arsitektur signed-by=lokasi-key] URL-docker DISTRO stable
                ```
            - Variabel:
                
                
                - `$(dpkg --print-architecture)`: Menyesuaikan arsitektur sistem (misalnya `amd64`, `arm64`, dll).
                - `$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")`: Mengambil nama kode Ubuntu seperti `jammy`, `focal`, dll.
- Membuat file repo Docker  
    
    - ```bash
        sudo vim /etc/apt/sources.list.d/docker.list
        ```
        
        
        - Membuka editor `vim` dengan hak akses root untuk membuat atau mengedit file `docker.list` yang akan berisi URL repository Docker.
        - File ini akan berisi **output dari langkah sebelumnya**, misalnya:
            
            
            - ```bash
                deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu jammy stable
                ```
- Update repository agar repository docker yang baru di buat terdaftar 
    - ```bash
        sudo apt-get update -y
        ```
        
        
        - Mengunduh ulang daftar paket dari semua repo yang terdaftar di sistem, termasuk repo Docker yang baru ditambahkan.
        - `-y` memastikan proses berjalan otomatis tanpa konfirmasi.

##### 4. Menginstal Docker

- ```
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
    ```
    
    
    - Menginstal komponen-komponen utama Docker:
        
        <div class="_tableContainer_80l1q_1"><div class="_tableWrapper_80l1q_14 group flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="1958" data-start="1547"><thead data-end="1565" data-start="1547"><tr data-end="1565" data-start="1547"><th data-col-size="sm" data-end="1555" data-start="1547">Paket</th><th data-col-size="md" data-end="1565" data-start="1555">Fungsi</th></tr></thead><tbody data-end="1958" data-start="1585"><tr data-end="1634" data-start="1585"><td data-col-size="sm" data-end="1599" data-start="1585">`docker-ce`</td><td data-col-size="md" data-end="1634" data-start="1599">Docker Engine Community Edition</td></tr><tr data-end="1692" data-start="1635"><td data-col-size="sm" data-end="1653" data-start="1635">`docker-ce-cli`</td><td data-col-size="md" data-end="1692" data-start="1653">Command Line Interface untuk Docker</td></tr><tr data-end="1774" data-start="1693"><td data-col-size="sm" data-end="1711" data-start="1693">`containerd.io`</td><td data-col-size="md" data-end="1774" data-start="1711">Runtime untuk menjalankan container (digunakan oleh Docker)</td></tr><tr data-end="1865" data-start="1775"><td data-col-size="sm" data-end="1800" data-start="1775">`docker-buildx-plugin`</td><td data-col-size="md" data-end="1865" data-start="1800">Plugin untuk `docker buildx` (mendukung build multi-platform)</td></tr><tr data-end="1958" data-start="1866"><td data-col-size="sm" data-end="1892" data-start="1866">`docker-compose-plugin`</td><td data-col-size="md" data-end="1958" data-start="1892">Plugin untuk menjalankan `docker compose` (v2, bukan yang pip)</td></tr></tbody></table>
        
        </div></div>Tunggu sampai instalasi selesai.

##### 5. Cek status instalasi docker

```
sudo systemctl status docker
sudo docker --version
sudo docker ps
```

##### 6. Kalau ingin Docker bisa dijalankan tanpa `sudo`, tambahkan user ke grup `docker`:

- ```bash
    sudo usermod -aG docker $USER
    ```

---

#### **Instal Docker dengan bash script di Ubuntu 22.04 LTS**

##### 1. Buat file instal-docker.sh

```bash
vim instal-docker.sh
```

Setelah masuk vim, tekan **i** untuk edit.

Isi script berikut :

```bash
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do apt-get remove $pkg; done
apt-get update
apt-get install ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update -y
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

```

##### 2. Save dengan klik **esc**, tekan titik dua **:** , kemudian **wq!**, enter.

```
:wq!
```

##### 3. Set permissions file **instal-docker.sh** supaya executable

```
chmod +x instal-docker.sh
```

##### 4. Jalankan bash script **instal-docker.sh**

```
sudo bash instal-docker.sh
```

Tunggu sampai proses instalasi selesai

##### 5. Cek status instalasi docker

```
sudo systemctl status docker
sudo docker --version
sudo docker ps
```

##### 6. Kalau ingin Docker bisa dijalankan tanpa `sudo`, tambahkan user ke grup `docker`:

- ```bash
    sudo usermod -aG docker $USER
    ```

# 3. Docker Command

[![image.png](https://www.32inside.com/uploads/images/gallery/2026-04/scaled-1680-/RiFimage.png)](https://www.32inside.com/uploads/images/gallery/2026-04/RiFimage.png)

#### **Perintah Docker Dasar + Use Case**

<div class="_tableContainer_80l1q_1" id="bkmrk-perintah-fungsi-utam"><div class="_tableWrapper_80l1q_14 group flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="1880" data-start="290"><thead data-end="354" data-start="290"><tr data-end="354" data-start="290"><th data-col-size="sm" data-end="301" data-start="290">Perintah</th><th data-col-size="sm" data-end="316" data-start="301">Fungsi Utama</th><th data-col-size="md" data-end="335" data-start="316">Penjelasan Mudah</th><th data-col-size="md" data-end="354" data-start="335">Contoh Use Case</th></tr></thead><tbody data-end="1880" data-start="421"><tr data-end="557" data-start="421"><td data-col-size="sm" data-end="436" data-start="421">`docker run`</td><td data-col-size="sm" data-end="460" data-start="436">Menjalankan container</td><td data-col-size="md" data-end="508" data-start="460">Seperti menyalakan mesin dari cetakan (image)</td><td data-col-size="md" data-end="557" data-start="508">Menjalankan web server seperti Nginx, Node.js</td></tr><tr data-end="705" data-start="558"><td data-col-size="sm" data-end="575" data-start="558">`docker ps -a`</td><td data-col-size="sm" data-end="601" data-start="575">Melihat semua container</td><td data-col-size="md" data-end="655" data-start="601">Menampilkan semua container, baik aktif maupun mati</td><td data-col-size="md" data-end="705" data-start="655">Cek container yang gagal jalan atau sudah stop</td></tr><tr data-end="851" data-start="706"><td data-col-size="sm" data-end="722" data-start="706">`docker exec`</td><td data-col-size="sm" data-end="749" data-start="722">Masuk ke dalam container</td><td data-col-size="md" data-end="811" data-start="749">Seperti masuk ke terminal dari komputer virtual (container)</td><td data-col-size="md" data-end="851" data-start="811">Debug aplikasi yang error dari dalam</td></tr><tr data-end="981" data-start="852"><td data-col-size="sm" data-end="868" data-start="852">`docker logs`</td><td data-col-size="sm" data-end="892" data-start="868">Melihat log container</td><td data-col-size="md" data-end="943" data-start="892">Melihat output/error yang terjadi dalam aplikasi</td><td data-col-size="md" data-end="981" data-start="943">Melihat kenapa web app gagal jalan</td></tr><tr data-end="1126" data-start="982"><td data-col-size="sm" data-end="999" data-start="982">`docker build`</td><td data-col-size="sm" data-end="1031" data-start="999">Membuat image dari Dockerfile</td><td data-col-size="md" data-end="1086" data-start="1031">Compile semua konfigurasi dan source code jadi image</td><td data-col-size="md" data-end="1126" data-start="1086">Build web app dari source code lokal</td></tr><tr data-end="1267" data-start="1127"><td data-col-size="sm" data-end="1160" data-start="1127">`docker images` / `docker rmi`</td><td data-col-size="sm" data-end="1184" data-start="1160">Melihat &amp; hapus image</td><td data-col-size="md" data-end="1239" data-start="1184">Lihat semua image lokal dan hapus yang tidak dipakai</td><td data-col-size="md" data-end="1267" data-start="1239">Bersih-bersih image lama</td></tr><tr data-end="1423" data-start="1268"><td data-col-size="sm" data-end="1298" data-start="1268">`docker stop` / `docker rm`</td><td data-col-size="sm" data-end="1329" data-start="1298">Hentikan dan hapus container</td><td data-col-size="md" data-end="1379" data-start="1329">Stop container yang sedang berjalan, lalu hapus</td><td data-col-size="md" data-end="1423" data-start="1379">Bersih-bersih container yang tidak aktif</td></tr><tr data-end="1567" data-start="1424"><td data-col-size="sm" data-end="1442" data-start="1424">`docker volume`</td><td data-col-size="sm" data-end="1472" data-start="1442">Kelola volume (penyimpanan)</td><td data-col-size="md" data-end="1525" data-start="1472">Simpan data yang tetap ada walau container dihapus</td><td data-col-size="md" data-end="1567" data-start="1525">Menyimpan data MySQL agar tidak hilang</td></tr><tr data-end="1713" data-start="1568"><td data-col-size="sm" data-end="1587" data-start="1568">`docker network`</td><td data-col-size="sm" data-end="1621" data-start="1587">Kelola jaringan antar container</td><td data-col-size="md" data-end="1664" data-start="1621">Hubungkan container seperti jaringan LAN</td><td data-col-size="md" data-end="1713" data-start="1664">Web app bisa akses database di container lain</td></tr><tr data-end="1880" data-start="1714"><td data-col-size="sm" data-end="1733" data-start="1714">`docker compose`</td><td data-col-size="sm" data-end="1773" data-start="1733">Jalankan beberapa container sekaligus</td><td data-col-size="md" data-end="1835" data-start="1773">Jalankan 1 set aplikasi (web + db + cache) dalam 1 perintah</td><td data-col-size="md" data-end="1880" data-start="1835">Deploy project: React + Node.js + MongoDB</td></tr></tbody></table>

</div></div>##### **1. Jalankan Nginx (web server)**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-docker-run--d---name"><div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary select-none rounded-t-2xl">  
</div><div class="overflow-y-auto p-4" dir="ltr">`docker run -d --name web-nginx -p 8080:80 nginx`</div></div>*Menjalankan Nginx dan membuka port 8080 di komputer lokal.*

---

##### **2. Lihat semua container (aktif dan tidak aktif)**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-docker-ps--a"><div class="overflow-y-auto p-4" dir="ltr">`docker ps -a`</div></div>*Untuk mengecek container mana yang berjalan atau sudah berhenti.*

---

##### **3. Masuk ke dalam container**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-docker-exec--it-web-"><div class="overflow-y-auto p-4" dir="ltr">`docker <span class="hljs-built_in">exec</span> -it web-nginx bash`</div></div>*Seperti buka terminal di dalam container Nginx.*

---

##### **4. Lihat log container (misalnya container Node.js)**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-docker-logs-web-node"><div class="overflow-y-auto p-4" dir="ltr">`docker logs web-node`</div></div>*Lihat error atau output dari aplikasi kita.*

---

##### **5. Build image dari Dockerfile**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-docker-build--t-myap"><div class="overflow-y-auto p-4" dir="ltr">`docker build -t myapp:v1 .`</div></div>*Bangun image bernama `myapp:v1` dari Dockerfile di folder saat ini.*

---

##### **6. Lihat dan hapus image**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-docker-images-docker"><div class="overflow-y-auto p-4" dir="ltr">`docker imagesdocker rmi myapp:v1`</div></div>*Cek semua image yang ada lalu hapus image yang tidak dipakai.*

---

##### **7. Stop dan hapus container**<button class="flex items-center gap-1 py-1 select-none"></button>

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-docker-stop-web-ngin"><div class="overflow-y-auto p-4" dir="ltr">`docker stop web-nginxdocker <span class="hljs-built_in">rm</span> web-nginx`</div></div>*Matikan dan hapus container Nginx.*

---

##### **8. Gunakan volume untuk database**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-docker-volume-create"><div class="overflow-y-auto p-4" dir="ltr">`docker volume create dbdatadocker run -d --name mysql-db -e MYSQL_ROOT_PASSWORD=admin -v dbdata:/var/lib/mysql mysql`</div></div>*Volume `dbdata` menyimpan data MySQL agar tidak hilang walau container dihapus.*

---

##### **9. Buat jaringan khusus**<button class="flex items-center gap-1 py-1 select-none"></button>

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-docker-network-creat"><div class="overflow-y-auto p-4" dir="ltr">`docker network create webnet`</div></div>*Container yang dibuat di jaringan ini bisa saling komunikasi seperti dalam LAN.*

---

##### **10. Jalankan semua service dengan `docker-compose`**

*Isi file `docker-compose.yml`:*

```yaml
version: '3'
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: admin

```

Jalankan:

`docker-compose up -d `

*Menjalankan Nginx dan MySQL sekaligus dengan satu perintah.*

#### **Perintah Maintenance Docker**

<div class="_tableContainer_80l1q_1" id="bkmrk-perintah-fungsi-penj"><div class="_tableWrapper_80l1q_14 group flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="4609" data-start="3780"><thead data-end="3820" data-start="3780"><tr data-end="3820" data-start="3780"><th data-col-size="md" data-end="3791" data-start="3780">Perintah</th><th data-col-size="md" data-end="3800" data-start="3791">Fungsi</th><th data-col-size="md" data-end="3820" data-start="3800">Penjelasan Mudah</th></tr></thead><tbody data-end="4609" data-start="3862"><tr data-end="3954" data-start="3862"><td data-col-size="md" data-end="3883" data-start="3862">`docker system df`</td><td data-col-size="md" data-end="3909" data-start="3883">Lihat pemakaian storage</td><td data-col-size="md" data-end="3954" data-start="3909">Seperti `df` di Linux, tapi khusus Docker</td></tr><tr data-end="4063" data-start="3955"><td data-col-size="md" data-end="3982" data-start="3955">`docker system prune -a`</td><td data-col-size="md" data-end="4040" data-start="3982">Hapus semua yang tidak dipakai (container/image/volume)</td><td data-col-size="md" data-end="4063" data-start="4040">Bersih-bersih total</td></tr><tr data-end="4192" data-start="4064"><td data-col-size="md" data-end="4114" data-start="4064">`docker image prune` / `docker container prune`</td><td data-col-size="md" data-end="4153" data-start="4114">Hapus image/container tidak terpakai</td><td data-col-size="md" data-end="4192" data-start="4153">Pilih bersih-bersih bagian tertentu</td></tr><tr data-end="4313" data-start="4193"><td data-col-size="md" data-end="4212" data-start="4193">`docker inspect`</td><td data-col-size="md" data-end="4255" data-start="4212">Lihat detail konfigurasi container/image</td><td data-col-size="md" data-end="4313" data-start="4255">Untuk troubleshooting atau melihat pengaturan dalamnya</td></tr><tr data-end="4406" data-start="4314"><td data-col-size="md" data-end="4331" data-start="4314">`docker stats`</td><td data-col-size="md" data-end="4372" data-start="4331">Lihat penggunaan CPU/RAM per container</td><td data-col-size="md" data-end="4406" data-start="4372">Pantau resource tiap container</td></tr><tr data-end="4494" data-start="4407"><td data-col-size="md" data-end="4421" data-start="4407">`docker cp`</td><td data-col-size="md" data-end="4451" data-start="4421">Copy file ke/dari container</td><td data-col-size="md" data-end="4494" data-start="4451">Untuk backup log, atau copy konfigurasi</td></tr><tr data-end="4609" data-start="4495"><td data-col-size="md" data-end="4522" data-start="4495">`docker login/push/pull`</td><td data-col-size="md" data-end="4546" data-start="4522">Akses Docker registry</td><td data-col-size="md" data-end="4609" data-start="4546">Upload/download image ke registry (Docker Hub, GitLab, dsb)</td></tr></tbody></table>

<button aria-label="Copy Table" class="hover:bg-token-bg-tertiary text-token-text-secondary my-1 rounded-sm p-1 transition-opacity group-[:not(:hover):not(:focus-within)]:pointer-events-none group-[:not(:hover):not(:focus-within)]:opacity-0"></button></div></div>---

#### **Contoh Maintenance**

##### **1. Lihat disk usage Docker**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-docker-system-df"><div class="overflow-y-auto p-4" dir="ltr">`docker system <span class="hljs-built_in">df</span>`</div></div>##### **2. Hapus semua yang tidak digunakan**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-docker-system-prune-"><div class="overflow-y-auto p-4" dir="ltr">`docker system prune -a`</div></div>##### **3. Copy file dari container ke host**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-docker-cp-web-nginx%3A"><div class="overflow-y-auto p-4" dir="ltr">`docker <span class="hljs-built_in">cp</span> web-nginx:/etc/nginx/nginx.conf ./nginx.conf`</div></div>##### **4. Lihat penggunaan CPU/RAM container**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-docker-stats"><div class="overflow-y-auto p-4" dir="ltr">`docker stats`</div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>---

#### 🐳 **Docker Cheatsheet**

##### **Perintah Dasar Docker**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-perintah-fungsi-cont"><div class="overflow-y-auto p-4" dir="ltr"><div class="_tableContainer_80l1q_1"><div class="_tableWrapper_80l1q_14 group flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="944" data-start="208"><thead data-end="238" data-start="208"><tr data-end="238" data-start="208"><th data-col-size="sm" data-end="219" data-start="208">Perintah</th><th data-col-size="sm" data-end="228" data-start="219">Fungsi</th><th data-col-size="sm" data-end="238" data-start="228">Contoh</th></tr></thead><tbody data-end="944" data-start="269"><tr data-end="341" data-start="269"><td data-col-size="sm" data-end="284" data-start="269">`docker run`</td><td data-col-size="sm" data-end="305" data-start="284">Jalankan container</td><td data-col-size="sm" data-end="341" data-start="305">`docker run -d -p 8080:80 nginx`</td></tr><tr data-end="395" data-start="342"><td data-col-size="sm" data-end="356" data-start="342">`docker ps`</td><td data-col-size="sm" data-end="380" data-start="356">Lihat container aktif</td><td data-col-size="sm" data-end="395" data-start="380">`docker ps`</td></tr><tr data-end="455" data-start="396"><td data-col-size="sm" data-end="413" data-start="396">`docker ps -a`</td><td data-col-size="sm" data-end="437" data-start="413">Lihat semua container</td><td data-col-size="sm" data-end="455" data-start="437">`docker ps -a`</td></tr><tr data-end="540" data-start="456"><td data-col-size="sm" data-end="472" data-start="456">`docker exec`</td><td data-col-size="sm" data-end="499" data-start="472">Masuk ke dalam container</td><td data-col-size="sm" data-end="540" data-start="499">`docker exec -it nama_container bash`</td></tr><tr data-end="611" data-start="541"><td data-col-size="sm" data-end="557" data-start="541">`docker logs`</td><td data-col-size="sm" data-end="579" data-start="557">Lihat log container</td><td data-col-size="sm" data-end="611" data-start="579">`docker logs nama_container`</td></tr><tr data-end="681" data-start="612"><td data-col-size="sm" data-end="628" data-start="612">`docker stop`</td><td data-col-size="sm" data-end="649" data-start="628">Hentikan container</td><td data-col-size="sm" data-end="681" data-start="649">`docker stop nama_container`</td></tr><tr data-end="744" data-start="682"><td data-col-size="sm" data-end="696" data-start="682">`docker rm`</td><td data-col-size="sm" data-end="714" data-start="696">Hapus container</td><td data-col-size="sm" data-end="744" data-start="714">`docker rm nama_container`</td></tr><tr data-end="802" data-start="745"><td data-col-size="sm" data-end="763" data-start="745">`docker images`</td><td data-col-size="sm" data-end="783" data-start="763">Lihat semua image</td><td data-col-size="sm" data-end="802" data-start="783">`docker images`</td></tr><tr data-end="859" data-start="803"><td data-col-size="sm" data-end="818" data-start="803">`docker rmi`</td><td data-col-size="sm" data-end="832" data-start="818">Hapus image</td><td data-col-size="sm" data-end="859" data-start="832">`docker rmi nama_image`</td></tr><tr data-end="944" data-start="860"><td data-col-size="sm" data-end="877" data-start="860">`docker build`</td><td data-col-size="sm" data-end="907" data-start="877">Build image dari Dockerfile</td><td data-col-size="sm" data-end="944" data-start="907">`docker build -t nama_image:v1 .`</td></tr></tbody></table>

</div></div>---

</div></div>##### **Volume &amp; Data Persistence**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-perintah-fungsi-cont-1"><div class="overflow-y-auto p-4" dir="ltr"><div class="_tableContainer_80l1q_1"><div class="_tableWrapper_80l1q_14 group flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="1346" data-start="984"><thead data-end="1014" data-start="984"><tr data-end="1014" data-start="984"><th data-col-size="sm" data-end="995" data-start="984">Perintah</th><th data-col-size="sm" data-end="1004" data-start="995">Fungsi</th><th data-col-size="sm" data-end="1014" data-start="1004">Contoh</th></tr></thead><tbody data-end="1346" data-start="1045"><tr data-end="1123" data-start="1045"><td data-col-size="sm" data-end="1070" data-start="1045">`docker volume create`</td><td data-col-size="sm" data-end="1089" data-start="1070">Buat volume baru</td><td data-col-size="sm" data-end="1123" data-start="1089">`docker volume create dataweb`</td></tr><tr data-end="1210" data-start="1124"><td data-col-size="sm" data-end="1144" data-start="1124">`-v volume:/path`</td><td data-col-size="sm" data-end="1172" data-start="1144">Mount volume ke container</td><td data-col-size="sm" data-end="1210" data-start="1172">`-v dataweb:/usr/share/nginx/html`</td></tr><tr data-end="1275" data-start="1211"><td data-col-size="sm" data-end="1232" data-start="1211">`docker volume ls`</td><td data-col-size="sm" data-end="1253" data-start="1232">Lihat semua volume</td><td data-col-size="sm" data-end="1275" data-start="1253">`docker volume ls`</td></tr><tr data-end="1346" data-start="1276"><td data-col-size="sm" data-end="1297" data-start="1276">`docker volume rm`</td><td data-col-size="sm" data-end="1312" data-start="1297">Hapus volume</td><td data-col-size="sm" data-end="1346" data-start="1312">`docker volume rm nama_volume`</td></tr></tbody></table>

</div></div>---

</div></div>##### **Network antar Container**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-perintah-fungsi-cont-2"><div class="overflow-y-auto p-4" dir="ltr"><div class="_tableContainer_80l1q_1"><div class="_tableWrapper_80l1q_14 group flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="1768" data-start="1384"><thead data-end="1414" data-start="1384"><tr data-end="1414" data-start="1384"><th data-col-size="sm" data-end="1395" data-start="1384">Perintah</th><th data-col-size="sm" data-end="1404" data-start="1395">Fungsi</th><th data-col-size="sm" data-end="1414" data-start="1404">Contoh</th></tr></thead><tbody data-end="1768" data-start="1445"><tr data-end="1524" data-start="1445"><td data-col-size="sm" data-end="1471" data-start="1445">`docker network create`</td><td data-col-size="sm" data-end="1491" data-start="1471">Buat network baru</td><td data-col-size="sm" data-end="1524" data-start="1491">`docker network create mynet`</td></tr><tr data-end="1614" data-start="1525"><td data-col-size="sm" data-end="1545" data-start="1525">`--network mynet`</td><td data-col-size="sm" data-end="1578" data-start="1545">Hubungkan container ke network</td><td data-col-size="sm" data-end="1614" data-start="1578">`docker run --network mynet ...`</td></tr><tr data-end="1683" data-start="1615"><td data-col-size="sm" data-end="1637" data-start="1615">`docker network ls`</td><td data-col-size="sm" data-end="1660" data-start="1637">Lihat daftar network</td><td data-col-size="sm" data-end="1683" data-start="1660">`docker network ls`</td></tr><tr data-end="1768" data-start="1684"><td data-col-size="sm" data-end="1711" data-start="1684">`docker network inspect`</td><td data-col-size="sm" data-end="1734" data-start="1711">Lihat detail network</td><td data-col-size="sm" data-end="1768" data-start="1734">`docker network inspect mynet`</td></tr></tbody></table>

</div></div>---

</div></div>##### **Docker Compose**

**File `docker-compose.yml`:**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--13"><div class="overflow-y-auto p-4" dir="ltr"><div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">  
</div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div></div></div>```yaml
version: '3'
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: admin

```

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-perintah-fungsi-dock"><div class="overflow-y-auto p-4" dir="ltr"><div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><div class="overflow-y-auto p-4" dir="ltr">  
</div></div><div class="_tableContainer_80l1q_1"><div class="_tableWrapper_80l1q_14 group flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="2196" data-start="1990"><thead data-end="2011" data-start="1990"><tr data-end="2011" data-start="1990"><th data-col-size="sm" data-end="2001" data-start="1990">Perintah</th><th data-col-size="sm" data-end="2011" data-start="2001">Fungsi</th></tr></thead><tbody data-end="2196" data-start="2033"><tr data-end="2084" data-start="2033"><td data-col-size="sm" data-end="2058" data-start="2033">`docker-compose up -d`</td><td data-col-size="sm" data-end="2084" data-start="2058">Jalankan semua service</td></tr><tr data-end="2147" data-start="2085"><td data-col-size="sm" data-end="2109" data-start="2085">`docker-compose down`</td><td data-col-size="sm" data-end="2147" data-start="2109">Hentikan dan hapus semua container</td></tr><tr data-end="2196" data-start="2148"><td data-col-size="sm" data-end="2170" data-start="2148">`docker-compose ps`</td><td data-col-size="sm" data-end="2196" data-start="2170">Lihat status container</td></tr></tbody></table>

</div></div>---

</div></div>##### **Maintenance &amp; Cleanup**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-perintah-fungsi-dock-1"><div class="overflow-y-auto p-4" dir="ltr"><div class="_tableContainer_80l1q_1"><div class="_tableWrapper_80l1q_14 group flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="2705" data-start="2232"><thead data-end="2253" data-start="2232"><tr data-end="2253" data-start="2232"><th data-col-size="sm" data-end="2243" data-start="2232">Perintah</th><th data-col-size="sm" data-end="2253" data-start="2243">Fungsi</th></tr></thead><tbody data-end="2705" data-start="2275"><tr data-end="2322" data-start="2275"><td data-col-size="sm" data-end="2296" data-start="2275">`docker system df`</td><td data-col-size="sm" data-end="2322" data-start="2296">Cek penggunaan storage</td></tr><tr data-end="2388" data-start="2323"><td data-col-size="sm" data-end="2350" data-start="2323">`docker system prune -a`</td><td data-col-size="sm" data-end="2388" data-start="2350">Bersihkan semua yang tidak dipakai</td></tr><tr data-end="2444" data-start="2389"><td data-col-size="sm" data-end="2412" data-start="2389">`docker image prune`</td><td data-col-size="sm" data-end="2444" data-start="2412">Bersihkan image tak terpakai</td></tr><tr data-end="2500" data-start="2445"><td data-col-size="sm" data-end="2472" data-start="2445">`docker container prune`</td><td data-col-size="sm" data-end="2500" data-start="2472">Bersihkan container mati</td></tr><tr data-end="2558" data-start="2501"><td data-col-size="sm" data-end="2525" data-start="2501">`docker volume prune`</td><td data-col-size="sm" data-end="2558" data-start="2525">Bersihkan volume tak terpakai</td></tr><tr data-end="2605" data-start="2559"><td data-col-size="sm" data-end="2576" data-start="2559">`docker stats`</td><td data-col-size="sm" data-end="2605" data-start="2576">Lihat pemakaian CPU &amp; RAM</td></tr><tr data-end="2659" data-start="2606"><td data-col-size="sm" data-end="2625" data-start="2606">`docker inspect`</td><td data-col-size="sm" data-end="2659" data-start="2625">Lihat metadata container/image</td></tr><tr data-end="2705" data-start="2660"><td data-col-size="sm" data-end="2674" data-start="2660">`docker cp`</td><td data-col-size="sm" data-end="2705" data-start="2674">Copy file ke/dari container</td></tr></tbody></table>

</div></div>---

</div></div>##### **Interaksi dengan Docker Registry**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-perintah-fungsi-cont-3"><div class="overflow-y-auto p-4" dir="ltr"><div class="_tableContainer_80l1q_1"><div class="_tableWrapper_80l1q_14 group flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="2992" data-start="2752"><thead data-end="2782" data-start="2752"><tr data-end="2782" data-start="2752"><th data-col-size="sm" data-end="2763" data-start="2752">Perintah</th><th data-col-size="sm" data-end="2772" data-start="2763">Fungsi</th><th data-col-size="sm" data-end="2782" data-start="2772">Contoh</th></tr></thead><tbody data-end="2992" data-start="2813"><tr data-end="2870" data-start="2813"><td data-col-size="sm" data-end="2830" data-start="2813">`docker login`</td><td data-col-size="sm" data-end="2852" data-start="2830">Login ke Docker Hub</td><td data-col-size="sm" data-end="2870" data-start="2852">`docker login`</td></tr><tr data-end="2927" data-start="2871"><td data-col-size="sm" data-end="2887" data-start="2871">`docker pull`</td><td data-col-size="sm" data-end="2904" data-start="2887">Download image</td><td data-col-size="sm" data-end="2927" data-start="2904">`docker pull nginx`</td></tr><tr data-end="2992" data-start="2928"><td data-col-size="sm" data-end="2944" data-start="2928">`docker push`</td><td data-col-size="sm" data-end="2959" data-start="2944">Upload image</td><td data-col-size="sm" data-end="2992" data-start="2959">`docker push user/nama_image`</td></tr></tbody></table>

</div></div>---

</div></div>##### **Shortcut Paling Penting**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-tujuan-perintah-jala"><div class="overflow-y-auto p-4" dir="ltr"><div class="_tableContainer_80l1q_1"><div class="_tableWrapper_80l1q_14 group flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="3321" data-start="3030"><thead data-end="3051" data-start="3030"><tr data-end="3051" data-start="3030"><th data-col-size="md" data-end="3039" data-start="3030">Tujuan</th><th data-col-size="sm" data-end="3051" data-start="3039">Perintah</th></tr></thead><tbody data-end="3321" data-start="3074"><tr data-end="3132" data-start="3074"><td data-col-size="md" data-end="3096" data-start="3074">Jalankan web server</td><td data-col-size="sm" data-end="3132" data-start="3096">`docker run -d -p 8080:80 nginx`</td></tr><tr data-end="3204" data-start="3133"><td data-col-size="md" data-end="3163" data-start="3133">Masuk ke terminal container</td><td data-col-size="sm" data-end="3204" data-start="3163">`docker exec -it nama_container bash`</td></tr><tr data-end="3247" data-start="3205"><td data-col-size="md" data-end="3229" data-start="3205">Lihat semua container</td><td data-col-size="sm" data-end="3247" data-start="3229">`docker ps -a`</td></tr><tr data-end="3321" data-start="3248"><td data-col-size="md" data-end="3293" data-start="3248">Hapus semua container &amp; image tak terpakai</td><td data-col-size="sm" data-end="3321" data-start="3293">`docker system prune -a`</td></tr></tbody></table>

</div></div></div></div>

# 4. Membuat Aplikasi CRUD Sederhana dengan Docker

### **CRUD Web + Database Full Docker**

[![image.png](https://www.32inside.com/uploads/images/gallery/2026-04/scaled-1680-/2BKimage.png)](https://www.32inside.com/uploads/images/gallery/2026-04/2BKimage.png)


Docker adalah platform containerization yang memungkinkan kamu membungkus aplikasi beserta dependensinya dalam satu wadah (container). Hal ini mempermudah proses deployment, testing, dan distribusi aplikasi tanpa khawatir perbedaan sistem operasi, package, atau versi runtime.

Tutorial ini cocok untuk:

- Pemula yang ingin belajar perintah dasar Docker
- DevOps / backend developer yang ingin praktik langsung
- Siapa pun yang mau membuat **aplikasi CRUD web + database** secara full menggunakan Docker

---

#### **Persiapan Awal**

##### Syarat:

- Sudah terinstall **Docker** dan **Docker Compose**
- OS: Ubuntu 22.04 LTS
- Editor: bebas (vim, vi, nano, Visual Studio Code, notepad)

Untuk memastikan Docker sudah terinstall:

```
docker -v
docker compose version
```

Jika belum, kunjungi: [https://www.32inside.com/books/docker/page/instal-docker](https://www.32inside.com/books/docker/page/2-instal-docker)

Selanjutnya, kita akan membuat aplikasi web CRUD yang terdiri dari:

- Backend API (Node.js + Express)
- Database (PostgreSQL)
- Frontend GUI sederhana (HTML)
- Semua dijalankan melalui Docker Compose
- Data disimpan secara persisten (volume Docker)

##### **Struktur Folder**

```
crud-app/
├── backend
│   ├── Dockerfile
│   ├── index.js
│   ├── package.json
│   └── public
│       └── index.html
└── docker-compose.yml
```

##### 1. Buat Struktur Direktori Proyek

```bash
mkdir -p crud-app/backend/public
cd crud-app
```

##### 2. Buat File `docker-compose.yml`

```yaml
version: "3.9"

services:
  web:
    build: ./backend
    ports:
      - "3000:3000"
    depends_on:
      - db
    volumes:
      - web-data:/app
    restart: unless-stopped

  db:
    image: postgres:15
    environment:
      POSTGRES_DB: cruddb
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    volumes:
      - pgdata:/var/lib/postgresql/data
    restart: unless-stopped

volumes:
  pgdata:
  web-data:
```

##### 3. File `package.json` untuk Backend

```bash
cd backend
vim package.json
```

```json
{
  "name": "crud-app",
  "version": "1.0.0",
  "main": "index.js",
  "dependencies": {
    "express": "^4.18.2",
    "pg": "^8.11.0",
    "body-parser": "^1.20.2"
  }
}
```

##### 4. File `index.js` (Backend Logic)

```bash
vim index.js
```

```javascript
const express = require('express');
const bodyParser = require('body-parser');
const { Pool } = require('pg');
const path = require('path');

const app = express();
const port = 3000;

const pool = new Pool({
  user: 'postgres',
  host: 'db',
  database: 'cruddb',
  password: 'postgres',
  port: 5432,
});

app.use(bodyParser.json());
app.use(express.static(path.join(__dirname, 'public')));

pool.query(`
  CREATE TABLE IF NOT EXISTS items (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL
  )
`);

app.get('/items', async (req, res) => {
  const result = await pool.query('SELECT * FROM items');
  res.json(result.rows);
});

app.post('/items', async (req, res) => {
  const { name } = req.body;
  const result = await pool.query('INSERT INTO items(name) VALUES($1) RETURNING *', [name]);
  res.json(result.rows[0]);
});

app.put('/items/:id', async (req, res) => {
  const { id } = req.params;
  const { name } = req.body;
  await pool.query('UPDATE items SET name = $1 WHERE id = $2', [name, id]);
  res.sendStatus(200);
});

app.delete('/items/:id', async (req, res) => {
  const { id } = req.params;
  await pool.query('DELETE FROM items WHERE id = $1', [id]);
  res.sendStatus(200);
});

app.listen(port, () => {
  console.log(`Server running on http://localhost:${port}`);
});
```

##### 5. File `Dockerfile` (Build Backend)

```bash
vim Dockerfile
```

```
FROM node:18

WORKDIR /app
COPY package.json .
RUN npm install
COPY . .

EXPOSE 3000
CMD ["node", "index.js"]
```

##### 6. File `index.html` (Frontend GUI)

```bash
cd public
vim index.html
```

```html

<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>CRUD Docker App</title>
  <style>
    body { font-family: sans-serif; margin: 2rem; }
    input, button { margin: 0.5rem; padding: 0.5rem; }
    table { border-collapse: collapse; margin-top: 1rem; width: 100%; }
    td, th { border: 1px solid #ccc; padding: 0.5rem; text-align: left; }
    tr:nth-child(even) { background-color: #f9f9f9; }
  </style>
</head>
<body>

<h1>CRUD Docker App (Express + PostgreSQL)</h1>

<input type="text" id="newItemName" placeholder="Item Name">
<button onclick="addItem()">Add Item</button>

<table>
  <thead>
    <tr>
      <th>ID</th><th>Name</th><th>Action</th>
    </tr>
  </thead>
  <tbody id="itemsTable"></tbody>
</table>

<script>
const apiBase = "/items";

async function fetchItems() {
  const res = await fetch(apiBase);
  const items = await res.json();
  const table = document.getElementById("itemsTable");
  table.innerHTML = "";
  items.forEach(item => {
    const row = document.createElement("tr");
    row.innerHTML = `
      <td>${item.id}</td>
      <td contenteditable onblur="updateItem(${item.id}, this.innerText)">${item.name}</td>
      <td><button onclick="deleteItem(${item.id})">Delete</button></td>
    `;
    table.appendChild(row);
  });
}

async function addItem() {
  const name = document.getElementById("newItemName").value;
  if (!name) return alert("Please enter a name.");
  await fetch(apiBase, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ name })
  });
  document.getElementById("newItemName").value = "";
  fetchItems();
}

async function updateItem(id, name) {
  await fetch(`${apiBase}/${id}`, {
    method: "PUT",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ name })
  });
}

async function deleteItem(id) {
  await fetch(`${apiBase}/${id}`, { method: "DELETE" });
  fetchItems();
}

fetchItems();
</script>

</body>
</html>
```

##### 7. Menjalankan Aplikasi

Setelah semua file selesai dibuat dan diisi, kembali ke root folder:

```bash
cd ../../
```

##### 8. Build dan jalankan seluruh stack:

```bash
docker compose up --build -d
```

Buka di browser:<button class="flex items-center gap-1 py-1 select-none"></button>

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-http%3A%2F%2F%3Cipaddress%3E%3A3"><div class="overflow-y-auto p-4" dir="ltr">`http:<span class="hljs-comment">//<IPADDRESS>:3000</span>`</div></div>[![image.png](https://www.32inside.com/uploads/images/gallery/2026-04/scaled-1680-/DKEimage.png)](https://www.32inside.com/uploads/images/gallery/2026-04/DKEimage.png)

</body></html>