کانتینرسازی (Containerize) سبکی از مجازی سازی است که یک اپلیکیشن و وابستگی های آن از جمله کتابخانه ها و محیط های زمان اجرا را در یک واحد به نام کانتینر کپسوله می کند. برای راه اندازی لاراول با داکر باید بدانید که کانتینرها بسیار قابل حمل هستند و تضمین می کنند که برنامه ها به طور مداوم در محیط های مختلف اجرا می شوند، از لپ تاپ توسعه دهنده تا سرور.
لاراول یک فریم ورک PHP قوی برای ساخت اپلیکیشن های وب است، در حالی که 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 را اجرا می کند.
سرویس "app" در فایل docker-compose
، ایمیج داکر اپلیکیشن لاراول را از Dockerfile
، که فایلهای پروژه و فایل docker compose
در آن قرار دارد، میسازد.
"image" نامی است که می خواهیم به ایمیج داکر بدهیم. "container_name
" نام کانتینری است که می خواهیم داشته باشیم، "/var/www"
دایرکتوری کاری را در کانتینر در حال اجرا تعریف می کند، "volumes" فایل های پروژه و تنظیمات را از سیستم ما به کانتینر منتقل می کند.
"networks" شبکه را برای کانتینر تعریف کردند.
"webserver" ایمیج آلپاین nginx را می گیرد و یک نام به کانتینر اختصاص می دهد. دانستن پورتهای "ports" مهم است، این مپینگ پورت پیشفرض nginx 80 به پورت لوکال هاست 8989 است.
"Volumes" فایلهای میزبان و پیکربندیهای nginx را در کانتینر nginx نصب میکنند. "networks" شبکه را برای کانتینر nginx تعریف می کنند.
"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
یک "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"]
یک دایرکتوری جدید "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; } }
فایل ها و دایرکتوری های زیر را ایجاد کنید:
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
مرحله نهایی ساخت ایمیج و اجرای آن است.
sudo docker-compose build sudo docker-compose up -d
حالا ما کانتینرهای php laravel nginx و mysql را آماده و در حال اجرا داریم و میتوانیم آن را با استفاده از Docker ps بررسی کنیم.
اکنون برنامه لاراول ما راه اندازی شده است و می توانیم از پورت 8989 همانطور که در فایل dokcer-compose خود تعریف کرده ایم به آن از طریق "http://localhost:8989
" دسترسی داشته باشیم.
در این مقاله، ما سفری را برای کانتینرسازی کردن پروژه لاراول با داکر آغاز کردیم، و PHP، Nginx و MySQL را در یک استک توسعه منسجم ترکیب کردیم. ما پیش نیازها را بررسی کردیم، فایلهای Docker Compose را ایجاد کردیم و سرویسها را پیکربندی کردیم تا به طور یکپارچه با هم کار کنند. با انجام این کار، بسیاری از مزایا، از جمله جداسازی، قابلیت حمل، مقیاسپذیری، و کنترل نسخه را بررسی کردیم، که همگی برای توسعه وب مدرن بسیار مهم هستند.
برای نگاهی عمیق به کل پروژه، از جمله پیکربندی Docker Compose و پایگاه کد لاراول، میتوانید از اینجا به ریپازیتوری GitHub دسترسی داشته باشید.
با خیال راحت پروژه را با نیازهای خاص خود هماهنگ و آزمایش کنید. امیدواریم این مقاله دانش و اعتماد به نفس لازم را برای شما فراهم کرده باشد تا بتوانید کانتینرسازی را به کار ببرید و تجربه توسعه لاراول خود را ارتقا دهید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.