System

Create a local laravel development with Docker

မင်္ဂလာပါ။
ကျွန်တော်ကတော့ Spiceworks Myanmar မှာ Backend Developer အနေနဲ့ တာဝန်ယူလုပ်ကိုင်နေတဲ့ သုတယာမိုး ဖြစ်ပါတယ်။ Docker မိတ်ဆက် အကြောင်းကိုတော့ မျှဝေပေးထားပြီးပြီမို့လို့ ဝင်ရောက်ဖတ်ရှုနိုင်ပါတယ်။ အခု ဘလော့ဂ်မှာတော့ Docker ကိုအသုံးပြုပြီး Laravel project အတွက် လိုအပ်တဲ့ Nginx web server, PHP application server နှင့် MySQL database စသော services တွေကိုအသုံးပြုပြီး development environment တည်ဆောက်ပုံကို ဝေမျှပေးသွားချင်ပါတယ်။

Project Structure
Laravel project structure ကတော့ အောက်ပါအတိုင်းဖြစ်ပါတယ်။

my-laravel-project/
├── docker/
│   ├── nginx/
│   │   └── Dockerfile
│   │   └── default.conf
│   ├── php/
│   │   └── Dockerfile
├── docker-compose.yml
├── .env
└── (other Laravel project files)

Dockerfile for PHP
PHP အတွက် Dockerfile ကို php/nginx/ directory မှာ create လုပ်ပေးပါ။

#choose php:8.3-fpm as the base image
FROM php:8.3-fpm

# Set working directory
WORKDIR /var/www

# Copy existing application directory contents
COPY . /var/www

# Install dependencies and required packages for the PHP application
RUN apt-get update && apt-get install -y \
    build-essential \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl \
    libonig-dev \
    libzip-dev \
    libgd-dev

# Clear cache and remove unnecessary packages and files to reduce the image size
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install PHP extensions and configure GD library for image processing in PHP applications
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-external-gd
RUN docker-php-ext-install gd

# Install Composer and run the composer install command to install the application dependencies and generate the autoloader file
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer install --no-scripts && composer dump-autoload -o

# Expose port 9000 and start php-fpm server to listen on port 9000 when the container starts running
EXPOSE 9000
CMD ["php-fpm"]

Dockerfile for Nginx
Nginx အတွက် Dockerfile ကို docker/nginx/ directory မှာ create လုပ်ပေးပါ။

# choose nginx:stable-perl as the base image
FROM nginx:stable-perl

# copy the default nginx configuration file to the container
COPY ./docker/nginx/default.conf /etc/nginx/conf.d/default.conf

# expose port 80 and start the nginx server to listen on port 80 when the container starts running
CMD ["nginx", "-g", "daemon off;"]

docker/nginx/ directory မှာ default.conf နာမည်ဖြင့် Nginx Configuration file တစ်ခု create လုပ်ပေးပါ။

# This is the default configuration file for Nginx
server {
    listen 80;
    listen [::]:80;
    server_name localhost;

    root /var/www/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index 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;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_hide_header X-Powered-By;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Docker Compose Configuration
Project ရဲ့ root directory မှာ docker-compose.yml file create လုပ်ပေးပါ။

services:
    web:
        container_name: docker-laravel-nginx
        build:
            context: .
            dockerfile: ./docker/nginx/Dockerfile
        image: nginx:perl
        depends_on:
            - app
        ports:
            - "8080:80"
        volumes:
            - ./:/var/www
            - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
        networks:
            - docker-laravel-network

    app:
        container_name: docker-laravel-app
        image: php:8.3-fpm
        build:
            context: .
            dockerfile: ./docker/php/Dockerfile
        ports:
            - "9000:9000"
        volumes:
            - ./:/var/www
        networks:
            - docker-laravel-network

    db:
        container_name: docker-laravel-db
        image: mysql:oracle
        ports:
            - "3308:3306"
        environment:
            MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
            MYSQL_DATABASE: ${DB_DATABASE}
            MYSQL_USER: ${DB_USERNAME}
            MYSQL_PASSWORD: ${DB_PASSWORD}
        volumes:
            - dbdata:/var/lib/mysql
        networks:
            - docker-laravel-network

    artisan:
        container_name: docker-laravel-artisan
        image: php:8.3-fpm
        build:
            context: .
            dockerfile: ./docker/php/Dockerfile
        volumes:
            - ./:/var/www
        entrypoint: ["php", "/var/www/artisan"]
        networks:
            - docker-laravel-network

volumes:
    dbdata:
        driver: local

networks:
    docker-laravel-network:
        driver: bridge

Environment Variables
ထို့နောက် .env file မှာ DB_HOST ဆိုတဲ့ environment variable မှာ database service ရဲ့ container name ကို အစားထိုးပေးပါ။

#docker-compose.yml
db:
  container_name: docker-laravel-db

#.env
DB_HOST=docker-laravel-db

Build and Run Your Containers
အခုဆိုရင် docker setup လုပ်ပြီးပြီဖြစ်တဲ့အတွက် အောက်ပါ command ကို အသုံးပြုကာ container build လုပ်ပါမယ်။

docker-compose up -d --build

ထို command ကတော့ composer-compose.yml မှာ ကြေညာထားတဲ့ services တွေကို build လုပ်ပြီး အလုပ်လုပ်စေမှာဖြစ်ပါတယ်။ Containers တွေကို အလုပ်လုပ်ပြီဆိုရင်တော့ laravel project ကို http://localhost:8080 မှာ တွေ့မြင်နိုင်မှာဖြစ်ပါတယ်။ အဆုံးထိဖတ်ရှုပေးတဲ့အတွက် ကျေးဇူးတင်ပါတယ် ခင်ဗျ။

Hello

Leave a Reply

Your email address will not be published. Required fields are marked *