نحوه نصب لاراول، Nginx و MySQL به کمک Docker Compose در اوبونتو ۲۰.۰۴

نحوه نصب لاراول، Nginx و MySQL باDocker Compose در اوبونتو
Avatar
نویسنده: دریا آزادخواه
سه‌شنبه 23 فروردین 1401
مطالعه: ۲۴ دقیقه ۰ نظر ۲۱۰۴ بازدید

در چند سال اخیر، داکر به یک راه‌حل بسیار کاربردی و مفید برای توسعه برنامه‌ها تبدیل شده است؛ زیرا نحوه اجرا و استقرار برنامه‌ها را در کانتینرهای موقت ساده می‌کند. هنگامی که از برنامه‌های LEMP استفاده می‌کنید؛ Docker می‌تواند به طور قابل‌توجهی فرایند نصب و راه‌اندازی را ساده‌تر کند. LEMP به ترتیب شامل لینوکس، انجینیکس، MySQL و PHP می‌باشد.

Docker Compose با اجازه‌دادن به دولوپرها برای تعریف زیرساخت‌هایی مانند: خدمات برنامه، شبکه‌ها و volume در یک فایل، فرایند توسعه را ساده‌تر کرده است. در حقیقت Docker Compose، یک جایگزین خوب برای اجرای دستورات docker container create چندگانه و docker container run ارائه می‌دهد.

در این مقاله از آموزش اوبونتو به آموزش نحوه نصب لاراول، Nginx و MySQL به وسیله Docker compose در اوبونتو 20.04 می‌پردازیم و پیکربندی را در یک فایل Docker-Compose به همراه فایل‌های پیکربندی برای فریم‌ورک لاراول، MySQL و Nginx تعریف می‌کنیم. با ما همراه باشید.

خرید سرویس لینوکسی با سیستم داکر (Docker) از پارس پک

‌توانید از این مقاله برای مدیریت سرورهای لینوکس خود استفاده کنید و اگر قصد خرید هر یک از سرویس‌های لینوکسی پارس پک را دارید، می‌توانید با کارشناسان فروش ما در ارتباط باشید. همچنین، شما می‌توانید برای اطلاع از تعرفه‌ها و هزینه‌ها به لینک‌های زیر مراجعه کنید.

مراحل نصب لاراول، Nginx و MySQL به‌وسیله Docker Compose

مرحله اول: دانلود لاراول و نصب Dependencies

اولین کاری که باید انجام دهید این است که آخرین نسخه لاراول را دانلود کنید و متعلقات(dependencies) پروژه از جمله: Composer و پکیج‌منیجر را در لایه اپلیکیشنِ شبکه برای PHP نصب نمایید. در اینجا متعلقات را با داکر نصب می‌کنیم تا نیازی به نصب Composer به صورت گلوبال نداشته باشیم.

نصب لاراول در اوبونتو
دانلود لاراول و نصب Dependencies

ابتدا بررسی کنید که در دایرکتوری هوم خود هستید و آخرین نسخه لاراول را در دایرکتوریِ laravel-app کلون(داپلیکیت) کنید:

$ cd ~
$ git clone https://github.com/laravel/laravel.git laravel-app

سپس به دایرکتوری laravel-app بروید:

$ cd ~/laravel-app

در مرحله بعد، از ایمیجِ داکر composer برای نصب دایرکتوری‌هایی که برای پروژه لاراول خود نیاز دارید؛ استفاده کنید. از هزینه‌های بالا برای نصب Composer گلوبال خودداری نمایید:

$ docker run --rm -v $(pwd):/app composer install

استفاده از فلگ‌های v- و rm– به همراه docker run، یک کانتینر Ephemeral ایجاد می‌کند که قبل از حذف، به دایرکتوری فعلی شما متصل می‌شود. با این کار محتویات دایرکتوری

~/laravel-app

در کانتینر کپی خواهد شد. همچنین از کپی شدن vendor فولدرِ Composer (داخل کانتینر) در دایرکتوری فعلی شما مطمئن می‌شود.

در مرحله آخر Permission یا دسترسی را در دایرکتوری project که متعلق به کاربر non-root شماست؛ تنظیم کنید.

$ sudo chown -R sammy:sammy ~/laravel-app

انجام این کار زمانی مهم است که شما Dockerfile را برای image اپلیکیشن خود در مرحله 4 می‌نویسید. زیرا به شما این امکان را می‌دهد که با کد اپلیکیشن خود کار کنید و فرایندهایی را در کانتینر خود به‌عنوان یک کاربر non-root اجرا نمایید.

با قرار دادن کد اپلیکیشن، می‌توانید سرویس‌های خود را با Docker Compose تعریف کنید.

مرحله دوم: ایجاد فایل Docker Compose

ایجاد application با Docker Compose، فرایند راه‌اندازی و نسخه‌سازی یا همان versioning زیرساخت‌های شما را ساده‌تر می‌کند. برای راه‌اندازی برنامه لاراول خود، یک فایل docker-compose می‌نویسید که وب سرور، دیتابیس و سرویس‌های اپلیکیشن شما را تعریف می‌کند.

 نصب داکر کامپوز
آموزش ایجاد داکر کامپوز

ابتدا فایل را باز کنید:

$ nano ~/laravel-app/docker-compose.yml

در فایل docker-compose سه سرویس app، webserver و db را تعریف کنید. کد زیر را به فایل اضافه کنید. سپس MYSQL_ROOT_PASSWORD را با رمز عبور قوی انتخابی خود جایگزین کنید. این متغیر به‌عنوان یک enviroment variable تحت سرویس db تعریف شده است.

version: '3'
services:

#PHP Service
app:
build:
context: .
dockerfile: Dockerfile
image: digitalocean.com/php
container_name: app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www
networks:
- app-network

#Nginx Service
webserver:
image: nginx:alpine
container_name: webserver
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
networks:
- app-network

#MySQL Service
db:
image: mysql:5.7.22
container_name: db
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: laravel
MYSQL_ROOT_PASSWORD: MYSQL_ROOT_PASSWORD
SERVICE_TAGS: dev
SERVICE_NAME: mysql
networks:
- app-network

#Docker Networks
networks:
app-network:
driver: bridge

سرویس‌های تعریف‌شده شامل:

  • App : این سرویس شامل برنامه لاراول است و یک custom Docker image به نام digitalocean.com/php را اجرا می‌کند و در مرحله 4 آن را تعریف خواهید کرد. همچنین working_dir را در کانتینر بر روی /var/www تنظیم می‌کند.
  • Webserver : این سرویس ایمیجِ nginx:alpine را از داکر pull، و سپس پورت‌های 80 و 443 را expose می‌کند.
  • Db : این سرویس ایمیج mysql:5.7.22 را از داکر pull گرفته و چند متغیر محیطی مانند دیتابیسی به نام laravel برای اپلیکیشن شما و رمز عبور روت را برای آن تعریف می‌کند. شما می‌توانید هر نامی را برای دیتابیس خود انتخاب کنید. همچنین باید your_mysql_root_password را با پسورد قوی خود جایگزین نمایید. این سرویس همچنین پورت 3306 بر هاست را به پورت 3306 بر روی کانتینر می‌نگارد.

هر ویژگی container_name یک نام را برای کانتینر تعریف می‌کند که با نام سرویس مطابقت دارد. اگر این ویژگی را تعریف نکنید؛ داکر با ترکیب نام یک فرد مشهور تاریخی و یک کلمه تصادفی همراه یک خط جدا کننده؛ نامی به هر کانتینر اختصاص می‌دهد.

برای تسهیل ارتباط بین کانتینرها، سرویس‌ها به یک پل شبکه یا بریج به نام app-network متصل می‌شوند. در حقیقت یک بریج از یک software bridge استفاده می‌کند که به کانتینرهای متصل به آن اجازه می‌دهد تا با یکدیگر ارتباط برقرار کنند.

درایور Bridge به طور خودکار قوانینی را در ماشین‌ هاست نصب می‌کند تا کانتینرها در bridge شبکه‌های مختلف نتوانند مستقیماً با یکدیگر ارتباط برقرار کنند. این کار باعث ایجاد سطح امنیتی بالاتری برای برنامه‌ها می‌شود. همچنین تضمین می‌کند که فقط سرویس‌های مرتبط بتوانند با یکدیگر ارتباط برقرار کنند.

از طرفی می‌توانید شبکه‌ها و سرویس‌های متعددی را تعریف کنید که به فانکشن‌های مرتبط متصل می‌شوند. برای مثال، سرویس‌های اپلیکیشن فرانت‌اند می‌توانند از یک شبکه frontend و سرویس‌های بک‌اند می‌توانند از یک شبکه backend استفاده کنند.

در مرحله بعد، به آموزش نحوه اضافه‌کردن volume‌ و Bind Mountها به سرویس‌های تعریف شده برای حفظ دیتای برنامه می‌پردازیم.

مرحله سوم: Persisting Data

Docker دارای ویژگی‌های قدرتمند و مناسب برای حفظ داده‌ها (Persisting Data) است. در برنامه خود، از ولوم‌ها و Bind Mount برای تداوم دیتابیس‌ها، فایل‌های اپلیکیشن و پیکربندی استفاده کنید. volume‌ها انعطاف‌پذیری را برای بک‌آپ و ماندگاری بالاتری از چرخه حیات یک کانتینر ارائه می‌دهند. درحالی‌که Bind Mountها تغییرات کد را در طول توسعه آسان‌تر می‌کنند و در کانتینرها تغییرات هاست‌فایل‌ها یا دایرکتوری‌ها را فورا در دسترس قرار می‌دهند.

استفاده از Docker Compose در اوبونتو
آموزش استفاده از داکر کامپوز در اوبونتو

نکته:

با استفاده از Bind Mount، امکان تغییرِ هاست فایل سیستم را ممکن می‌سازید. این امکان از طریق فرایندهای در حال اجرا در یک کانتینر مانند: ایجاد تغییر، حذف فایل‌ها یا دایرکتوری‌های مهم سیستم مهیا می‌شود. در حقیقت Bind Mount یک قابلیت قدرتمند با پیامدهای امنیتی است و می‌تواند بر فرایندهای non-Docker روی‌هاست تأثیر بگذارد. به همین دلیل باید از این قابلیت با احتیاط استفاده کنید.

در فایل docker-compose، ولومی به نام dbdata را در زیر سرویس db تعریف کنید تا دیتابیس MySQL حفظ شود.

...
#MySQL Service
db:
...
volumes:
- dbdata: /var/lib/mysql
networks:
- app-network
...
Volume‌ نام‌گذاری شده dbdata محتویات فولدر
/var/lib/mysql

در کانتینر را حفظ می‌کند. این کار به شما امکان می‌دهد بدون ازدست‌دادن داده‌ها، سرویس db را متوقف و ریستارت کنید.

در پایین فایل، تعریف ولوم dbdata را به‌صورت زیر اضافه کنید:

~/laravel-app/docker-compose.yml

...
#Volumes
volumes:
dbdata:
driver: local

با این تعریف، می‌توانید از این volume‌ در تمامی سرویس‌ها استفاده کنید. سپس برای فایل‌های پیکربندی MySQL که در مرحله 7 ایجاد می‌کنید؛ یک Bind Mount به سرویس db اضافه کنید.

...
#MySQL Service
db:
...
volumes:
- dbdata:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/my.cnf
…

این bind mount، ~/laravel-app/mysql/my.cnf را به /etc/mysql/my.cnf در کانتینر متصل (bind) می‌کند.

در مرحله بعد، Bind Mount را به سرویس webserver اضافه کنید. انجام این کار دو کاربرد دارد؛ یکی برای کد برنامه و دیگری برای تعریف پیکربندی Nginx که در مرحله 6 ایجاد خواهید کرد:

#Nginx Service
webserver:
...
volumes:
- ./:/var/www
- ./nginx/conf.d/:/etc/nginx/conf.d/
networks:
- app-network

اولین Bind Mount کد برنامه در دایرکتوری ~/laravel-app را به دایرکتوری /var/www داخل کانتینر متصل می‌کند. فایل پیکربندی که به ~/laravel-app/nginx/conf.d/ اضافه می‌کنید نیز در /etc/nginx/conf.d/ در کانتینر نصب می‌شود.

این به شما امکان می‌دهد که محتویات دایرکتوری پیکربندی را در صورت نیاز اضافه کنید یا تغییر دهید. در نهایت، Bind Mount زیر را برای کد برنامه و فایل‌های پیکربندی به سرویس برنامه اضافه کنید:

#PHP Service
app:
...
volumes:
- ./:/var/www
- ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
networks:
- app-network

app سرویس برنامه bind-mounting در فولدر ~/laravel-app قرار دارد. کد برنامه هم در فولدر /var/www داخل کانتینر است. این کار روند توسعه را سرعت می‌بخشد؛ زیرا هر تغییری که در دایرکتوری اپلیکیشن لوکال ایجاد شود؛ فوراً در داخل کانتینر منعکس می‌شود.

همچنین با انجام این کار فایل پیکربندی PHP خود، ~/laravel-app/php/local.ini را به /usr/local/etc/php/conf.d/local.ini در داخل کانتینر متصل می‌کنید. توجه داشته باشید که فایل پیکربندی لوکال PHP را در مرحله 5 ایجاد خواهید کرد.

اکنون فایل docker-compose شما به‌صورت زیر خواهد بود:

version: '3'
services:

#PHP Service
app:
build:
context: .
dockerfile: Dockerfile
image: digitalocean.com/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 Service
webserver:
image: nginx:alpine
container_name: webserver
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www
- ./nginx/conf.d/:/etc/nginx/conf.d/
networks:
- app-network

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

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

فایل را ذخیره کنید و پس از اتمام تغییرات از ادیتور خود خارج شوید.

اکنون با نوشتن فایل docker-compose، می‌توانید یک image سفارشی‌سازی‌شده(customized) را برای برنامه خود ایجاد کنید.

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

داکر به شما اجازه می‌دهد محیط داخل کانتینرهای جداگانه را با یک Dockerfile مشخص کنید. یک Dockerfile شما را قادر می‌سازد تا imageهای شخصی‌سازی‌شده ایجاد کنید. می‌توانید از آنها برای نصب نرم‌افزارهای موردنیاز برنامه و تنظیمات پیکربندی مورد نظر استفاده کنید. همچنین می‌توانید ایمیج‌های سفارشی‌شده را در Docker Hub یا هر رجیستری خصوصی push‌ کنید.

ایجاد dockerfile در اوبونتو
آموزش ایجاد dockerfile در اوبونتو

Dockerfile شما در دایرکتوری ~/laravel-app شما قرار خواهد گرفت. اکنون فایل زیر را ایجاد کنید:

$ nano ~/laravel-app/Dockerfile

این Dockerfile ایمیج پایه را تنظیم، command و instruction لازم برای ساخت ایمیجِ برنامه لاراول را مشخص می‌کند. اکنون کد زیر را به فایل اضافه کنید:

FROM php:7.4-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 \
libzip-dev

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
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"]

ابتدا Dockerfile، یک تصویر در بالای داکر ایمیج php:7.4-fpm ایجاد می‌کند. این یک تصویر مبتنی بر دبیان است که دارای PHP FastCGI بوده و بر روی PHP-FPM نصب و اجرا شده است.

این فایل همچنین بسته‌های پیش‌نیاز لاراول مانند mcrypt، pdo_mysql، mbstring و imagick را با composer نصب می‌کند. دستورالعمل RUN دستوراتی را برای آپدیت، نصب و پیکربندی تنظیمات داخل کانتینر مانند ایجاد یک کاربر و گروه اختصاصی به نام www، مشخص می‌کند.

دستورالعمل WORKDIR دایرکتوری /var/www را به‌عنوان working directory برای برنامه تعیین می‌کند. ایجاد یک کاربر و گروه اختصاصی با دسترسی محدود، آسیب‌پذیری ذاتی را هنگام اجرای کانتینرهای Docker که به طور پیش‌فرض به‌عنوان روت اجرا می‌شوند، کاهش می‌دهد.

به‌جای اجرای این کانتینر به‌عنوان root، یوزر www را ایجاد کرده‌اید که به کمک دستورالعمل COPY که با فلگ chown– برای کپی‌کردن مجوزهای پوشه برنامه استفاده می‌کند، به فولدر /var/www دسترسی read/write دارد.

در نهایت، دستور EXPOSE یک پورت در کانتینر 9000، را برای سرور php-fpm آشکار می‌کند. CMD دستوری را مشخص می‌کند که پس از ایجاد کانتینر باید اجرا شود. در اینجا، CMD مشخص کننده “php-fpm” است که سرور را راه‌اندازی می‌کند.

فایل را ذخیره کنید و پس از اتمام تغییرات از ادیتور خود خارج شوید. اکنون می‌توانید به تعریف پیکربندی PHP خود ادامه دهید.

مرحله پنجم: پیکربندی PHP

اکنون که زیرساخت خود را در فایل Docker-Compose تعریف کرده‌اید، می‌توانید سرویس PHP را طوری پیکربندی کنید که به‌عنوان یک پردازنده PHP برای درخواست‌های دریافتی از Nginx عمل کند.

آموزش php در لینوکس
آموزش php در لینوکس اوبونتو

برای پیکربندی PHP، فایل local.ini را در داخل پوشه php ایجاد کنید. این فایلی است که در مرحله 2 به /usr/local/etc/php/conf.d/local.ini در داخل کانتینر bin-mount کردید. ایجاد این فایل برای شما این امکان را فراهم می‌کند تا فایل پیش‌فرض php.ini را لغو کنید.

ابتدا دایرکتوری php را ایجاد کنید.

$ mkdir ~/laravel-app/php

سپس فایل local.ini را باز کنید.

$ nano ~/laravel-app/php/local.ini

برای نشان‌دادن نحوه پیکربندی PHP، کد زیر را برای تنظیم محدودیت‌های اندازه برای فایل‌های آپلود شده اضافه کنید.

upload_max_filesize=40M
post_max_size=40M

دستورالعمل‌های upload_max_filesize و post_max_size حداکثر اندازه مجاز را برای فایل‌های آپلودشده تعیین می‌کنند و نشان می‌دهند که چگونه می‌توانید تنظیمات php.ini را از فایل local.ini خود تنظیم کنید. هر پیکربندی خاص PHP را که می‌خواهید لغو کنید در فایل local.ini قرار دهید.

فایل را ذخیره کنید و از ادیتور خود خارج شوید. با قراردادن فایل PHP local.ini، اکنون می‌توانید به پیکربندی Nginx بپردازید.

مرحله ششم: پیکربندی Nginx

با پیکربندی سرویس PHP، می‌توانید سرویس Nginx را تغییر دهید تا از PHP-FPM به‌عنوان سرور FastCGI برای ارائه محتوای داینامیک استفاده کند. سرور FastCGI بر اساس یک پروتکل باینری برای ارتباط برنامه‌های تعاملی با یک وب سرور است.

نصب nginx روی ubuntu
آموزش نصب و کانفیگ nginx روی ubuntu

برای پیکربندی Nginx، باید یک فایل app.conf با پیکربندی سرویس در فولدر ~/laravel-app/nginx/conf.d/ ایجاد کنید.

برای انجام این کار ابتدا دایرکتوری nginx/conf.d/ را ایجاد کنید:

$ mkdir -p ~/laravel-app/nginx/conf.d

سپس فایل پیکربندی app.conf را ایجاد کنید:

nano ~/laravel-app/nginx/conf.d/app.conf

کد زیر را به فایل اضافه کنید تا پیکربندی Nginx را مشخص کنید:

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;
}
}

بلوک سرور، پیکربندی وب سرور Nginx را با دستورالعمل‌های زیر تعریف می‌کند:

  • Listen: این دستورالعمل پورتی را تعریف می‌کند که سرور از طریق آن درخواست‌های دریافتی را listening می‌کند.
  • error_log و access_log: این دستورالعمل‌ها فایل‌ها را برای نوشتن لاگ‌ها تعریف می‌کنند.
  • Root: این دستورالعمل مسیر فولدر روت را مشخص می‌کند و مسیر کاملی را برای هر فایل درخواستی در سیستم فایل لوکال تشکیل می‌دهد.

در بلوک موقعیت php، دستورالعمل fastcgi_pass مشخص می‌کند که سرویس app در حال listen کردن به سوکت TCP در پورت 9000 است. این باعث می‌شود که سرور PHP-FPM به‌جای سوکت Unix، از طریق شبکه listen کند.

اگرچه یک سوکت Unix نسبت به سوکت TCP از نظر سرعت برتری دارد، اما پروتکل شبکه ندارد؛ بنابراین از stack شبکه می‌گذرد. برای مواردی که هاست‌ها بر روی یک ماشین قرار دارند، استفاده از سوکت یونیکس ممکن است منطقی باشد. اما در مواردی که یک سرویس را در هاست‌های مختلف اجرا می‌کنید، سوکت TCP این امکان را برای شما فراهم می‌کند تا به سرویس‌های توزیع شده متصل شوید.

ازآنجایی‌که کانتینر app بر روی هاستی متفاوت از کانتینر webserver شما اجرا می‌شود، سوکت TCP برای پیکربندی شما مناسب‌تر است. در نهایت فایل را ذخیره کنید و پس از اتمام تغییرات از ادیتور خود خارج شوید.

به لطف Bind Mount که در مرحله 2 ایجاد کردید، هر تغییری که در پوشه nginx/conf.d/ ایجاد می‌کنید؛ مستقیماً در داخل کانتینر وب سرور منعکس می‌شود.

در مرحله بعد به بررسی تنظیمات MySQL و نحوه پیکربندی آن می‌پردازیم.

مرحله هفتم: پیکربندی MySQL

با پیکربندی PHP و Nginx، می‌توانید MySQL را فعال کنید تا به‌عنوان دیتابیس برنامه شما عمل کند. برای پیکربندی MySQL، فایل my.cnf را در پوشه mysql ایجاد کنید. این فایلی است که در مرحله 2 به /etc/mysql/my.cnf در داخل کانتینر bind mount کرده‌اید. این Bind Mount به شما امکان می‌دهد تا در صورت لزوم تنظیمات my.cnf را لغو (override) کنید.

پیکربندی MySQL در اوبونتو
آموزش پیکربندی MySQL در اوبونتو

برای نشان‌دادن نحوه کار آن، تنظیماتی را به فایل my.cnf اضافه کنید که گزارش لاگ کوئری را فعال و فایل لاگ را مشخص می‌کند.

ابتدا دایرکتوری mysql را ایجاد کنید.

$ mkdir ~/laravel-app/mysql

سپس فایل my.cnf را بسازید.

$ nano ~/laravel-app/mysql/my.cnf

در فایل، کد زیر را اضافه کنید تا Log Query فعال شود و محل فایل log را تنظیم کنید.

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

این فایل my.cnf لاگ‌ها را فعال می‌کند و تنظیمات general_log را 1 تعریف می‌کند تا جنرال لاگ‌ها مجاز باشند. تنظیمات general_log_file مشخص می‌کند که لاگ‌ها در کجا ذخیره شوند.

در نهایت فایل را ذخیره کنید و از ادیتور خود خارج شوید.

مرحله هشتم: اصلاح تنظیمات اینورتر و اجرای کانتینرها

اکنون که تمام سرویس‌های خود را در فایل docker-compose تعریف و فایل‌های پیکربندی این سرویس را ایجاد کرده‌اید، می‌توانید کانتینرها را راه‌اندازی کنید. به‌عنوان آخرین مرحله، شما یک کپی از فایل env.example. (که لاراول به طور پیش‌فرض شامل آن است) ایجاد کنید و نام آن را env. بگذارید.

اجرای کانتینرها در اوبونتو
تنظیمات فایل docker-compose برای راه اندازی کانتینرها

این فایلی است که انتظار می‌رود؛ لاراول محیط خود را در آن تعریف کند.

$ cp .env.example .env

اکنون می‌توانید فایل env. را در کانتینر app تغییر دهید تا جزئیات خاصی در مورد تنظیمات در آن لحاظ شود.

فایل را با استفاده از nano یا ویرایشگر متن (Text Editor) دلخواه خود باز کنید.

$ nano .env

اکنون بلوکی که DB_CONNECTION را مشخص می‌کند، پیدا کنید. آن را به‌روزرسانی نمایید تا مشخصات تنظیمات شما را منعکس کند. فیلدهای زیر را اصلاح کنید:

  • DB_HOST کانتینر دیتابیس db شما خواهد بود.
  • DB_DATABASE دیتابیس Laravel خواهد بود.
  • DB_USERNAME نام کاربری است که برای پایگاه‌داده خود استفاده خواهید کرد. در این صورت از laraveluser استفاده خواهید کرد.
  • DB_PASSWORD پسورد امنی است که می‌خواهید برای این حساب کاربری استفاده کنید.

در دایرکتوری /var/www/.env:

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=your_laravel_db_password

در نهایت تغییرات خود را ذخیره کنید و از ادیتور خارج شوید.

درحالی‌که همه سرویس‌های شما در فایل docker-compose تعریف شده‌اند، از دستور واحد زیر برای راه‌اندازی همه کانتینرها، ولوم‌ها، راه‌اندازی و اتصال شبکه‌ها استفاده کنید:

$ docker-compose up -d

وقتی برای اولین‌بار docker-compose up را اجرا کنید، همه ایمیج‌های Docker دانلود می‌شوند و شاید کمی طول بکشد. هنگامی که imageها دانلود و در ماشین لوکال شما ذخیره شد، Compose کانتینرهای شما را ایجاد می‌کند. سپس فلگ d- فرایند را شبیه‌سازی و کانتینرهای شما را در پس‌زمینه اجرا می‌کند.

پس از تکمیل فرایند، از دستور زیر برای لیست کردن تمام کانتینرهای در حال اجرا استفاده کنید:

$ docker ps

اکنون باید خروجی زیر را با جزئیات مربوط به کانتینرهای app، وب سرور webserver و کانتینر db خود مشاهده کنید:

CONTAINER ID NAMES IMAGE STATUS PORTS
c31b7b3251e0 db mysql:5.7.22 Up 2 seconds 0.0.0.0:3306->3306/tcp
ed5a69704580 app digitalocean.com/php Up 2 seconds 9000/tcp
5ce4ee31d7c0 webserver nginx:alpine Up 2 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp

در این خروجی CONTAINER ID یک شناسه منحصربه‌فرد برای هر کانتینر است. درحالی‌که NAMES نام سرویس مرتبط با هر یک را لیست می‌کند. برای دسترسی به کانتینرها می‌توانید از هر دوی این شناسه‌ها استفاده کنید. IMAGE نام ایمیج را برای هر کانتینر تعیین می‌کند،

درحالی‌که STATUS اطلاعاتی در مورد وضعیت کانتینر ارائه می‌کند:

  • در حال اجرا (running)
  • راه‌اندازی مجدد (restarting)
  • توقف (stopped)

اکنون از docker-compose exec برای تنظیم application key برای برنامه لاراول استفاده خواهید کرد. دستور docker-compose exec به شما اجازه می‌دهد تا دستورات خاصی را در کانتینرها اجرا کنید.

دستور زیر یک کلید را ایجاد و آن را در فایل env. شما کپی می‌کند. با این دستور مطمئن می‌شوید که سشن‌های کاربر و داده‌های رمزگذاری شده شما امن می‌مانند:

$ docker-compose exec app php artisan key:generate

اکنون تنظیمات enviroment‌ مورد نیاز برای اجرای برنامه خود را دارید. برای cache این تنظیمات در یک فایل (به منظور افزایش سرعت بارگذاری برنامه شما)، اجرا کنید:

$ docker-compose exec app php artisan config:cache

تنظیمات پیکربندی شما در /var/www/bootstrap/cache/config.php در کانتینر لود می‌شود.

به‌عنوان آخرین مرحله، آدرس http://your_server_ip را در مرورگر باز کنید. صفحه اصلی زیر را برای برنامه لاراول خود خواهید دید:

نصب لاراول در اوبونتو
صفحه اصلی برنامه لاراول

با اجرا شدن کانتینرها و تنظیم اطلاعات پیکربندی، می‌توانید به پیکربندی اطلاعات کاربری خود برای دیتابیس laravel در کانتینر db بروید.

مرحله نهم: ایجاد یک کاربر برای MySQL

نصب پیش‌فرض MySQL فقط حساب کاربری root را ایجاد می‌کند که دارای دسترسی نامحدود در سرور دیتابیس است. به‌طورکلی، بهتر است هنگام تعامل با پایگاه‌داده از استفاده حساب کاربری root Administrative خودداری کنید. به‌جای آن یک یوزر دیتابیس اختصاصی برای دیتابیس لاراول برنامه خود ایجاد کنید.

ایجاد کاربر برای MySQL
آموزش ساخت یوزر برای MySQL

برای ایجاد یک کاربر جدید، یک bash shell تعاملی را روی کانتینر db با docker-compose exec اجرا کنید:

$ docker-compose exec db bash

در داخل کانتینر، وارد حساب مدیریت روت MySQL شوید:

mysql -u root -p

در حین نصب در فایل docker-compose، رمز عبوری که برای حساب MySQL root تنظیم کرده‌اید از شما خواسته می‌شود.

با بررسی دیتابیس laravel (که در فایل docker-compose تعریف کرده‌اید)، کار خود را شروع کنید. دستور show databases را برای بررسی پایگاه‌داده‌های موجود اجرا کنید:

mysql> show databases;

سپس دیتابیس Laravel را در خروجی مشاهده خواهید کرد:

+--------------------+
| Database |
+--------------------+
| information_schema |
| laravel |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)

در مرحله بعد، حساب کاربری برای دسترسی به این پایگاه‌داده ایجاد کنید. نام کاربری شما laraveluser خواهد بود، اگرچه در صورت تمایل می‌توانید آن را با نام دیگری جایگزین کنید. فقط مطمئن شوید که نام کاربری و رمز عبور شما با جزئیاتی که در فایل env. خود در مرحله قبل تنظیم کرده‌اید مطابقت داشته باشد.

mysql> GRANT ALL ON laravel.* TO 'laraveluser'@'%' IDENTIFIED BY 'your_laravel_db_password';

برای اطلاع‌رسانی تغییرات به MySQL server، از کد FLUSH PRIVILEGES استفاده کنید:

mysql> FLUSH PRIVILEGES;

از MySQL خارج شوید.

EXIT;

در نهایت از کانتینر خارج شوید:

exit

تا اینجا برای اپلیکیشن لاراولی خود دیتابیسی نصب کردید. سپس برای آن یک یوزر اکانت(حساب کاربری) ست شد و الان آماده انتقال دیتا و کارهایتان با تینکر کنسول(Tinker console) می‌باشید.

مرحله دهم: انتقال داده‌ها و کار با کنسول Tinker

با اجرای اپلیکیشن خود، می‌توانید داده‌ها را انتقال دهید و با دستور tinker آن را آزمایش کنید. اینکار توسط کنسول PsySH با پریلود‌شده Laravel شروع می‌شود. PsySH یک کنسول توسعه‌دهنده ران-تایم و اینترکتیو-Debugger برای PHP است.

دستور tinker در لاراول
آموزش دستور Tinker در لاراول

Tinker یک REPL مخصوص لاراول است. دستور tinker به شما این امکان را می‌دهد که با برنامه لاراول خود با استفاده از Command line در Interactive shell تعامل داشته باشید.

ابتدا، اتصال به MySQL را با اجرای دستور لاراول artisan migrate آزمایش کنید که یک جدول migrations در دیتابیس داخل کانتینر ایجاد می‌کند:

$ docker-compose exec app php artisan migrate

در نهایت خروجی زیر را مشاهده خواهید کرد.

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table

هنگامی که Migration کامل شد، می‌توانید یک کوئری را اجرا کنید. با استفاده از دستور tinker بررسی کنید که آیا به‌درستی به پایگاه‌داده متصل شده‌اید یا خیر:

$ docker-compose exec app php artisan tinker

اتصال MySQL را با دریافت داده‌هایی که به‌تازگی منتقل کرده‌اید، آزمایش کنید:

\DB::table('migrations')->get();

سپس خروجی زیر را دریافت خواهید کرد.

=> Illuminate\Support\Collection {#2856
all: [
{#2862
+"id": 1,
+"migration": "2014_10_12_000000_create_users_table",
+"batch": 1,
},
{#2865
+"id": 2,
+"migration": "2014_10_12_100000_create_password_resets_table",
+"batch": 1,
},
],
}

شما می‌توانید از tinker برای تعامل با دیتابیس‌ها، تست سرویس‌ها و مدل‌ها استفاده کنید. با نصب برنامه لاراول خود، برای توسعه، آزمایش و کسب تجربه بیشتر آماده هستید.

نتیجه‌گیری

در این مقاله از آموزش لینوکس به آموزش نصب لاراول، Nginx و MySQL به وسیله Docker Compose در اوبونتو ۲۰.۰۴ پرداختیم و سعی کردیم به طور کامل و مرحله‌به‌مرحله آن را به شما آموزش دهیم. همان‌طور که مشاهده کردید کلید اصلی این نصب Docker Compose است که به شما امکان می‌دهد با یک دستور، گروهی از کانتینرهای Docker را که در یک فایل تعریف شده‌اند ایجاد کنید.

سوالات متداول

1. دستور docker-compose up چیست؟

دستور docker compose up خروجی هر کانتینر را جمع‌آوری می‌کند (مطابق با docker compose logs –follow does). هنگامی که command اگزیت می‌شود، تمام کانتینرها متوقف خواهند شد. اجرای docker compose up –detach کانتینرها را در بک‌گراند راه‌اندازی می‌کند و آنها را در حال اجرا می‌گذارد.

2. چگونه یک فایل yml. را باز کنم؟

برای اجرا و باز کردن فایل های yml. باید Docker Compose را نصب کنید. پس از نصب، به yml. در docker-compose خود بروید. سپس docker-compose up را برای ایجاد و شروع خدمات در docker-compose اجرا کنید.

3. داکر کامپوز (Docker Compose) چیست؟

Docker Compose ابزاری است که برای کمک به تعریف و اشتراک‌گذاری برنامه‌های چند-کانتینری توسعه‌یافته است. با Compose، می‌توانیم یک فایل YAML برای تعریف سرویس‌ها ایجاد کنیم و با یک فرمان، همه چیز را تغییر دهیم.