Docker Architecture: Image, Container, Network, dan Volume
Memahami komponen Docker, siklus hidup container, jaringan, volume, registry, serta perintah dasar yang wajib dikuasai.
Docker mengemas aplikasi beserta dependensinya ke dalam container yang ringan dan konsisten. Modul ini membahas arsitektur Docker dan komponen utamanya sebelum Anda menulis Dockerfile.
Container vs VM
| Aspek | Container | VM |
|---|---|---|
| Kernel | Berbagi kernel host | Kernel sendiri |
| Ukuran | Puluhan–ratusan MB | GB |
| Boot | Detik | Puluhan detik |
| Isolasi | Process-level (namespace, cgroup) | Hardware-level |
| Kepadatan | Tinggi | Lebih rendah |
Container bukan VM kecil
Container adalah proses yang diisolasi, bukan sistem operasi lengkap. Karena berbagi kernel, container lebih ringan tetapi isolasi keamanannya berbeda dari VM.
Arsitektur Docker
docker CLI ──API──▶ dockerd (daemon) ──▶ containerd ──▶ runc
│ │
│ ├── Images
│ ├── Containers
│ ├── Networks
│ └── Volumes
▼
Docker Registry (Docker Hub, GHCR, private)| Komponen | Fungsi |
|---|---|
| Docker CLI | Perintah yang Anda jalankan |
| dockerd | Daemon yang mengelola container |
| containerd | Runtime container |
| runc | Membuat dan menjalankan container |
| Registry | Menyimpan dan mendistribusikan image |
Image
Image adalah template read-only berisi filesystem dan metadata aplikasi.
docker pull nginx:alpine
docker images
docker image inspect nginx:alpine
docker rmi nginx:alpineImage terdiri dari layer. Setiap instruksi Dockerfile membuat layer yang di-cache.
| Perintah | Fungsi |
|---|---|
docker pull | Mengunduh image |
docker images | Daftar image lokal |
docker rmi | Menghapus image |
docker history | Melihat layer image |
Container
Container adalah instance image yang berjalan.
docker run -d --name web -p 8080:80 nginx:alpine
docker ps
docker ps -a
docker logs -f web
docker exec -it web sh
docker stop web
docker start web
docker rm webOpsi docker run | Fungsi |
|---|---|
-d | Detached (background) |
--name | Nama container |
-p host:container | Pemetaan port |
-v | Mount volume |
-e | Environment variable |
--restart | Kebijakan restart |
--network | Jaringan container |
Siklus hidup
created → running → paused → stopped → removeddocker create nginx:alpine
docker start <container>
docker pause <container>
docker unpause <container>
docker stop <container>
docker rm <container>Network
Docker menyediakan jaringan internal agar container bisa saling berkomunikasi.
| Driver | Fungsi |
|---|---|
bridge | Default, NAT ke host |
host | Berbagi network host |
none | Tanpa jaringan |
overlay | Multi-host (Swarm) |
macvlan | IP langsung di jaringan fisik |
docker network ls
docker network create app-net
docker run -d --name db --network app-net postgres:16
docker run -d --name api --network app-net -p 3000:3000 myapp
docker network inspect app-netDi jaringan yang sama, container bisa saling mengakses dengan nama container sebagai hostname:
docker exec -it api sh
# di dalam container:
# ping db
# curl http://db:5432Volume
Data di dalam container hilang saat container dihapus. Volume menyimpan data secara persisten.
| Jenis | Contoh | Catatan |
|---|---|---|
| Named volume | app-data:/var/lib/postgresql/data | Dikelola Docker |
| Bind mount | ./html:/usr/share/nginx/html | Langsung ke path host |
| tmpfs | /tmp | Disimpan di RAM |
docker volume create app-data
docker volume ls
docker volume inspect app-data
docker run -d --name db -v app-data:/var/lib/postgresql/data postgres:16
docker volume rm app-dataJangan simpan data penting hanya di container
Selalu gunakan volume atau bind mount untuk database, upload, dan konfigurasi yang harus bertahan. Hapus container dengan hati-hati agar tidak menghapus volume yang masih dipakai.
Registry
Registry menyimpan image agar bisa diambil server lain.
docker login
docker tag myapp:latest username/myapp:1.0.0
docker push username/myapp:1.0.0
docker pull username/myapp:1.0.0Registry populer: Docker Hub, GitHub Container Registry (GHCR), GitLab Registry, dan registry privat.
Perintah pembersihan
docker system df
docker system prune
docker system prune -a
docker image prune
docker volume prune
docker container pruneprune bisa menghapus data
docker system prune -a --volumes dapat menghapus image dan volume yang tidak dipakai. Pastikan
Anda memahami dampaknya sebelum menjalankannya di server produksi.
Instalasi Docker
Gunakan repository resmi Docker, bukan paket distro yang mungkin tertinggal versi.
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
docker version
docker infoTambahkan user ke group docker agar tidak perlu sudo:
usermod -aG docker deploy
newgrp dockerGroup docker setara root
Anggota group docker dapat mengakses host secara efektif sebagai root. Berikan hanya kepada user
yang tepercaya.
Praktik: menjalankan Nginx
# 1. Jalankan container
docker run -d --name web -p 8080:80 nginx:alpine
# 2. Cek status
docker ps
# 3. Lihat log
docker logs web
# 4. Uji
curl -I http://localhost:8080
# 5. Masuk ke container
docker exec -it web sh
# ls /usr/share/nginx/html
# exit
# 6. Hentikan dan hapus
docker stop web
docker rm webRingkasan
- Docker mengemas aplikasi dalam container yang berbagi kernel host.
- Image adalah template; container adalah instance yang berjalan.
- Network memungkinkan komunikasi antar-container; volume menyimpan data persisten.
- Registry mendistribusikan image ke server lain.
- Pahami perintah dasar dan risiko
prunesebelum dipakai di produksi.
Selanjutnya
Bangun image dan jalankan stack di Dockerfile, Docker Compose, dan Application Deployment.
PM2 Configuration, Logs, Restart, dan Application Troubleshooting
Mengelola log PM2, rotasi log, restart yang aman, serta mendiagnosis error umum aplikasi Node.js di produksi.
Dockerfile, Docker Compose, dan Application Deployment
Menulis Dockerfile multi-stage, membangun image, menyusun Docker Compose untuk aplikasi dan database, lalu men-deploy-nya.