Pernah nggak kamu ngerasa aplikasinya jalan mulus di laptop sendiri, tapi begitu dipindah ke server teman — error semua? Itulah alasan Docker lahir. Dan di jantung Docker, ada tiga konsep yang wajib kamu pahami sebelum menyentuh hal lain: Docker image, container, dan volume. Ketiganya bukan sekadar istilah teknis — mereka adalah fondasi dari cara Docker bekerja. Artikel ini adalah bagian ke-3 dari seri 10 Artikel Belajar Docker: Docker from Zero to Zorro, dan di sini kita akan kupas tuntas ketiganya dalam satu duduk, lengkap dengan analogi, kode nyata, dan langkah-langkah yang bisa langsung kamu praktikkan.
🖼️ Apa Itu Docker Image? Resep Masakan untuk Aplikasimu
Bayangkan kamu punya resep masakan rahasia. Resep itu berisi daftar bahan, urutan memasak, dan takaran yang tepat. Kamu bisa membagikan resep itu ke siapa saja, dan hasilnya akan selalu sama — baik dimasak di Jakarta, Surabaya, atau bahkan di server cloud sekalipun.
Itulah Docker image. Ia adalah template read-only (hanya bisa dibaca, tidak bisa diubah langsung) yang berisi semua yang dibutuhkan untuk menjalankan sebuah aplikasi: sistem operasi dasar, library, konfigurasi, sampai kode program. Image adalah blueprint — bukan aplikasi yang sedang berjalan, tapi instruksi lengkap untuk membuatnya.
Docker Image adalah snapshot read-only yang berisi filesystem, dependensi, environment variables, dan instruksi untuk menjalankan sebuah aplikasi. Image dibuat dari Dockerfile dan dapat dibagikan via Docker Hub atau registry lainnya.
Docker image disusun dalam layer — seperti lapisan es krim. Setiap instruksi di Dockerfile menciptakan satu layer baru. Layer ini bersifat immutable dan bisa di-cache, sehingga proses build berikutnya jadi lebih cepat karena hanya layer yang berubah yang perlu diproses ulang.
Docker Hub memiliki lebih dari 100.000+ image publik yang bisa langsung kamu pakai. Mulai dari Ubuntu, Node.js, MySQL, sampai Nginx — semuanya gratis dan siap pakai dalam hitungan detik.
# Menarik image dari Docker Hub docker pull nginx # Melihat daftar image yang sudah ada di lokal docker images # Menghapus image tertentu (pakai IMAGE ID dari docker images) docker rmi nginx # Melihat detail layer sebuah image docker history nginx
🚢 Docker Container: Ketika Resep Jadi Hidangan Nyata
Kalau image adalah resep, maka container adalah hasil masakannya — hidangan yang nyata ada di atas meja dan bisa kamu makan. Container adalah instance yang sedang berjalan dari sebuah image. Satu resep bisa menghasilkan banyak hidangan, dan begitu pula — satu image bisa menghasilkan banyak container yang berjalan secara bersamaan dan terisolasi satu sama lain.
Inilah keajaiban Docker: setiap container berjalan dalam lingkungannya sendiri. Container A tidak tahu apa yang ada di Container B, meski keduanya berjalan di mesin yang sama. Ini disebut isolation — dan itulah yang membuat Docker begitu powerful untuk deployment.
Container bersifat ephemeral — artinya, data di dalamnya hilang saat container dihapus. Kalau kamu simpan file di dalam container tanpa volume, dan container itu dihapus, file tersebut ikut hilang. Inilah kenapa kita butuh Volume (yang akan dibahas berikutnya).
Cara Menjalankan Container Pertamamu — Step by Step
Ketik perintah berikut di terminal untuk memastikan Docker daemon aktif.
docker version
Flag -d = detached (berjalan di background), -p 8080:80 = port mapping (port 8080 di hostmu → port 80 di container).
docker run -d -p 8080:80 --name web-ku nginx
Kalau muncul halaman "Welcome to nginx!" — selamat! Container pertamamu berhasil berjalan. 🎉
# Container yang aktif docker ps # Semua container (termasuk yang sudah stop) docker ps -a
# Hentikan container docker stop web-ku # Hapus container (data di dalamnya HILANG!) docker rm web-ku
💾 Docker Volume: Lemari Penyimpanan yang Tidak Ikut Hancur
Ini bagian paling krusial yang sering dilewati pemula — dan biasanya berujung pada data hilang yang bikin panik. Seperti yang sudah kita tahu, container bersifat ephemeral. Kalau container dihapus, semua data di dalamnya ikut lenyap.
Bayangkan kamu tinggal di apartemen kontrakan. Semua furnitur di dalam apartemen itu adalah milik penyewa — kalau kamu pindah, furniturnya ikut kamu. Tapi ada lemari bawaan apartemen yang tetap di sana meski kamu sudah pergi. Itulah Docker Volume — penyimpanan yang hidupnya terpisah dari container, tapi bisa dipasang ke container manapun yang membutuhkannya.
Docker Volume adalah mekanisme penyimpanan persisten yang dikelola oleh Docker dan hidup di luar siklus hidup container. Data tetap ada meski container dihapus, dan bisa di-mount ke banyak container sekaligus.
Jangan pernah simpan data penting seperti database MySQL atau file upload di dalam container tanpa volume. Sekali docker rm dijalankan — data kamu hilang selamanya, dan tidak ada recycle bin di sini.
# Membuat volume baru docker volume create data-laravel # Melihat semua volume docker volume ls # Melihat detail volume (lokasi di filesystem) docker volume inspect data-laravel # Menjalankan container dengan volume di-mount # Format: -v nama-volume:path-di-container docker run -d \ -p 8080:80 \ -v data-laravel:/var/www/html \ --name app-laravel \ nginx # Menghapus volume (hati-hati! data hilang) docker volume rm data-laravel # Menghapus semua volume yang tidak terpakai docker volume prune
Ada dua cara mount storage di Docker: Named Volume (dikelola Docker, lebih portable) dan Bind Mount (mount langsung dari folder di host, cocok untuk development). Untuk production, selalu gunakan Named Volume. Untuk development lokal, Bind Mount lebih praktis karena file langsung tersinkron dengan editor kamu.
🔍 Analisis: Named Volume vs Bind Mount — Kapan Pakai Yang Mana?
- Dikelola sepenuhnya oleh Docker
- Portable antar environment
- Ideal untuk database (MySQL, PostgreSQL, Redis)
- Lebih aman untuk production
-v nama-volume:/path
- Mount langsung dari folder di host
- File di host langsung terlihat di container
- Ideal untuk development aktif
- Bergantung pada struktur folder host
-v /path/host:/path/container
🛠️ Praktik Nyata: Gabungkan Image, Container, dan Volume untuk Laravel
Oke, sekarang kita gabungkan ketiga konsep Docker image, container, dan volume dalam satu skenario nyata. Bayangkan kamu ingin menjalankan aplikasi Laravel dengan MySQL sebagai database — dan kamu ingin data MySQL-nya persisten meski container dimatikan.
# Langkah 1: Buat volume untuk data MySQL docker volume create mysql-data # Langkah 2: Jalankan container MySQL dengan volume docker run -d \ --name db-mysql \ -e MYSQL_ROOT_PASSWORD=rahasiabanget \ -e MYSQL_DATABASE=laravel_app \ -v mysql-data:/var/lib/mysql \ -p 3306:3306 \ mysql:8.0 # Langkah 3: Jalankan container Laravel # (dengan bind mount untuk sync kode saat development) docker run -d \ --name app-laravel \ --link db-mysql:mysql \ -v $(pwd):/var/www/html \ -p 8000:8000 \ php:8.2-apache # Langkah 4: Cek semua container berjalan docker ps # Langkah 5: Test — stop dan hapus container MySQL # kemudian jalankan lagi — data TETAP ADA karena ada volume! docker stop db-mysql docker rm db-mysql docker run -d --name db-mysql \ -e MYSQL_ROOT_PASSWORD=rahasiabanget \ -v mysql-data:/var/lib/mysql \ -p 3306:3306 mysql:8.0
Dalam project nyata, kamu akan menggunakan Docker Compose untuk mendefinisikan semua container, volume, dan network dalam satu file docker-compose.yml. Kita akan bahas ini di artikel-artikel berikutnya dalam seri ini. Tapi memahami perintah manual seperti di atas adalah fondasi yang wajib dimiliki!
No comments:
Post a Comment