راه اندزای لاراول با داکر - صفر تا صد

How to deploy Laravel with Docker

27 شهریور 1402
How to deploy Laravel with Docker

کانتینرسازی چیست؟

کانتینرسازی (Containerize) سبکی از مجازی سازی است که یک اپلیکیشن و وابستگی های آن از جمله کتابخانه ها و محیط های زمان اجرا را در یک واحد به نام کانتینر کپسوله می کند. برای راه اندازی لاراول با داکر باید بدانید که کانتینرها بسیار قابل حمل هستند و تضمین می کنند که برنامه ها به طور مداوم در محیط های مختلف اجرا می شوند، از لپ تاپ توسعه دهنده تا سرور.

چرا Laravel، MySQL و Nginx را کانتینرسازی کنیم؟

لاراول یک فریم ورک PHP قوی برای ساخت اپلیکیشن های وب است، در حالی که MySQL به عنوان یک پایگاه داده رابطه ای محبوب عمل می کند و Nginx یک وب سرور با کارایی بالا است. ترکیب این فناوری‌ها در یک پشته کانتینرسازی مزیت‌های زیادی مانند جداسازی، قابلیت حمل، عملکرد و مقیاس‌پذیری را ارائه می‌دهد. ما قصد داریم یک برنامه لاراول حاوی این کامپوننت ها را کانتینرسازی کنیم:

  • پروژه ای با فریم ورک لاراول
  • پایگاه داده MYSQL
  • وب سرور NGINX

مرحله ۱: ایجاد پروژه لاراول

یک پروژه لاراول جدید در هاست محلی خود ایجاد کنید یا پروژه پایه لاراول را از GitHub شبیه سازی کنید. برای ایجاد یک پروژه جدید این دستورات را در ترمینال خود اجرا کنید.

پیش نیازها: قبل از اجرای این دستور باید php8.1 یا بالاتر و مدیریت بسته PHP یعنی composer را نصب کرده باشید.

در اینجا "blog" نام پروژه ای است که می توانید آن را تغییر دهید.

composer create-project --prefer-dist laravel/laravel blog

یا برای کلون کردن یک پروژه از github می توانید از این دستور استفاده کنید:

git clone https://github.com/laravel/laravel.git blog

مرحله ۲: ساخت لاراول با داکر

سپس باید به دایرکتوری پروژه خود برویم و یک فایل جدید به نام "docker-compose.yml" ایجاد کنیم و این تنظیمات را در آن اضافه کنیم. این پیکربندی یک محیط چند کانتینرسازی شامل PHP laravel، mysql و nginx را اجرا می کند.

1- پیکربندی پروژه

سرویس "app" در فایل docker-compose، ایمیج داکر اپلیکیشن لاراول را از Dockerfile ، که فایل‌های پروژه و فایل docker compose در آن قرار دارد، می‌سازد.

"image" نامی است که می خواهیم به ایمیج داکر بدهیم. "container_name" نام کانتینری است که می خواهیم داشته باشیم، "/var/www" دایرکتوری کاری را در کانتینر در حال اجرا تعریف می کند، "volumes" فایل های پروژه و تنظیمات را از سیستم ما به کانتینر منتقل می کند.

"networks" شبکه را برای کانتینر تعریف کردند.

2- تنظیمات Nginx

"webserver" ایمیج آلپاین nginx را می گیرد و یک نام به کانتینر اختصاص می دهد. دانستن پورت‌های "ports" مهم است، این مپینگ پورت پیش‌فرض nginx 80 به پورت لوکال هاست 8989 است.

"Volumes" فایل‌های میزبان و پیکربندی‌های nginx را در کانتینر nginx نصب می‌کنند. "networks" شبکه را برای کانتینر nginx تعریف می کنند.

3- پیکربندی پایگاه داده MySQL

"db" ایمیج mysql را می گیرد و نام کانتینر آن را تعریف می کند. پورت ""3306 پورت پیش فرض mysql است. "environment" متغیرهای محیطی (گذرواژه نام کاربری) را برای mysql db مقداردهی می کند.

"volumes" هاست را با کانتینری برای ذخیره سازی دائمی داده ها پیاده سازی می کند.

نکته: هر سه سرویس باید در یک شبکه باشند تا بتوانند با یکدیگر ارتباط برقرار کنند.

 
version: '3'
services:
  
  #PHP
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: habib/php
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    volumes:
      - ./:/var/www
      - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
    networks:
      - app-network

  #Nginx
  webserver:
    image: nginx:alpine
    container_name: webserver
    restart: unless-stopped
    tty: true
    ports:
      - "8989:80"
      - "443:443"
    volumes:
      - ./:/var/www
      - ./nginx/:/etc/nginx/conf.d/
    networks:
      - app-network

  #MySQL
  db:
    image: mysql:5.7.22
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: password
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - dbdata:/var/lib/mysql/
      - ./mysql/my.cnf:/etc/mysql/my.cnf
    networks:
      - app-network

#Networks
networks:
  app-network:
    driver: bridge
#Volumes
volumes:
  dbdata:
    driver: local

مرحله 3: ایجاد Dockerfile

یک "Dockerfile" جدید با دستور زیر ایجاد کنید:

sudo nano Dockerfile

نام فایل باید "Dockerfile" بدون هیچ پسوندی باشد. این تنظیمات را در Dockerfile اضافه کنید.

"FROM" از php8.1-fpm به عنوان ایمیج پایه استفاده کنید.

"COPY" برای کپی کردن فایل‌های لازم در کانتینر است.

"WORKDIR" کاری که میکند این است که dir را با /var/www مقداردهی می کند.

"RUN" پکیج های لازم و composer را نصب می کند.

"EXPOSE" پورت را برای کار کردن در معرض نمایش قرار می دهد.

"CMD" را برای اجرای php-fpm تعریف می کند.

FROM php:8.1-fpm

# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/

# Set working directory
WORKDIR /var/www

# Install dependencies
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
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
#Mine

# Install extensions
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
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www

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

# Copy existing application directory permissions
COPY --chown=www:www . /var/www

# Change current user to www
USER www

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]

مرحله 4: راه اندازی Nginx

یک دایرکتوری جدید "nginx" ایجاد کنید و یک فایل جدید در آن "default.conf" برای تنظیمات nginx ایجاد کنید.

sudo mkdir nginx
cd ngnix
nano default.conf

تنظیمات nginx زیر را در "default.conf" اضافه کنید.

server {
    listen 80;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/public;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app: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;
    }
}

مرحله 5: تنظیمات PHP

فایل ها و دایرکتوری های زیر را ایجاد کنید:

php/local.ini

sudo mkdir php
cd php
nano local.ini

قطعه کد زیر را در "local.ini" اضافه کنید:

upload_max_filesize=40M
post_max_size=40M

در mysql/my.cnf داریم:

sudo mkdir mysql
cd mysql
nano my.cnf

قطعه کد زیر را در "my.cnf" اضافه کنید:

[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/general.log

مرحله 6: دیپلوی کردن پروژه

مرحله نهایی ساخت ایمیج و اجرای آن است.

sudo docker-compose build

sudo docker-compose up -d

حالا ما کانتینرهای php laravel nginx و mysql را آماده و در حال اجرا داریم و می‌توانیم آن را با استفاده از Docker ps بررسی کنیم.

کانتینر های لاراول، nginx، mysql در حال اجرا هستند.

اکنون برنامه لاراول ما راه اندازی شده است و می توانیم از پورت 8989 همانطور که در فایل dokcer-compose خود تعریف کرده­ ایم به آن از طریق "http://localhost:8989" دسترسی داشته باشیم.

نتیجه گیری

در این مقاله، ما سفری را برای کانتینرسازی کردن پروژه لاراول با داکر آغاز کردیم، و PHP، Nginx و MySQL را در یک استک توسعه منسجم ترکیب کردیم. ما پیش نیازها را بررسی کردیم، فایل‌های Docker Compose را ایجاد کردیم و سرویس‌ها را پیکربندی کردیم تا به طور یکپارچه با هم کار کنند. با انجام این کار، بسیاری از مزایا، از جمله جداسازی، قابلیت حمل، مقیاس‌پذیری، و کنترل نسخه را بررسی کردیم، که همگی برای توسعه وب مدرن بسیار مهم هستند.

برای نگاهی عمیق به کل پروژه، از جمله پیکربندی Docker Compose و پایگاه کد لاراول، می‌توانید از اینجا به ریپازیتوری GitHub دسترسی داشته باشید.

با خیال راحت پروژه را با نیازهای خاص خود هماهنگ و آزمایش کنید. امیدواریم این مقاله دانش و اعتماد به نفس لازم را برای شما فراهم کرده باشد تا بتوانید کانتینرسازی را به کار ببرید و تجربه توسعه لاراول خود را ارتقا دهید.

نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.