Pelajari cara membangun pipeline Continuous Integr...

Halo para ksatria keyboard dan penyihir kode! π Pernahkah kamu merasa frustrasi saat mencoba menyiapkan lingkungan pengembangan Laravel yang sama persis di berbagai mesin? Atau mungkin kamu sering berhadapan dengan masalah "works on my machine" yang legendaris itu? Jangan khawatir, kamu tidak sendirian! Hampir semua developer pernah merasakan pahitnya perbedaan lingkungan development dan production. Tapi, bagaimana jika ada solusi ajaib yang bisa membuat hidup kita lebih mudah, lebih konsisten, dan bahkan lebih menyenangkan? Masuklah, Docker! π
Dalam artikel ini, kita akan menyelami dunia Docker yang menakjubkan, khususnya untuk kita para developer Laravel. Kita akan belajar bagaimana Docker bisa menjadi sahabat terbaikmu dalam menyederhanakan proses pengembangan dan deployment aplikasi Laravel. Siap untuk mengucapkan selamat tinggal pada masalah lingkungan yang bikin pusing dan menyambut konsistensi yang membahagiakan? Yuk, kita mulai petualangan ini! πΊοΈ
Sebelum kita terlalu jauh menyelam, mari kita pahami dulu mengapa Docker ini begitu penting dan mengapa ia layak mendapatkan tempat di hati setiap developer Laravel. Bayangkan ini: kamu sedang mengerjakan proyek Laravel yang membutuhkan PHP versi 8.2, MySQL 8.0, Redis, dan Nginx. Temanmu, di sisi lain, sedang mengerjakan proyek lain yang membutuhkan PHP 7.4, PostgreSQL, dan Apache. Jika kalian berdua menggunakan mesin yang sama, atau bahkan jika kamu sendiri harus beralih antara proyek-proyek ini, bisa-bisa rambutmu rontok semua karena konflik versi! π€―
Di sinilah Docker datang sebagai penyelamat! Docker memungkinkan kita untuk "mengemas" aplikasi kita beserta semua dependensinya (PHP, MySQL, Nginx, Redis, dll.) ke dalam unit-unit yang terisolasi yang disebut kontainer. Kontainer ini ringan, portabel, dan yang paling penting, konsisten! Artinya, apa yang berjalan di mesinmu akan berjalan persis sama di mesin temanmu, di server staging, dan bahkan di server produksi. Bye-bye, "works on my machine" syndrome! π
Oke, sudah cukup puji-pujian untuk Docker. Sekarang, mari kita mulai petualangan praktis kita! Siap? πͺ
Langkah pertama untuk menjadi seorang master Docker adalah menginstalnya di mesinmu. Jangan khawatir, prosesnya cukup mudah dan intuitif. Docker menyediakan installer yang ramah pengguna untuk berbagai sistem operasi.
Jika kamu pengguna Windows atau macOS, cara termudah adalah menginstal Docker Desktop. Ini adalah aplikasi yang menyediakan lingkungan Docker lengkap, termasuk Docker Engine, Docker CLI, Docker Compose, dan Kubernetes (opsional) dalam satu paket yang mudah digunakan.
Untuk pengguna Linux, kamu perlu menginstal Docker Engine dan Docker Compose secara terpisah. Prosesnya bervariasi sedikit tergantung distribusi Linux yang kamu gunakan, tapi secara umum langkahnya mirip.
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker $USER # Tambahkan user ke grup docker agar tidak perlu sudo
newgrp docker # Aktifkan perubahan grup tanpa perlu logout/login
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
(Catatan: Ganti v2.20.2 dengan versi Docker Compose terbaru yang tersedia di halaman rilis GitHub Docker Compose.)
Setelah instalasi, buka terminal atau command prompt dan jalankan perintah berikut untuk memastikan semuanya berjalan lancar:
docker --version
docker compose version
Jika kamu melihat output versi Docker dan Docker Compose, selamat! Kamu sudah siap untuk berlayar di lautan Docker! π’
Baca juga: Menguasai JavaScript Asynchronous: Promise dan Async/Await
Inilah bagian yang paling seru! Kita akan membuat file docker-compose.yml yang akan mendefinisikan seluruh stack aplikasi Laravel kita. Bayangkan ini seperti blueprint untuk lingkungan developmentmu. Kita akan membuat layanan untuk aplikasi Laravel (PHP-FPM), web server (Nginx), database (MySQL), dan mungkin juga Redis.
Pertama, buatlah direktori baru untuk proyek Laravelmu (jika belum ada) dan masuk ke dalamnya:
mkdir my-laravel-app
cd my-laravel-app
Kemudian, buat file docker-compose.yml di root direktori proyekmu:
touch docker-compose.yml
Sekarang, buka file docker-compose.yml tersebut dan salin kode berikut. Kita akan bedah satu per satu setelahnya!
version: '3.8'
services:
# Service untuk aplikasi Laravel (PHP-FPM)
app:
build:
context: .
dockerfile: Dockerfile
container_name: laravel_app
restart: unless-stopped
volumes:
- .:/var/www/html
networks:
- app-network
# Service untuk Nginx (web server)
nginx:
image: nginx:stable-alpine
container_name: laravel_nginx
restart: unless-stopped
ports:
- "8000:80" # Map port 8000 di host ke port 80 di container
volumes:
- .:/var/www/html
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
networks:
- app-network
# Service untuk MySQL (database)
db:
image: mysql:8.0
container_name: laravel_db
restart: unless-stopped
environment:
MYSQL_DATABASE: laravel_db
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: user
MYSQL_PASSWORD: password
volumes:
- dbdata:/var/lib/mysql
networks:
- app-network
# Service untuk Redis (cache/queue)
redis:
image: redis:alpine
container_name: laravel_redis
restart: unless-stopped
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
dbdata:
driver: local
docker-compose.yml: Apa Saja Isinya? π΅οΈββοΈversion: '3.8': Ini adalah versi sintaks Docker Compose yang kita gunakan. Selalu gunakan versi terbaru yang stabil.services:: Di sinilah kita mendefinisikan semua "layanan" atau kontainer yang membentuk aplikasi kita.app (PHP-FPM):
build:: Ini memberitahu Docker Compose untuk membangun image Docker untuk layanan ini dari Dockerfile yang kita definisikan.context: .: Menunjukkan bahwa Dockerfile berada di direktori saat ini.dockerfile: Dockerfile: Nama file Dockerfile yang akan digunakan.container_name: laravel_app: Nama yang mudah diingat untuk kontainer ini.restart: unless-stopped: Kontainer akan otomatis restart kecuali kita menghentikannya secara manual.volumes: - .:/var/www/html: Ini adalah bagian krusial! Ini "memasang" (mount) direktori proyek Laravelmu di host (.) ke dalam direktori /var/www/html di dalam kontainer. Jadi, setiap perubahan kode di host akan langsung terlihat di kontainer. Magic! β¨networks: - app-network: Menghubungkan kontainer ini ke jaringan app-network agar bisa berkomunikasi dengan kontainer lain (Nginx, MySQL, Redis).nginx (Web Server):
image: nginx:stable-alpine: Kita menggunakan image Nginx resmi dari Docker Hub. Versi alpine lebih ringan dan cepat.ports: - "8000:80": Ini memetakan port 8000 di mesin hostmu ke port 80 di dalam kontainer Nginx. Jadi, kamu bisa mengakses aplikasi Laravelmu melalui http://localhost:8000.volumes::
- .:/var/www/html: Sama seperti kontainer app, ini untuk sinkronisasi kode.- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf: Ini memasang file konfigurasi Nginx kustom dari host ke dalam kontainer. Kita akan membuat file ini sebentar lagi.db (MySQL Database):
image: mysql:8.0: Menggunakan image MySQL versi 8.0.environment:: Variabel lingkungan untuk mengkonfigurasi database (nama database, user, password root).volumes: - dbdata:/var/lib/mysql: Ini adalah named volume. Data database akan disimpan di volume bernama dbdata di host, sehingga data tidak hilang saat kontainer di-stop atau dihapus. Penting! πΎredis (Cache/Queue):
image: redis:alpine: Menggunakan image Redis versi alpine yang ringan.networks:: Mendefinisikan jaringan kustom agar kontainer bisa saling berkomunikasi dengan nama layanan mereka (misal: app bisa berkomunikasi dengan db menggunakan hostname db).volumes:: Mendefinisikan named volume dbdata yang digunakan oleh kontainer MySQL.Kontainer app kita perlu dibangun dari Dockerfile. Buat direktori docker di root proyek, lalu di dalamnya buat direktori nginx dan file Dockerfile:
mkdir -p docker/nginx
touch Dockerfile
touch docker/nginx/default.conf
Sekarang, buka file Dockerfile dan tambahkan kode berikut:
FROM php:8.2-fpm-alpine
# Set working directory
WORKDIR /var/www/html
# Install dependencies
RUN apk add --no-cache \
git \
curl \
libxml2-dev \
zip \
unzip \
oniguruma-dev \
libzip-dev \
postgresql-dev \
icu-dev \
&& docker-php-ext-install \
pdo_mysql \
mbstring \
exif \
pcntl \
bcmath \
gd \
sockets \
intl \
opcache \
zip
# Install Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Clear cache
RUN rm -rf /var/cache/apk/*
# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
Mari kita bedah Dockerfile ini:
FROM php:8.2-fpm-alpine: Kita mulai dari image PHP-FPM versi 8.2 berbasis Alpine Linux. Alpine sangat ringan!WORKDIR /var/www/html: Menetapkan direktori kerja di dalam kontainer.RUN apk add --no-cache ...: Menginstal dependensi sistem yang dibutuhkan oleh PHP dan Laravel (misalnya git, curl, zip, dll.).&& docker-php-ext-install ...: Menginstal ekstensi PHP yang umum digunakan oleh Laravel (pdo_mysql, mbstring, dll.).COPY --from=composer:latest /usr/bin/composer /usr/bin/composer: Ini adalah trik keren! Kita menyalin binary Composer langsung dari image Composer resmi. Ini memastikan kita selalu punya Composer versi terbaru tanpa perlu menginstalnya secara manual di Dockerfile ini.EXPOSE 9000: Memberitahu Docker bahwa kontainer ini akan mendengarkan di port 9000 (port default PHP-FPM).CMD ["php-fpm"]: Perintah yang akan dijalankan saat kontainer dimulai.Sekarang, buka file docker/nginx/default.conf dan tambahkan konfigurasi Nginx berikut:
server {
listen 80;
server_name localhost;
root /var/www/html/public; # Direktori public Laravel
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass app:9000; # Mengirim request PHP ke service 'app' (PHP-FPM)
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
Poin penting di sini adalah root /var/www/html/public; yang menunjuk ke direktori public Laravel, dan fastcgi_pass app:9000; yang mengarahkan semua request PHP ke kontainer app kita (PHP-FPM) melalui port 9000. Ingat, app adalah nama service yang kita definisikan di docker-compose.yml!
Kita sudah punya semua file konfigurasi yang dibutuhkan. Sekarang saatnya menginstal Laravel dan menjalankan semuanya!
Karena kita sudah punya Composer di dalam kontainer app, kita bisa menggunakannya untuk membuat proyek Laravel baru. Jalankan perintah ini dari root direktori proyekmu:
docker compose run --rm app composer create-project laravel/laravel .
Apa artinya perintah ini?
docker compose run: Menjalankan perintah satu kali di dalam sebuah service.--rm: Menghapus kontainer setelah perintah selesai dijalankan (karena kita hanya butuh untuk instalasi, bukan kontainer yang berjalan terus-menerus).app: Nama service tempat perintah akan dijalankan (kontainer PHP-FPM kita).composer create-project laravel/laravel .: Perintah Composer untuk membuat proyek Laravel di direktori saat ini.Sekarang, buka file .env di root proyek Laravelmu dan ubah konfigurasi database agar sesuai dengan service MySQL kita:
DB_CONNECTION=mysql
DB_HOST=db # Nama service MySQL di docker-compose.yml
DB_PORT=3306
DB_DATABASE=laravel_db # Nama database yang kita definisikan di docker-compose.yml
DB_USERNAME=user # User yang kita definisikan
DB_PASSWORD=password # Password yang kita definisikan
Pastikan juga untuk mengkonfigurasi Redis jika kamu berencana menggunakannya:
REDIS_HOST=redis # Nama service Redis di docker-compose.yml
REDIS_PASSWORD=null
REDIS_PORT=6379
Baca juga: Keamanan API Laravel: Melindungi Data dari Serangan Umum
Ini dia momen yang ditunggu-tunggu! Dari root direktori proyekmu, jalankan perintah sakti ini:
docker compose up -d
Apa artinya?
docker compose up: Membangun (jika belum) dan menjalankan semua service yang didefinisikan di docker-compose.yml.-d: Menjalankan kontainer di latar belakang (detached mode), sehingga kamu bisa tetap menggunakan terminalmu.Untuk melihat status kontainer yang berjalan:
docker compose ps
Sekarang, jalankan migrasi database Laravelmu. Kita akan menggunakan kontainer app untuk menjalankan perintah Artisan:
docker compose exec app php artisan migrate
Perintah docker compose exec app memungkinkan kita untuk menjalankan perintah di dalam kontainer app yang sedang berjalan.
Selamat! Aplikasi Laravelmu sekarang sudah berjalan di dalam kontainer Docker! π Buka browser favoritmu dan kunjungi http://localhost:8000. Kamu akan melihat halaman selamat datang Laravel! π₯³
Setelah aplikasi berjalan, kamu pasti ingin tahu bagaimana cara mengelola kontainer-kontainer ini. Berikut beberapa perintah Docker Compose yang akan sering kamu gunakan:
docker compose stop
Ini akan menghentikan kontainer tanpa menghapusnya.
docker compose down
Jika kamu ingin menghapus named volume dbdata juga (hati-hati, ini akan menghapus data database!), tambahkan flag -v:
docker compose down -v
docker compose logs -f
Flag -f (follow) akan menampilkan log secara real-time. Kamu bisa menambahkan nama service (misal: docker compose logs -f app) untuk melihat log dari kontainer spesifik.
app:
docker compose exec app php artisan cache:clear
docker compose exec app composer update
app:
docker compose exec app bash
Ini sangat berguna untuk debugging atau menjelajahi isi kontainer.
docker compose build
Setelah membangun ulang, kamu perlu menjalankan docker compose up -d lagi.
Salah satu keuntungan terbesar Docker adalah konsistensinya dari development ke production. Proses deployment menjadi jauh lebih sederhana dan minim risiko. Berikut adalah gambaran umum alur deployment dengan Docker:
.env untuk produksi dengan konfigurasi database, Redis, dll., yang sesuai dengan lingkungan produksi.APP_ENV=production.Dari root direktori proyek, jalankan:
docker compose -f docker-compose.prod.yml up -d --build
(Catatan: docker-compose.prod.yml adalah contoh file Docker Compose terpisah untuk produksi, yang mungkin memiliki konfigurasi berbeda, misalnya port, resource limit, atau tanpa XDebug.)
docker compose exec app php artisan migrate --force
docker compose exec app php artisan config:cache
docker compose exec app php artisan route:cache
docker compose exec app php artisan view:cache
Dengan Docker, kamu bisa yakin bahwa aplikasi yang berjalan di produksi akan berperilaku persis sama seperti di mesin developmentmu. Ini mengurangi waktu debugging dan meningkatkan kepercayaan diri saat deployment. Sungguh melegakan, bukan? π
vendor dan node_modules agar tidak perlu sinkronisasi file yang banyak antara host dan kontainer..env untuk Docker Compose (misal: .env.docker) untuk variabel lingkungan yang spesifik untuk Docker, dan file .env Laravel untuk variabel lingkungan aplikasi.Selamat! Kamu telah berhasil menyelami dunia Docker untuk developer Laravel. Dari memahami mengapa Docker itu penting, menginstal tools-nya, membangun lingkungan development yang konsisten dengan Docker Compose, hingga gambaran umum deployment, kamu sekarang punya bekal yang cukup untuk memulai petualanganmu sendiri.
Docker mungkin terasa sedikit menakutkan di awal, dengan semua konsep image, kontainer, volume, dan jaringan. Tapi percayalah, investasi waktu untuk mempelajarinya akan sangat terbayar di kemudian hari. Kamu akan menikmati konsistensi lingkungan, setup proyek yang super cepat, dan proses deployment yang jauh lebih mulus. Ucapkan selamat tinggal pada masalah "works on my machine" dan sambut era pengembangan yang lebih efisien dan menyenangkan! π
Jadi, tunggu apa lagi? Mulailah bereksperimen dengan Docker di proyek Laravelmu. Coba buat konfigurasi yang berbeda, tambahkan layanan lain seperti Mailhog atau Selenium, dan rasakan sendiri keajaibannya. Jika ada pertanyaan atau kamu menemukan tips keren lainnya, jangan ragu untuk berbagi di kolom komentar!
Selamat ngoding dengan Docker dan Laravel! π»π³
Pelajari cara membangun pipeline Continuous Integr...
Pelajari bagaimana Docker dapat menyederhanakan pr...