Catatan

Docker untuk Developer PHP: Dari Nol Sampai Deploy

Salah satu masalah klasik developer: "Di komputerku jalan, kok di server error?" Docker menyelesaikan masalah ini dengan mengemas aplikasi beserta seluruh dependensinya ke dalam container yang identik di mana saja.

Kenapa Docker?

  • Lingkungan dev dan production identik
  • Tidak perlu install PHP, MySQL, Nginx langsung di komputer
  • Mudah onboarding developer baru: cukup docker compose up
  • Mudah menjalankan beberapa versi PHP sekaligus

Struktur Project

my-blog/
├── docker/
│   ├── php/Dockerfile
│   └── nginx/default.conf
├── src/               ← kode PHP di sini
├── docker-compose.yml
└── .env

Dockerfile untuk PHP

# docker/php/Dockerfile
FROM php:8.3-fpm-alpine

# Install ekstensi yang dibutuhkan Laravel/PHP
RUN apk add --no-cache 
    linux-headers 
    $PHPIZE_DEPS 
    && docker-php-ext-install pdo_mysql opcache 
    && pecl install redis 
    && docker-php-ext-enable redis

# Install Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html

# Copy kode aplikasi
COPY src/ .

RUN composer install --no-dev --optimize-autoloader

Konfigurasi Nginx

# docker/nginx/default.conf
server {
    listen 80;
    root /var/www/html/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

docker-compose.yml

services:
  nginx:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

  php:
    build: ./docker/php
    volumes:
      - ./src:/var/www/html
    environment:
      DB_HOST: db
      DB_DATABASE: ${DB_NAME}
      DB_USERNAME: ${DB_USER}
      DB_PASSWORD: ${DB_PASS}
    depends_on:
      db:
        condition: service_healthy

  db:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASS}
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      retries: 10

  phpmyadmin:
    image: phpmyadmin
    ports:
      - "8081:80"
    environment:
      PMA_HOST: db

volumes:
  db_data:

Jalankan

# Pertama kali atau setelah ubah Dockerfile
docker compose up --build -d

# Cek container yang berjalan
docker compose ps

# Lihat log realtime
docker compose logs -f php

# Masuk ke container PHP
docker compose exec php sh

# Hentikan semua
docker compose down

Tips Sehari-hari

# Jalankan artisan (Laravel) dari luar container
docker compose exec php php artisan migrate

# Import database
docker compose exec -T db mysql -u user -ppassword dbname < dump.sql

# Bersihkan semua (termasuk volume database)
docker compose down -v

Dengan setup ini, siapapun di tim tinggal clone repo + docker compose up --build dan langsung bisa development tanpa install apapun lagi.

0 Komentar

Komentar ditinjau dulu sebelum tampil.