Docker Compose untuk Tumpukan Lokal
Jalankan PHP, basis data, dan cache bersama-sama secara lokal.
Docker Compose untuk Tumpukan Lokal adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar PHP Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus PHP Academy mencakup 4 pelajaran total.
Susunan Lokal dengan Compose
Aplikasi PHP nyata tidak pernah hanya PHP — aplikasi tersebut memerlukan basis data, tembolok, terkadang antrean dan penangkap surat. Docker Compose mendeklarasikan semuanya sebagai layanan dalam satu berkas dan menghubungkannya ke jaringan bersama agar layanan-layanan tersebut dapat saling menjangkau berdasarkan nama.
Pelajaran ini menyusun susunan lokal lengkap: PHP-FPM + nginx + MySQL + Redis, dengan volume, pemeriksaan kesehatan, dan pengurutan dependensi.
Kerangka Layanan
Berkas Compose mencantumkan layanan di bawah services:. Setiap layanan dapat build dari Dockerfile atau mengambil image. Compose membuat jaringan bawaan yang memungkinkan setiap layanan dijangkau berdasarkan kuncinya — aplikasi PHP Anda terhubung ke MySQL melalui host db, bukan localhost.
services:
app:
build:
context: .
target: dev # multi-stage dev target
volumes:
- ./:/app # live code mount
depends_on:
db:
condition: service_healthy
db:
image: mysql:8.4
redis:
image: redis:7-alpinenginx di Depan FPM
FPM menggunakan FastCGI pada port 9000, bukan HTTP. nginx menangani terminasi HTTP dan meneruskan permintaan .php ke app:9000. Konfigurasi nginx merujuk layanan PHP berdasarkan nama Compose-nya.
# docker/nginx/default.conf
server {
listen 80;
root /app/public;
index index.php;
location / {
try_files $uri /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass app:9000; # service name from compose
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}Menghubungkan Layanan Web
Layanan nginx memasang kode yang sama (untuk menyelesaikan SCRIPT_FILENAME) dan konfigurasi, mempublikasikan port 80, serta bergantung pada layanan aplikasi. Keduanya berbagi /app agar jalurnya cocok di kedua sisi FastCGI.
services:
web:
image: nginx:1.27-alpine
ports:
- "8080:80"
volumes:
- ./:/app:ro
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- appVolume Persisten
Sistem berkas kontainer bersifat sementara. Volume bernama mempertahankan berkas basis data setelah docker compose down. Pemasangan terikat (./:/app) menyinkronkan kode host secara langsung untuk pengembangan. Gunakan volume bernama untuk data yang memiliki status dan pemasangan terikat untuk kode sumber.
services:
db:
image: mysql:8.4
environment:
MYSQL_DATABASE: app
MYSQL_USER: app
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: rootsecret
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata: # survives `down`, removed only by `down -v`Pemeriksaan Kesehatan dan depends_on
depends_on saja hanya menunggu kontainer dimulai, bukan sampai MySQL menerima koneksi. Tambahkan healthcheck dan gunakan condition: service_healthy agar aplikasi menunggu sampai basis data benar-benar siap.
services:
db:
image: mysql:8.4
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-prootsecret"]
interval: 5s
timeout: 3s
retries: 10
app:
build: .
depends_on:
db:
condition: service_healthy # waits for healthcheck passLingkungan & .env
Compose otomatis memuat .env yang berada di sebelahnya untuk interpolasi variabel, dan Anda meneruskan konfigurasi aplikasi melalui environment atau env_file. Jauhkan rahasia dari berkas Compose yang dikomit; gunakan referensi variabel sebagai gantinya.
services:
app:
build: .
env_file:
- .env
environment:
DATABASE_URL: "mysql://app:secret@db:3306/app"
REDIS_URL: "redis://redis:6379"
# .env (gitignored) provides ${...} substitutions
# MYSQL_PASSWORD=secretMenghubungkan dari PHP
Di dalam jaringan, nama host adalah nama layanan. Kode PHP Anda terhubung langsung ke db dan redis. Cuplikan ini mengurai DSN seperti yang akan dilakukan lapisan konfigurasi, menunjukkan bagaimana nama layanan Compose mengalir ke dalam string koneksi Anda.
<?php
$dsn = 'mysql://app:secret@db:3306/app';
$p = parse_url($dsn);
printf("driver: %s\n", $p['scheme']);
printf("host: %s\n", $p['host']); // 'db' resolves via compose DNS
printf("port: %d\n", $p['port']);
printf("db: %s\n", ltrim($p['path'], '/'));
$pdoDsn = sprintf('mysql:host=%s;port=%d;dbname=%s', $p['host'], $p['port'], ltrim($p['path'], '/'));
echo $pdoDsn . PHP_EOL;
?>Xdebug untuk Pengembangan Lokal
Pasang konfigurasi Xdebug hanya secara lokal (melalui target pembangunan dev). Arahkan client_host ke host.docker.internal agar penelusur dapat menjangkau IDE Anda di host. Jangan pernah mengirim Xdebug ke produksi — Xdebug sangat menurunkan kinerja.
; docker/php/xdebug.ini (mounted only in dev)
zend_extension=xdebug
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=9003Menjalankan Perintah Sekali Jalan
docker compose run menjalankan kontainer sementara untuk migrasi, pengujian, atau Composer; exec berjalan di dalam layanan yang sudah berjalan. Gunakan run --rm untuk berbagai tugas agar kontainer sementara tersebut dibersihkan.
# Run migrations against the running db
docker compose exec app php bin/console doctrine:migrations:migrate
# One-off: install deps without a long-lived container
docker compose run --rm app composer install
# Tail logs of just the web service
docker compose logs -f webBerkas Pengganti
Compose otomatis menggabungkan docker-compose.yml dengan docker-compose.override.yml. Pertahankan bawaan berorientasi produksi dalam berkas dasar dan letakkan volume, port, serta Xdebug khusus pengembangan di dalam pengganti — sehingga sistem integrasi berkelanjutan menggunakan berkas dasar dan pengembang mendapatkan tambahan tersebut secara otomatis.
# docker-compose.override.yml (auto-merged, dev only)
services:
app:
volumes:
- ./docker/php/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini:ro
environment:
APP_ENV: dev
# CI runs: docker compose -f docker-compose.yml up (no override)Pemeriksaan Singkat
Mengapa depends_on: [db] biasa tidak memadai sebelum menjalankan migrasi?
Rangkuman
Anda telah menyusun susunan lokal dengan Compose: PHP-FPM di belakang nginx (FastCGI ke app:9000), MySQL dan Redis yang dapat dijangkau berdasarkan nama layanan, volume bernama untuk persistensi, pemeriksaan kesehatan yang menjadi syarat bagi depends_on, konfigurasi berbasis env, pengganti khusus pengembangan dengan Xdebug, serta perintah sekali jalan melalui run/exec.
Ingat: nama layanan adalah nama host DNS, berkas pengganti menjaga tambahan pengembangan tetap berada di luar sistem integrasi berkelanjutan, dan pemeriksaan kesehatan lebih andal daripada pengurutan awal yang naif.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Docker Compose untuk Tumpukan Lokal” gratis?
Ya — teks lengkap “Docker Compose untuk Tumpukan Lokal” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus PHP Academy, upgrade ke CoddyKit PRO. Kursus PHP Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Docker Compose untuk Tumpukan Lokal”?
Jalankan PHP, basis data, dan cache bersama-sama secara lokal. Kamu berlatih PHP Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai PHP Academy?
Tidak diperlukan pengalaman sebelumnya. PHP Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Docker Compose untuk Tumpukan Lokal” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran PHP Academy ini?
Ya. Setiap pelajaran PHP Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Membuat Aplikasi PHP Menjadi Kontainer
- Build Multi-Tahap dan Optimasi
- Docker Compose untuk Tumpukan Lokal
- CI/CD dengan GitHub Actions