> ## Documentation Index
> Fetch the complete documentation index at: https://docs.skanesgalab.my.id/llms.txt
> Use this file to discover all available pages before exploring further.

# Dasar-Dasar Docker

> Panduan lengkap perintah esensial Docker: images, build, pull, push, run, start, stop, rm, rmi, logs, volume, network, hingga compose.

## Komponen Utama Docker

Sebelum menjalankan perintah Docker, pahami 5 pilar inti berikut:

1. **Image:** Cetak biru (*blueprint*) *read-only* yang memuat sistem operasi minimal, runtime, pustaka, dan kode aplikasi.
2. **Container:** Instans atau wujud nyata dari Image yang sedang berjalan terisolasi.
3. **Volume:** Tempat penyimpanan data persisten di luar siklus hidup Container agar data tidak hilang saat Container dihapus.
4. **Network:** Lapisan virtual yang mengatur komunikasi antar-Container maupun akses keluar/masuk ke jaringan host.
5. **Docker Compose:** Alat bantu berbasis berkas YAML untuk mengorkestrasi aplikasi multi-container secara terpadu.

***

## Manajemen Docker Image

Image adalah bahan baku untuk membuat container.

### 1. `docker pull` (Mengunduh Image)

Mengunduh image dari registry (default: Docker Hub) ke mesin lokal.

```bash theme={null}
# Mengunduh image nginx versi terbaru
docker pull nginx:latest

# Mengunduh image dengan tag versi tertentu
docker pull ubuntu:22.04
```

### 2. `docker images` (Melihat Daftar Image)

Menampilkan semua image yang tersimpan di penyimpanan lokal komputermu.

```bash theme={null}
docker images
# atau sintaks baru:
docker image ls
```

### 3. `docker build` (Membuat Image dari Dockerfile)

Membangun image kustom dari instruksi berkas `Dockerfile`.

```bash theme={null}
# Membangun image dan memberi nama tag (-t) di direktori saat ini (.)
docker build -t web-app:v1.0 .

# Membangun image tanpa memakai cache
docker build --no-cache -t web-app:v1.0 .
```

### 4. `docker push` (Mengunggah Image)

Mengunggah image buatanmu ke Docker Hub atau container registry privat.

```bash theme={null}
# Login terlebih dahulu ke Docker Hub
docker login

# Beri tag image sesuai username Docker Hub
docker tag web-app:v1.0 usernamekamu/web-app:v1.0

# Unggah image ke registry
docker push usernamekamu/web-app:v1.0
```

### 5. `docker rmi` (Menghapus Image)

Menghapus satu atau beberapa image dari penyimpanan lokal.

```bash theme={null}
# Menghapus image berdasarkan nama/ID
docker rmi nginx:latest

# Menghapus image secara paksa (jika ada container turunan yang sudah berhenti)
docker rmi -f <image_id>
```

***

## Siklus Hidup Container

Container dibuat, dijalankan, dihentikan, dan dihapus menggunakan perintah siklus hidup berikut:

### 1. `docker run` (Membuat & Menjalankan Container Baru)

Perintah utama untuk mengeksekusi container dari sebuah image.

```bash theme={null}
# Menjalankan container di background (-d), mapping port (-p host:container), dan memberi nama (--name)
docker run -d --name web-server -p 8080:80 nginx:latest

# Menjalankan container secara interaktif dengan terminal (-it)
docker run -it --name ubuntu-test ubuntu:22.04 /bin/bash

# Menjalankan container yang otomatis dihapus setelah selesai (--rm)
docker run --rm alpine ping -c 4 google.com
```

### 2. `docker ps` (Melihat Container Aktif)

```bash theme={null}
# Menampilkan container yang sedang berjalan saja
docker ps

# Menampilkan SEMUA container (termasuk yang exited/mati)
docker ps -a
```

### 3. `docker stop` (Menghentikan Container)

Mengirimkan sinyal `SIGTERM` secara halus agar container menyimpan prosesnya sebelum berhenti.

```bash theme={null}
docker stop web-server
# Menghentikan banyak container sekaligus
docker stop container_1 container_2
```

### 4. `docker start` (Menyalakan Kembali Container)

Menyalakan container yang sebelumnya berada dalam kondisi berhenti (*Exited*).

```bash theme={null}
docker start web-server
```

### 5. `docker restart` (Memuat Ulang Container)

Mematikan lalu menyalakan kembali container.

```bash theme={null}
docker restart web-server
```

### 6. `docker rm` (Menghapus Container)

Menghapus container dari daftar (container harus dalam status berhenti terlebih dahulu).

```bash theme={null}
# Menghapus container
docker rm web-server

# Menghapus container yang masih berjalan secara paksa (-f)
docker rm -f web-server

# Menghapus semua container yang berstatus 'exited'
docker container prune -f
```

***

## Pemantauan & Diagnostik (`docker logs`)

Melihat catatan keluaran (*standard output/error*) dari aplikasi di dalam container untuk keperluan debugging:

```bash theme={null}
# Menampilkan seluruh riwayat log
docker logs web-server

# Menampilkan log dan terus memantau secara real-time (-f)
docker logs -f web-server

# Menampilkan 50 baris log terakhir disertai timestamp (-t)
docker logs --tail 50 -f -t web-server
```

***

## Manajemen Penyimpanan (`docker volume`)

Volume digunakan agar data (seperti file database MySQL/Postgres) tetap aman meskipun container dihapus atau diperbarui.

```bash theme={null}
# 1. Membuat volume baru
docker volume create db_data

# 2. Melihat daftar volume yang ada
docker volume ls

# 3. Menginspeksi lokasi path fisik volume di host
docker volume inspect db_data

# 4. Menghubungkan volume ke container (-v nama_volume:path_di_container)
docker run -d --name db-mysql -v db_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=rahasia mysql:8.0

# 5. Menghapus volume (volume tidak boleh sedang terikat ke container aktif)
docker volume rm db_data

# 6. Menghapus semua volume tak terpakai (dangling)
docker volume prune -f
```

***

## Manajemen Jaringan (`docker network`)

Mengatur bagaimana container saling berbicara satu sama lain melalui DNS internal Docker.

```bash theme={null}
# 1. Membuat network custom bertipe bridge
docker network create my-custom-net

# 2. Melihat daftar network
docker network ls

# 3. Menjalankan container di dalam network tersebut
docker run -d --name backend --network my-custom-net app-backend:v1
docker run -d --name db --network my-custom-net mysql:8.0

# Keterangan: Container 'backend' kini bisa langsung mengakses database
# menggunakan hostname 'db' tanpa perlu repot mencatat IP address container!

# 4. Menghubungkan container yang sedang berjalan ke network lain
docker network connect my-custom-net web-server

# 5. Memutuskan container dari network
docker network disconnect my-custom-net web-server

# 6. Menghapus network
docker network rm my-custom-net
```

***

## Docker Compose (`docker compose`)

Docker Compose memudahkan pengelolaan multi-container (misal Web + API + Database) dalam satu berkas konfigurasi `docker-compose.yml`.

Contoh file `docker-compose.yml`:

```yaml theme={null}
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    depends_on:
      - api

  api:
    image: node:18-alpine
    command: npm start
    volumes:
      - ./app:/app
    environment:
      - DB_HOST=db

  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: password123
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:
```

### Perintah Utama Docker Compose

```bash theme={null}
# Menyalakan seluruh service di background (-d)
docker compose up -d

# Membangun ulang image sebelum menjalankan service
docker compose up -d --build

# Melihat status container dalam compose project
docker compose ps

# Melihat agregasi logs dari seluruh service
docker compose logs -f

# Menghentikan dan menghapus container, network yang dibuat compose
docker compose down

# Menghentikan serta menghapus volume data sekaligus (-v)
docker compose down -v
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.