طی چند سال گذشته، ابزار Docker به دلیل سادگی اجرا و وارد کردن برنامهها در containerهای موقت، به یک راه حل عالی برای استقرار برنامهها تبدیل شده است. هنگام استفاده از یک پشته برنامه LEMP، (بهعنوان مثال) با PHP ،Nginx ،MySQL و چارچوب Laravel وDocker، روند نصب به طور قابل توجهی ساده میشود.
Docker Compose، با تعریف زیرساختهای خود، از جمله سرویسها، شبکهها و حجمها، در یک فایل واحد، روند توسعه را برای توسعه دهندگان سادهتر کرده است. Docker Compose، یک گزینه کارآمد برای اجرای چندین دستور docker container create و docker container run ارائه میدهد.
در این آموزش، شما با استفاده از Nginx به عنوان وب سرور و MySQL به عنوان پایگاه داده (همه داخل Docker container)، یک برنامه وب با استفاده از چارچوب Laravel خواهید ساخت. سپس، کل پیکربندی پشته را در یک فایل docker-compose همراه با فایلهای پیکربندی برای PHP MySQL و Nginx تعریف خواهید کرد.
دقت کنید که قبل از دنبال کردن این آموزش، به موارد زیر احتیاج دارید:
- یک سرور اوبونتو 18.04 و یک کاربر غیر root با امتیازات sudo.
- Docker نصب شده.
- Docker Compose نصب شده.
مرحله 1 – دانلود Laravel و نصب وابستگیها
در ابتدا، آخرین نسخه Laravel را از github دریافت کرده و برنامههای لازم برای پروژه از جمله Composer و مدیریت بسته برنامه در سطح PHP را نصب نمایید. در اینجا، برای جلوگیری از نیاز به نصب سراسری composer، برنامههای لازم را همراه با Docker نصب خواهیم کرد.
قبل از این کار، بررسی کنید که در دایرکتوری اصلی خود هستید و سپس آخرین نسخه Laravel را در یک دایرکتوری به نام laravel-app دانلود کنید:
cd ~
git clone https://github.com/laravel/laravel.git laravel-app
وارد دایرکتوری laravel-app شوید:
cd ~/laravel-app
سپس، با استفاده از Docker، ابزار Composer را برای ساخت بخشهای مورد نیاز پروژه Laravel نصب نمایید:
docker run --rm -v $(pwd):/app composer install
با استفاده از گزینههای v- و rm– دستور docker میتوانید، یک container موقت ایجاد نمایید. این container به طور موقت در دایرکتوری فعلی شما ایجاد شده و سپس از آن حذف میشود. با این کار، محتویات دایرکتوری laravel-app/~ شما در container کپی میشود. همچنین اطمینان حاصل میشود که پوشه composer که در داخل container ایجاد میکند، در پوشه فعلی شما کپی میشود.
به عنوان مرحله آخر، مجوزهای لازم را در دایرکتوری پروژه تنظیم نمایید تا آن دایرکتوری تحت مالکیت کاربر غیر root شما باشد:
sudo chown -R $USER:$USER ~/laravel-app
این امر، هنگام نوشتن Dockerfile برای image برنامه خود در مرحله 4 مهم خواهد بود؛ زیرا به شما امکان میدهد با کد برنامه خود کار کرده و فرایندها را در container خود به عنوان یک کاربر غیر root اجرا نمایید.
با در دست داشتن کد برنامه خود، اکنون میتوانید به سمت تعریف سرویسهای خود با Docker Compose بروید.
مرحله 2 – ایجاد فایل Docker Compose
ساخت برنامههای خود با Docker Compose، روند تنظیم و نسخهسازی زیرساختهای شما را ساده میکند. برای راهاندازی برنامه Laravel خود، یک فایل docker-compose خواهیم نوشت؛ بطوریکه در این فایل، وب سرور، پایگاه داده و سرویسهای برنامه مشخص شود.
در ابتدا با دستور زیر، فایل را باز کنید:
nano ~/laravel-app/docker-compose.yml
در فایل docker-compose، سه سرویس را تعریف خواهید کرد: برنامه، وب سرور و پایگاه داده. بدین منظور کد زیر را به فایل اضافه نمایید. دقت کنید که رمز عبور root را با MYSQL_ROOT_PASSWORD که به عنوان یک متغیر محیطی تحت سرویس db تعریف شده است، جایگزین نمایید:
# Learn Docker with tarahsefid.com
~/laravel-app/docker-compose.yml
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: your_mysql_root_password
SERVICE_TAGS: dev
SERVICE_NAME: mysql
networks:
- app-network
#Docker Networks
networks:
app-network:
driver: bridge
سرویسهای تعریف شده در اینجا، شامل موارد زیر است:
- app: این تعریف سرویس، شامل برنامه Laravel است و یک image سفارشی از Docker اجرا میکند. این همان چیزی است که در مرحله 4 تعریف خواهید کرد. علاوه براین، مقدار work_dir موجود در container را روی /var/www تنظیم مینماید.
- webserver: این تعریف سرویس، image مربوط به nginx:alpine را از Docker استخراج کرده و پورتهای 80 و 443 را در اختیار قرار میدهد.
- db: این تعریف سرویس، image مربوط به mysql: 5.7.22 را از Docker استخراج کرده و برخی از متغیرهای محیطی، از جمله یک پایگاه داده به نام laravel را تعریف مینماید. این، همان پایگاه دادهای است که برای برنامه شما مورد استفاده قرار میگیرد. این تعریف، رمز عبور root پایگاه داده را نیز تعیین میکند. اگرچه عنوان پایگاه داده کاملاً اختیاری است؛ ولیکن باید یک رمز عبور قوی جایگزین your_mysql_root_password نمایید. این تعریف سرویس، همچنین پورت 3306 میزبان را به پورت 3306 برروی container نگاشت میکند.
هر خاصیت container_name یک نام برای کانتینر تعریف میکند که با نام سرویس مطابقت دارد. اگر این ویژگی را تعریف نکنید، Docker با ترکیب نام یک شخص مشهور از لحاظ تاریخی و یک کلمه تصادفی جدا شده با یک “_”، به هر container یک نام اختصاص میدهد.
برای سهولت در برقراری ارتباط بین containerها، این سرویسها به یک شبکه bridge به نام app-network متصل میشوند. یک شبکه bridge از یک نرم افزار bridge استفاده میکند تا به containerهای متصل به همان شبکه bridge اجازه دهد که با یکدیگر ارتباط برقرار کنند. درایور bridge به طور خودکار قوانینی را در دستگاه میزبان نصب میکند تا containerهای شبکههای مختلف bridge نتوانند، مستقیماً با یکدیگر ارتباط برقرار کنند.
این امر باعث میشود، امنیت بیشتری برای برنامهها ایجاد شود. بدین معنی که تضمین میکند، تنها سرویسهای مرتبط میتوانند با یکدیگر ارتباط برقرار کنند. همچنین به این معنی است که شما میتوانید، چندین شبکه و سرویسهای چندگانهای را تعریف کرده و به عملکردهای مشخص آنها را مرتبط نمایید. بهعنوان مثال، سرویسهای برنامه front-end میتوانند، از یک شبکه frontend استفاده کنند و سرویسهای back-end نیز میتوانند، از یک شبکه backend استفاده نمایند.
بیایید به نحوه افزودن حجم و اتصال mountها به تعاریف سرویس خود نگاهی بیندازیم تا دادههای برنامه شما تداوم یابد.
مرحله 3 – ثبات دادهها
Docker دارای ویژگیهای قدرتمند و راحت برای ثبات دادهها است. در اینجا، ما از حجمها و اتصال mountها برای ثبات دادهها، برنامه و فایلهای پیکربندی استفاده خواهیم کرد. حجمها انعطاف پذیری را برای پشتیبان گیری و ماندگاری فراتر از چرخه عمر container فراهم میکنند؛ در حالی که اتصال mount باعث تسهیل تغییرات کد در حین توسعه و باعث ایجاد تغییراتی در فایلها یا دایرکتوریهای میزبان شما در container شما میشود. در اینجا، از هر دو گزینه استفاده خواهیم کرد.
هشدار: با استفاده از اتصال mountها میتوانید، امکان تغییر سیستم فایل میزبان را از طریق فرآیندهای در حال اجرا در یک container، از جمله ایجاد، اصلاح یا حذف فایلها یا دایرکتوریهای مهم سیستم فراهم نمایید. این، یک توانمندی بسیار قدرتمند با کاربردهای امنیتی است و میتواند فرآیندهای غیر Docker را بر روی سیستم میزبان تحت تأثیر بگذارد.
در فایل docker-compose، برای پشتیبانی از پایگاه داده MySQL، یک حجم به نام dbdata را تحت تعریف سرویس db تعریف کنید.
# tarahsefid.com
~/laravel-app/docker-compose.yml
...
#MySQL Service
db:
...
volumes:
- dbdata:/var/lib/mysql
networks:
- app-network
...
حجم dbdata، از محتوای پوشه /var/lib/mysql موجود در داخل container پشتیبانی میکند. با این کار میتوانید سرویس db را بدون از دست دادن داده متوقف و دوباره راهاندازی نمایید.
در پایین فایل، تعریف حجم dbdata را به صورت زیر اضافه کنید:
# tarahsefid
~/laravel-app/docker-compose.yml
...
#Volumes
volumes:
dbdata:
driver: local
با استفاده از این تعریف، شما میتوانید از این حجم در سراسر سرویسها استفاده نمایید.
در مرحله بعدی، برای اتصال فایلهای پیکربندی MySQL که در مرحله 7 ایجاد میکنید، اتصال bind را به سرویس db اضافه نمایید:
# tarahsefid.com
~/laravel-app/docker-compose.yml
...
#MySQL Service
db:
...
volumes:
- dbdata:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/my.cnf
...
این اتصال mount، فایل laravel-app/mysql/my.cnf/~ را به فایل /etc/mysql/my.cnf در container متصل میکند.
سپس، اتصالهای bind را به سرویس وب سرور اضافه نمایید. بدین منظور، دو مورد وجود دارد: یکی برای کد برنامه شما و دیگری برای تعریف پیکربندی Nginx که در مرحله 6 ایجاد خواهید کرد:
# tarahsefid.com
~/laravel-app/docker-compose.yml
#Nginx Service
webserver:
...
volumes:
- ./:/var/www
- ./nginx/conf.d/:/etc/nginx/conf.d/
networks:
- app-network
اولین اتصال mount، کد برنامه موجود در دایرکتوری laravel-app/~ را به دایرکتوری /var/www درون container متصل میکند. همچنین فایل پیکربندی که در laravel-app/nginx/conf.d/~ اضافه خواهید کرد نیز به /etc/nginx/conf.d/ در container مرتبط خواهد شد. این، به شما اجازه میدهد در صورت لزوم محتوای پوشه پیکربندی را اضافه یا اصلاح نمایید.
در آخر، اتصال mountهای زیر را برای کد برنامه و فایلهای پیکربندی به سرویس برنامه اضافه کنید:
# tarahsefid.com
~/laravel-app/docker-compose.yml
#PHP Service
app:
...
volumes:
- ./:/var/www
- ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
networks:
- app-network
در اینجا، پوشه laravel-app/~ از سرویس app (که حاوی کد برنامه است)، به پوشه /var/www موجود در container مرتبط میشود. این، روند توسعه را تسریع میبخشد؛ زیرا هرگونه تغییر در دایرکتوری محلی برنامههای شما فوراً در داخل container منعکس میشود. شما همچنین باید فایل پیکربندی PHP خود یا laravel-app/php/local.ini/~ را به /usr/local/etc/php/conf.d/local.ini در container متصل کنید. فایل پیکربندی محلی PHP در مرحله 5 ایجاد خواهد شد.
فایل docker-compose شما اکنون به شکل زیر خواهد بود:
# tarahsefid.com
~/laravel-app/docker-compose.yml
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 سفارشی را برای برنامه خود بسازید.
مرحله 4 – ایجاد Dockerfile
Docker، به شما امکان میدهد، با یک فایل Dockerfile، محیط داخل containerهای جداگانه را مشخص کنید. Dockerfile، شما را قادر میسازد، imageهای سفارشی ایجاد نمایید. با استفاده از آنها میتوانید، نرم افزار مورد نیاز برنامه خود را نصب کرده و تنظیمات را بر اساس نیاز خود انجام دهید. شما میتوانید پس از ایجاد imageهای سفارشی، آنها را به Docker Hub یا هر رجیستری خصوصی وارد کنید.
Dockerfile ما در دایرکتوری laravel-app/~ قرار دارد. بنابراین میتوانید فایل را به صورت زیر ایجاد نمایید:
nano ~/laravel-app/Dockerfile
این Dockerfile، یک image پایه تنظیم کرده و دستورات و دستورالعملهای لازم برای ساخت image برنامه Laravel را مشخص مینماید. کد زیر را به فایل اضافه کنید:
# tarahsefid.com
~/laravel-app/php/Dockerfile
FROM php:7.2-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
# 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 یک image در بالای image مربوط به php: 7.2-fpm Docker ایجاد میکند. این یک image مبتنی بر دبیان است که پیاده سازی PHP FastCGI PHP-FPM را نصب کرده است. این فایل همچنین بستههای پیش نیاز Laravel (یعنی mcrypt ،pdo_mysql ،mbstring و imagick با composer) را نصب مینماید.
دستورالعمل RUN، دستورات مربوط به بروزرسانی، نصب و پیکربندی تنظیمات داخل container، از جمله ایجاد یک کاربر و گروه اختصاصی به نام www را تعیین میکند. دستورالعمل WORKDIR، دایرکتوری /var/www را به عنوان دایرکتوری برنامه تعیین مینماید.
ایجاد یک کاربر و گروه اختصاصی با مجوزهای محدود، آسیب پذیری ذاتی را هنگام اجرای کانتینرهای Docker که به طور پیش فرض به عنوان root اجرا میشوند، کاهش میدهد. به جای اجرای این container به عنوان root، در اینجا کاربر www را ایجاد کردهایم که به دلیل استفاده از دستورالعمل COPY به همراه گزینه chown– برای کپی مجوزهای پوشه برنامه، به پوشه /var/www، دسترسی خواندن و نوشتن دارد.
سرانجام، دستور EXPOSE، یک پورت 9000 در container در اختیار سرور php-fpm قرار میدهد. CMD دستوری را تعیین میکند که باید پس از ایجاد container اجرا شود. در اینجا، CMD دستور “php-fpm” را مشخص میکند که مربوط به راهاندازی سرور است.
پس از اتمام تغییرات، فایل را ذخیره کرده و از ویرایشگر خود خارج شوید.
اکنون میتوانید پیکربندی PHP را انجام دهید.
مرحله 5 – پیکربندی PHP
اکنون که زیرساخت خود را در فایل docker-compose تعریف کردید، میتوانید سرویس PHP را پیکربندی نمایید تا به عنوان پردازنده PHP برای درخواستهای دریافتی از Nginx عمل کند.
برای پیکربندی PHP باید فایل local.ini را درون پوشه php ایجاد کنید. این، فایلی است که شما در مرحله 2 به /usr/local/etc/php/conf.d/local.ini در داخل container وصل کردهاید. این فایل، جایگزینی برای فایل php.ini پیش فرض است که PHP هنگام راهاندازی از آن استفاده مینماید.
بدین منظور در ابتدا دایرکتوری php را به صورت زیر ایجاد کنید:
mkdir ~/laravel-app/php
سپس، فایل local.ini را باز نمایید:
nano ~/laravel-app/php/local.ini
به منظور نشان دادن نحوه پیکربندی PHP، کد زیر را برای تنظیم محدودیتهای حجم فایلهای بارگذاری شده اضافه کنید:
# tarahsefid.com
~/laravel-app/php/local.ini
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 بروید.
مرحله 6 – پیکربندی Nginx
با پیکربندی سرویس PHP، میتوانید سرویس Nginx را تغییر دهید تا از PHP-FPM به عنوان سرور FastCGI برای ارائه محتوای پویا استفاده کند. سرور FastCGI بر اساس یک پروتکل دودویی به منظور ارتباط بین برنامههای تعاملی با یک وب سرور ساخته شده است.
به منظور پیکربندی 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 خود، کد زیر را به فایل اضافه کنید:
# tarahsefid.com
~/laravel-app/nginx/conf.d/app.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;
}
}
قطعه کد بالا، پیکربندی وب سرور Nginx را با دستورالعملهای زیر انجام میدهد:
- listen: این دستورالعمل پورتی را تعریف میکند که سرور از طریق آن، درخواستهای ورودی را شنود میکند.
- error_log و access_log: این دستورالعملها، فایلها را برای نوشتن گزارشها تعریف مینمایند.
- root: این دستورالعمل، مسیر پوشه root را مشخص میکند که تشکیل شده از مسیر کامل برای هر فایل درخواستی در سیستم فایل محلی است.
در بلوک مکان php، دستورالعمل fastcgi_pass مشخص میکند که سرویس app، سوکت TCP روی پورت 9000 را شنود میکند. این باعث میشود که سرور PHP-FPM به جای سوکت Unix از طریق شبکه شنود کند. اگرچه یک سوکت یونیکسی نسبت به سوکت TCP از سرعت کمتری برخوردار است، اما پروتکل شبکه ندارد و بنابراین پشته شبکه را از دست میدهد.
برای مواردی که میزبانها روی یک دستگاه قرار دارند، سوکت یونیکسی ممکن است منطقی باشد، اما در مواردی که سرویسهایی با میزبانهای مختلف اجرا میکنید، یک سوکت TCP به شما امکان اتصال به سرویسهای توزیع شده را میدهد.
از آنجا که container برنامه ما در یک میزبان متفاوت از container وب سرور ما در حال اجرا است، یک سوکت TCP برای پیکربندی ما معقولتر است.
پس از اتمام تغییرات، فایل را ذخیره کرده و از ویرایشگر خود خارج شوید.
با استفاده از اتصال mount که در مرحله 2 ایجاد کردهاید، هر تغییری که در داخل پوشه nginx/conf.d/ ایجاد کنید، مستقیماً در داخل container سرور منعکس میشود.
در مرحله بعد باید به تنظیمات MySQL خود بپردازید.
مرحله 7 – پیکربندی MySQL
با پیکربندی PHP و Nginx میتوانید، MySQL را فعال کنید تا به عنوان پایگاه داده برنامه شما عمل کند.
برای پیکربندی MySQL باید فایل my.cnf را در پوشه mysql ایجاد نمایید. این فایلی است که در مرحله 2 به /etc/mysql/my.cnf داخل container وصل کردهاید. این اتصال mount به شما امکان میدهد، تنظیمات my.cnf را در هر زمان که لازم باشد، لغو کنید.
به منظور نشان دادن نحوه عملکرد، تنظیماتی را به فایل my.cnf اضافه خواهیم کرد که ورود درخواست عمومی را فعال کرده و فایل ورود به سیستم را مشخص مینماید.
ابتدا دایرکتوری mysql را ایجاد کنید:
mkdir ~/laravel-app/mysql
سپس، فایل my.cnf را ایجاد نمایید:
nano ~/laravel-app/mysql/my.cnf
برای فعال کردن ثبت درخواستها و تعیین محل فایل گزارش، کد زیر را اضافه کنید:
# tarahsefid.com
~/laravel-app/mysql/my.cnf
[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/general.log
فایل my.cnf، امکان ثبت گزارشها را فراهم میکند و تنظیمات general_log را برروی 1 تعیین میکند تا ورود به سیستمهای عمومی امکان پذیر شود. تنظیم General_log_file، محل ذخیره شدن گزارشها را مشخص مینماید.
در انتها، فایل را ذخیره کرده و از ویرایشگر خود خارج شوید.
در ادامه، نحوه کار با containerها شرح داده شده است.
مرحله 8 – تغییر تنظیمات محیط و اجرای container
اکنون که همه سرویسهای خود را در فایل docker-compose تعریف کرده و فایلهای پیکربندی این سرویسها را ایجاد کردهاید، میتوانید containerها را راهاندازی نمایید. به عنوان گام آخر، در اینجا یک کپی از فایل .env.example به نام .env تهیه کردهایم که Laravel به طور پیش فرض از آن استفاده میکند. این همان فایلی است که Laravel برای تعریف محیطش به آن نیاز دارد:
cp .env.example .env
اکنون میتوانید فایل .env موجود در container برنامه را تغییر دهید تا جزئیات خاصی درباره تنظیمات شما در آن گنجانده شود.
بدین منظور با استفاده از nano یا ویرایشگر متن خود، فایل را باز کنید:
nano .env
قطعه کدی که DB_CONNECTION را مشخص میکند، پیدا کرده و آن را مطابق تنظیمات مورد نیاز خود به روز نمایید. مقادیری که به ویرایش نیاز دارد، عبارتند از:
- DB_HOST: پایگاه داده container شما را مشخص میکند.
- 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، باید دستوری را مشخص نمایید که به وسیله آن، همه containerها اجرا شوند. همچنین باید حجمها را بسازید و شبکهها را متصل کنید:
docker-compose up -d
وقتی برای اولین بار docker-compose را اجرا مینمایید، همه imageهای لازم Docker بارگیری میشوند که این کار ممکن است مدتی طول بکشد. هنگامیکه imageها بارگیری و در دستگاه محلی شما ذخیره میشوند، Compose مربوط به containerهای شما ایجاد میشود. گزینه -d منجر به اجرای container در پس زمینه میشود.
پس از اتمام مراحل، از دستور زیر برای لیست کردن تمام containerهای در حال اجرا استفاده کنید:
docker ps
اکنون خروجی زیر را مشاهده خواهید کرد:
Output:
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 در این خروجی، یک شناسه منحصر به فرد برای هر container است، در حالی که NAMES نام سرویس مرتبط با هر یک را لیست میکند. برای دسترسی به containerها میتوانید از هر دو شناسه استفاده نمایید. IMAGE، نام image را برای هر container تعریف میکند؛ در حالی که STATUS، اطلاعاتی راجع به وضعیت container ارائه میدهد: این که آیا در حال اجرا، راهاندازی مجدد یا توقف است.
اکنون ما از docker-compose برای تنظیم کلید برنامه Laravel استفاده میکنیم. دستور docker-compose exec به شما امکان میدهد، دستورات خاصی را در containerها اجرا نمایید.
دستور زیر، یک کلید تولید میکند و آن را در فایل .env کپی مینماید. این کار برای تضمین امنیت نشستهای کاربر و دادههای رمزگذاری شده است:
docker-compose exec app php artisan key:generate
اکنون تنظیمات محیطی مورد نیاز برای اجرای برنامه خود را دارید. برای ذخیره این تنظیمات در یک فایل که دسترسی به آن باعث افزایش سرعت بارگیری برنامه شما میشود، دستور زیر را اجرا کنید:
docker-compose exec app php artisan config:cache
تنظیمات پیکربندی شما در /var/www/bootstrap/cache/config.php روی container بارگیری میشود.
به عنوان آخرین مرحله، به http: // your_server_ip در مرورگر مراجعه نمایید. صفحه اصلی برنامه Laravel خود مشاهده خواهید کرد:
با فعال شدن containerها و اطلاعات پیکربندی شده خود میتوانید، به پیکربندی اطلاعات کاربری خود برای پایگاه داده laravel در db container بپردازید.
مرحله 9 – ایجاد یک کاربر برای MySQL
نصب پیش فرض MySQL، تنها حساب کاربری مدیریتی root را ایجاد میکند که دارای امتیازات نامحدود در سرور پایگاه داده است. به طور کلی، بهتر است هنگام تعامل با پایگاه داده، از استفاده از حساب کاربری مدیریت root خودداری کنید. در عوض، یک کاربر پایگاه داده اختصاصی برای پایگاه داده Laravel برنامه خود ایجاد نمایید.
برای ایجاد کاربر جدید، یک پوسته bash تعاملی بر روی db container با استفاده از دستور docker-compose exec اجرا کنید:
docker-compose exec db bash
سپس داخل container، وارد حساب مدیریت root مربوط به MySQL شوید:
mysql -u root -p
در هنگام نصب در فایل docker-compose، از شما پسوردی که برای حساب root MySQL تنظیم کردهاید، خواسته میشود.
با بررسی پایگاه دادهای به نام laravel که در فایل docker-compose تعریف کردهاید، شروع کنید. دستور show databases را برای بررسی پایگاه دادههای موجود اجرا نمایید:
mysql> show databases;
پایگاه داده laravel را در خروجی مشاهده خواهید کرد:
output:
+--------------------+
| 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 از تغییرات اجرا نمایید:
mysql> FLUSH PRIVILEGES;
با استفاده از دستور زیر، از MySQL خارج شوید.
mysql> EXIT;
سرانجام، از container خارج شوید:
root@c31b7b3251e0:/# exit
اکنون، حساب کاربری خود را برای پایگاه داده برنامه Laravel پیکربندی کردهاید و آماده دادههای خود و کار با کنسول Tinker هستید.
مرحله 10 – دادهها و کار با کنسول Tinker
با اجرای برنامه خود میتوانید دادههای خود را ارائه کرده و با دستور tinker آزمایش نمایید. بدین صورت، یک کنسول PsySH دارای Laravel در اختیار خواهید داشت. PsySH، یک کنسول توسعه دهنده زمان اجرا و یک اشکال زدای تعاملی برای PHP است و Tinker، یک REPL مخصوص Laravel است. استفاده از دستور tinker به شما امکان میدهد، از خط فرمان در یک پوسته تعاملی، با برنامه Laravel خود ارتباط برقرار کنید.
ابتدا با اجرای دستور Laravel artisan migrate، اتصال MySQL را آزمایش نمایید:
docker-compose exec app php artisan migrate
این دستور جداول پیش فرض Laravel را منتقل میکند. خروجی تأیید، به صورت زیر خواهد بود:
output:
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
پس از اتمام انتقال میتوانید یک کوئری برای بررسی درستی اتصال به پایگاه داده با استفاده از دستور tinker اجرا کنید:
docker-compose exec app php artisan tinker
سپس اتصال MySQL را با دریافت دادههایی که اخیراً منتقل کردهاید، آزمایش نمایید:
>>> \DB::table('migrations')->get();
خروجی مشابه زیر را مشاهده خواهید کرد:
output:
=> 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 برای تعامل با پایگاه داده خود و آزمایش سرویسها و مدلها استفاده نمایید.
پس از تکمیل و تنظیم برنامه Laravel خود، برای توسعه و کار بیشتر آماده خواهید بود.