Skip to content

Deploy Laravel 10 + PHP 8.1 + MySQL + phpMyAdmin dengan Docker & Nginx

  • Caution

🚀 Panduan hands-on buat deploy Laravel 10 di server Linux Ubuntu 22.04 pakai Docker, lengkap dengan PHP-FPM, MySQL, phpMyAdmin, dan Nginx Reverse Proxy.

  • Laravel 10
  • PHP-FPM 8.1
  • MySQL 8
  • phpMyAdmin
  • Nginx (Reverse Proxy)

Terminal window
sudo apt-get update -y
sudo apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release

Tambahkan GPG key Docker & repo:

Terminal window
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update -y

Install Docker:

Terminal window
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
sudo docker run hello-world

🧰 Step 2 — Install docker-compose & Service Pendukung

Section titled “🧰 Step 2 — Install docker-compose & Service Pendukung”
Terminal window
sudo curl -L "https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose -v
sudo apt-get install nginx wget curl links nano unzip net-tools git -y

🛠️ Step 3 — Setup docker-compose.yml & Dockerfile

Section titled “🛠️ Step 3 — Setup docker-compose.yml & Dockerfile”

Clone repo:

Terminal window
git clone https://github.com/fadharpra/docker.git

Buat file docker-compose.yml:

version: "3.9"
services:
laravel:
image: php:8.1-fpm
container_name: laravel-demo
hostname: laravel-demo
restart: always
build:
context: .
dockerfile: Dockerfile
volumes:
- /var/www/apps-demo:/var/www/apps-demo
- ./config/apps/php.ini:/usr/local/etc/php/php.ini
- ./config/apps/conf.d:/usr/local/etc/php/conf.d
- ./config/apps/conf.d/zz-docker.conf:/usr/local/etc/php-fpm.d/zz-docker.conf
entrypoint: ["php-fpm"]
tty: true
ports:
- 9000:9000
networks:
net1:
ipv4_address: 10.10.0.10
networks:
net1:
name: Laravel-net
driver: bridge
ipam:
config:
- subnet: 10.10.0.0/24
gateway: 10.10.0.254

Buat file Dockerfile:

FROM php:8.1-fpm
RUN apt-get update && apt-get upgrade -y \
&& apt-get install -y net-tools libfreetype6-dev libjpeg62-turbo-dev libpng-dev libzip-dev libicu-dev g++ nano curl \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd mysqli pdo pdo_mysql iconv zip bcmath \
&& docker-php-ext-enable mysqli pdo pdo_mysql iconv zip bcmath
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN apt install software-properties-common -y && apt update -y && apt-get install -y libreoffice imagemagick ttf* libmagickwand-dev --no-install-recommends \
&& rm -rf /var/lib/apt/lists/* && pecl install imagick && docker-php-ext-enable imagick
RUN echo 'alias ll="ls -a"' >> ~/.bashrc
WORKDIR /var/www/apps01
EXPOSE 9002 9000
Terminal window
docker-compose build
docker-compose up -d
docker ps -a

🌐 Step 5 — Konfigurasi Nginx (di Host, bukan Container)

Section titled “🌐 Step 5 — Konfigurasi Nginx (di Host, bukan Container)”

Buat /etc/nginx/sites-available/laravel.conf:

server {
listen 80;
index index.php index.html;
error_log /var/log/nginx/laravel-error.log;
access_log /var/log/nginx/laravel-access.log;
root /var/www/apps-demo/public;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass localhost:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}

Aktifkan config & restart:

Terminal window
ln -s /etc/nginx/sites-available/laravel.conf /etc/nginx/sites-enabled/
systemctl restart nginx

Cek: http://[IP-ADDRESS]

🛢️ Step 6 — Tambah MySQL & phpMyAdmin ke docker-compose

Section titled “🛢️ Step 6 — Tambah MySQL & phpMyAdmin ke docker-compose”

Tambahkan ke docker-compose.yml:

database:
image: mysql:8.0
container_name: mysql-database
hostname: database
restart: always
command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8 --collation-server=utf8_general_ci
environment:
MYSQL_ROOT_PASSWORD: admin
MYSQL_USER: user
MYSQL_PASSWORD: user
MYSQL_ROOT_HOST: '%'
volumes:
- mysqldata:/var/lib/mysql
tty: true
ports:
- 3306:3306
networks:
net1:
ipv4_address: 10.10.0.2
phpmyadmin:
image: phpmyadmin
container_name: phpmyadmin
hostname: phpmyadmin
depends_on:
- database
restart: always
ports:
- 8090:80
environment:
PMA_HOST: database
MYSQL_ROOT_PASSWORD: admin
networks:
net1:
ipv4_address: 10.10.0.3
volumes:
mysqldata:

Update service:

Terminal window
docker-compose up -d

Cek phpMyAdmin: http://[IP-ADDRESS]:8090

  • Directoryconfig/
    • Directoryapps/
      • php.ini
      • Directoryconf.d/
        • docker-php-ext-bcmath.ini
        • docker-php-ext-gd.ini
        • docker-php-ext-mysqli.ini
        • docker-php-ext-pdo_mysql.ini
        • docker-php-ext-zip.ini
        • zz-docker.conf
  • Dockerfile
  • docker-compose.yml

🎉 Selesai! Sekarang lo punya stack Laravel + MySQL + phpMyAdmin yang running mulus pakai Docker Compose. Nginx juga udah siap serve request.