مقدمه
در طی چند سال گذشته ، Docker به لطف نحوه ساده سازی و اجرای برنامه ها در کانتینرهای زودگذر ، به یک راه حل متداول برای استقرار برنامه های کاربردی تبدیل شده است. به عنوان مثال ، هنگام استفاده از یک پشته برنامه LEMP ، با PHP ، Nginx ، MySQL و چارچوب Laravel ،Docker می تواند روند تنظیم را بطور قابل توجهی ساده کند.
Docker Compose با اجازه دادن به توسعه دهندگان ، برای معرفی زیرساخت های خود از جمله خدمات برنامه ، شبکه ها و حجم ها را در یک فایل واحد ، فرایند توسعه را ساده تر کرده است. Docker Compose یک گزینه جایگزین کارآمد برای اجرای چندین دستور docker container create و docker container run ارائه می دهد.
در این آموزش شما یک برنامه وب با استفاده از چارچوب Laravel ایجاد می کنید ، و Nginx به عنوان وب سرور مجازی و MySQL به عنوان بانک اطلاعات ، همه در داخل کانتینرهای Dockerشما قرار دارند. کل پیکربندی پشته را در یک فایل docker-compose ، همراه با فایل های پیکربندی برای PHP ، MySQL و Nginx تعریف خواهید کرد.
پیش نیازها
قبل از شروع ، به موارد زیر نیاز دارید:
⦁ یک سرور Ubuntu 18.04 و یک کاربر غیر ریشه با امتیازات sudo. برای انجام این تنظیمات ، راه اندازی سرور اولیه را با آموزش اوبونتو 18.04 دنبال کنید.
⦁ Docker نصب شده ، طبق مراحل 1 و 2 نحوه نصب و استفاده از Docker در اوبونتو 18.04.
⦁ Docker Compose نصب شده طبق مرحله 1 نحوه نصب Docker Compose در اوبونتو 18.04.
مرحله 1 – دانلود Laravel و نصب متعلقات
به عنوان اولین مرحله ، آخرین نسخه Laravel را گرفته و متعلقات مربوط به پروژه از جمله Composer ، یعنی مدیر بسته برنامه های کاربردی برای PHP را نصب می کنیم. ما این متعلقات را با Docker نصب خواهیم کرد تا از نصب Composer در سطح جهانی جلوگیری کنید.
ابتدا بررسی کنید که در دیرکتوری هوم خود قرار دارید و آخرین نسخه Laravel را به دیرکتوری به نام laravel-app کلون کنید:
⦁ $ cd ~

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

به دیرکتوری laravel-app بروید:
⦁ $ cd ~/laravel-app

در مرحله بعدی ، از تصویر composer Docker برای سوار کردن دایرکتوری هایی که برای پروژه Laravel نیاز دارند استفاده کنید و از نصب composer در سطح جهانی جلوگیری کنید:
⦁ $ docker run –rm -v $(pwd):/app composer install

استفاده از فلگ های -v و – rm با اجرای docker run ، کانتینری زودگذر ایجاد می کند که قبل از حذف ، به دیرکتوری فعلی شما وصل خواهد شد. با این کار محتویات دیرکتوری ~ / laravel-app خود را در کانتینر کپی می کنید و همچنین اطمینان حاصل می کنید که پوشه vendor کامپوزر که در داخل کانتینر ایجاد شده در دیرکتوری فعلی شما کپی می شود.
به عنوان مرحله آخر ، مجوزها را در دایرکتوری پروژه تنظیم کنید تا متعلق به کاربر غیر ریشه شما باشد:
⦁ $ sudo chown -R $USER:$USER ~/laravel-app

این مسئله هنگامی که Dockerfile را برای تصویر برنامه خود در مرحله 4 می نویسید مهم خواهد بود ، زیرا به شما امکان می دهد با کد برنامه خود کار کنید و فرآیندهای موجود در کانتینر خود را به عنوان کاربر غیر ریشه اجرا کنید.
با استفاده از کد برنامه خود می توانید در تعریف خدمات خود با Docker Compose پیش بروید.
مرحله 2 – ایجاد فایل Docker Compose
ساخت برنامه های کاربردی خود با Docker Compose روند تنظیم و نسخه سازی زیرساخت های شما را ساده می کند. برای راه‌اندازی برنامه Laravel ، ما یک فایل docker-compose را برای معرفی سرور مجازی ، بانک اطلاعاتی و خدمات برنامه خود خواهیم نوشت.
فایل را باز کنید:
⦁ $ nano ~/laravel-app/docker-compose.yml

در فایل docker-compose ، شما سه سرویس را تعریف خواهید کرد: app ، webserver و db. کد زیر را به فایل اضافه کنید ، حتماً رمز اصلی را برای MYSQL_ROOT_PASSWORD که به عنوان یک متغیر محیط تحت سرویس db تعریف شده است ، با یک رمز عبور قوی به انتخاب خود جایگزین کنید:
~/laravel-app/docker-compose.yml
version: ‘3’
services:

#PHP Service
app:
build:
context: .
dockerfile: Dockerfile
image: vpsgol.net/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 است و یک تصویر Docker سفارشی ، vpsgol.net/php را اجرا می کند ، که در مرحله 4 آن را تعریف خواهید کرد. این کار همچنین work_dir را در کانتینر برابر / var / www قرار میدهد.
⦁ Webserver: این تعریف سرویس تصویر nginx: alpine را از Docker میگیرد و پورت های 80 و 443 را در معرض دید شما قرار می دهد.
⦁ Db: این تعریف سرویس ، تصویر mysql: 5.7.22 را از Docker گرفته و چند متغیر محیطی از جمله پایگاه داده ای به نام laravel را برای برنامه شما و رمز عبور اصلی برای پایگاه داده تعریف می کند. شما می توانید بانک اطلاعاتی را هر چه می خواهید ، بنامید و باید کلمه عبور your_mysql_root_pass را با رمزعبور قوی خود جایگزین کنید. این تعریف سرویس همچنین پورت 3306 روی هاست به پورت 3306 روی کانتینر نگاشت می کند.
هر یک از ویژگی های container_name یک نام برای کانتینر تعریف می کند ، که با نام سرویس مطابقت دارد. اگر این ویژگی را تعریف نکنید ، Docker با ترکیب یک نام مشهور از نظر تاریخی و یک کلمه تصادفی که با آندرلاین جدا شده است ، به هر کانتینر یک نام می دهد.
برای تسهیل ارتباط بین کانتینرها ، سرویس ها به شبکه پلی به نام app-network وصل می شوند. یک شبکه پلی از یک پل نرم افزاری استفاده می کند که به کانتینرهای متصل به یک شبکه پلی اجازه می دهد تا با یکدیگر ارتباط برقرار کنند. درایور پل به طور خودکار قوانینی را در دستگاه هاست نصب می کند تا کانتینرها در شبکه های مختلف پل نتوانند مستقیماً با یکدیگر ارتباط برقرار کنند. این باعث می شود سطح امنیتی بیشتری برای برنامه ها ایجاد شود و اطمینان حاصل شود که فقط خدمات مرتبط می توانند با یکدیگر ارتباط برقرار کنند. همچنین این امکان وجود دارد که بتوانید چندین شبکه و سرویس متصل به توابع مرتبط را تعریف کنید: به عنوان مثال سرویس های برنامه front-end می توانند از یک شبکه frontend ، و سرویس های back-end می توانند از یک شبکه backend استفاده کنند.
بیایید ببینیم که چگونه می توان حجم ها را اضافه کرد و نصب ها را به تعاریف سرویس خود اضافه کرد تا داده های برنامه شما ثابت شود
مرحله 3 – داده های ماندگار
Docker دارای ویژگی های قدرتمند و مناسبی برای داده های پایدار است. در برنامه ما از volumes و bind mounts  برای پایداری پایگاه داده و فایلهای برنامه و پیکربندی استفاده خواهیم کرد. volumes قابلیت انعطاف پذیری را برای تهیه نسخه پشتیبان و ماندگاری فراتر از چرخه حیات یک کانتینر ارائه می دهند ، در حالی که bind mounts باعث تغییر کد در طول توسعه می شوند و تغییراتی را در فایل ها یا دایرکتوری های هاست شما ایجاد می کنند که فوراً در کانتینرهای شما موجود است. ستاپ ما از هر دو استفاده خواهد کرد.
هشدار: با استفاده از bind mounts، می توانید سیستم فایل هاست را از طریق فرآیندهای در حال اجرا در یک کانتینر ، از جمله ایجاد ، اصلاح یا حذف فایل های مهم سیستم یا دایرکتوری ها ، تغییر دهید. این یک توانایی قدرتمند با پیامدهای امنیتی است و می تواند فرآیندهای غیر Docker را روی سیستم میزبان تحت تأثیر بگذارد. با دقت از bind mounts استفاده کنید.

در فایل docker-compose ، یک والیوم به نام dbdata را تحت تعریف سرویس db تعریف کنید تا پایگاه داده MySQL را ماندگار کنید:
~/laravel-app/docker-compose.yml

#MySQL Service
db:

volumes:
– dbdata:/var/lib/mysql
networks:
– app-network

والیوم به نام dbdata ، محتوای پوشه / var / lib / mysql موجود در داخل کانتینر را ادامه می دهد. این به شما امکان می دهد سرویس db را بدون از دست دادن داده متوقف کرده و مجدداً راه اندازی کنید.
در انتهای فایل ، تعریف مربوط به حجم dbdata را اضافه کنید:
~/laravel-app/docker-compose.yml

#Volumes
volumes:
dbdata:
driver: local

با استفاده از این تعریف ، می توانید از این حجم در سرویس ها استفاده کنید.
در مرحله بعد ، یک bind mount به سرویس db برای فایل های پیکربندی MySQL که در مرحله 7 ایجاد خواهید کرد اضافه کنید:
~/laravel-app/docker-compose.yml

#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 mount را به سرویس webserver اضافه کنید. دو مورد وجود دارد: یکی برای کد برنامه شما و دیگری برای تعریف پیکربندی Nginx که در مرحله 6 ایجاد خواهید کرد:
~/laravel-app/docker-compose.yml
#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 / اضافه خواهید کرد نیز در / enc/nginx/conf.d/ در کانتینر نصب می شود و به شما امکان می دهد تا در صورت لزوم محتوای دیرکتوری تنظیمات را اضافه کنید یا تغییر دهید. .
در آخر ، bind mount زیر را برای کد برنامه و فایل های پیکربندی به سرویس app اضافه کنید:
~/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

سرویس app پوشه var / laravel-app ، که شامل کد برنامه است را به پوشه / var / www موجود در کانتینر وصل می شود. این کار روند توسعه را سرعت می بخشد ، زیرا هرگونه تغییر در دیرکتوری برنامه محلی شما فوراً داخل کانتینر منعکس می شود. همچنین فایل پیکربندی PHP خود، ~ / laravel-app / php / local.ini ، را به /usr/local/etc/php/conf.d/local.ini در داخل کانتینر اتصال می دهید. در مرحله 5 فایل پیکربندی PHP محلی را ایجاد خواهید کرد.
فایل docker-compose شما اکنون چنین خواهد بود:
~/laravel-app/docker-compose.yml
version: ‘3’
services:

#PHP Service
app:
build:
context: .
dockerfile: Dockerfile
image: vpsgol.net/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 ، اکنون می توانید تصویر دلخواه خود را برای برنامه خود بسازید.
مرحله 4 – ایجاد Dockerfile
Docker به شما امکان می دهد محیط داخلی کانتینرهای منفرد را با Dockerfile مشخص کنید. Dockerfile به شما امکان می دهد تصاویر سفارشی ایجاد کنید که می توانید از آنها برای نصب نرم افزار مورد نیاز برنامه تان استفاده کنید و تنظیمات را بر اساس نیاز خود انجام دهید. می توانید تصاویر سفارشی را که ایجاد می کنید به Docker Hub یا هرگونه رجیستری خصوصی وارد کنید.
Dockerfile ما در دیرکتوری ~ / laravel-app قرار خواهد گرفت. فایل را ایجاد کنید:
⦁ $ nano ~/laravel-app/Dockerfile

این Dockerfile تصویر پایه را تنظیم کرده و فرمان ها و دستورالعمل های لازم را برای ساخت تصویر برنامه Laravel مشخص می کند. کد زیر را به فایل اضافه کنید:
~/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 تصویری را در بالای تصویر php: 7.2-fpm Docker ایجاد می کند. این یک تصویر مبتنی بر دبیان است که پیاده سازی PHP FastCGI PHP-FPM را نصب کرده است. این فایل همچنین بسته‌های پیش نیاز لاراول را نصب می کند: mcrypt ، pdo_mysql ، mbstring و imagick با composer.
دستورالعمل RUN دستورات را برای به روزرسانی ، نصب و پیکربندی تنظیمات درون کانتینر از جمله ایجاد یک کاربر و گروه اختصاصی به نام www مشخص می کند. دستورالعمل WORKDIR دیرکتوری / var / www را به عنوان دایرکتوری کاربری برنامه مشخص می کند.
ایجاد یک کاربر و گروه اختصاصی با مجوزهای محدود ، آسیب پذیری ذاتی هنگام اجرای کانتینرهای Docker را کاهش می دهد ، که به صورت پیش فرض به عنوان root اجرا می شود. ما به جای اینکه این کانتینر را به عنوان ریشه اجرا کنیم ، کاربر www را ایجاد کرده ایم که به لطف دستورالعمل COPY که با فلگ –chown برای پرینت مجوزهای پوشه برنامه استفاده می کنیم ، دسترسی خواندن / نوشتن به پوشه / var / www را دارد.
سرانجام ، دستور EXPOSE درگاهی را در کانتینر 9000 در اختیار سرور مجازی php-fpm قرار می دهد. CMD فرمانی را که باید هنگام ایجاد کانتینر ، اجرا شود ، مشخص می کند. در اینجا ، CMD “php-fpm” را مشخص می کند ، که سرور مجازی را شروع می کند.
فایل را ذخیره کنید و هنگام پایان تغییرات ، از ویرایشگر خود خارج شوید.
اکنون می توانید پیکربندی PHP خود را تغییر دهید.
مرحله 5 – پیکربندی PHP
اکنون که زیرساخت خود را در فایل docker-compose تعریف کرده اید ، می توانید سرویس PHP را پیکربندی کنید تا به عنوان پردازنده PHP برای درخواست های دریافتی از Nginx عمل کند.
برای پیکربندی PHP ، فایل local.ini را در پوشه php ایجاد خواهید کرد. این فایلی است که شما در مرحله 2 به /usr/local/etc/php/conf.d/local.ini در داخل کانتینر وصل کرده اید. ایجاد این فایل به شما امکان می دهد فایل پیش فرض php.ini را که PHP هنگام شروع خوانده است، باطل کنید.
دایرکتوری php ایجاد کنید:
⦁ $ mkdir ~/laravel-app/php

سپس ، فایل local.ini را باز کنید:
⦁ $ nano ~/laravel-app/php/local.ini

برای نشان دادن نحوه پیکربندی PHP ، ما کد زیر را برای تعیین محدودیت های اندازه برای فایل های بارگذاری شده اضافه خواهیم کرد:
~/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 باطل کنید.
فایل را ذخیره کنید و از ویرایشگر خود خارج شوید.
با استفاده از فایل local.ini در PHP ، می توانید به پیکربندی Nginx بروید.
مرحله 6 – پیکربندی Nginx
با پیکربندی سرویس PHP ، می توانید سرویس Nginx را تغییر دهید تا از PHP-FPM به عنوان سرور مجازی FastCGI برای ارائه محتوای پویا استفاده کنید. سرور مجازی FastCGI بر پایه یك پروتكل دودویی برای ارتباط بین برنامه های تعاملی با یك سرور مجازی وب میباشد. برای اطلاعات بیشتر ، لطفا به این مقاله در مورد درک و اجرای Proxying FastCGI در Nginx مراجعه کنید.
برای پیکربندی 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 ، کد زیر را به فایل اضافه کنید:
~/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 به جای یک سوکت یونیکس از طریق شبکه گوش کند. اگرچه یک سوکت یونیکس نسبت به سوکت TCP از سرعت کمی برخوردار است ، اما پروتکل شبکه ندارد و بنابراین پشته شبکه را از دست می دهد. برای مواردی که هاست ها در یک دستگاه قرار دارند ، سوکت یونیکس ممکن است معنا پیدا کند ، اما در مواردی که شما دارای سرویس هایی هستید که روی هاست های مختلفی کار می کنند ، یک سوکت TCP این مزیت را دارد که به شما امکان اتصال به سرویس های توزیع شده را می دهد. از آنجا که کانتینر برنامه ما روی یک هاست متفاوت از کانتینرهای وب سرور مجازی ما اجرا می شود ، یک سوکت TCP برای پیکربندی ما معقول تر است.
پس از اتمام ایجاد تغییرات ، فایل را ذخیره کنید و از ویرایشگر خود خارج شوید.
به لطف bind mount که در مرحله 2 ایجاد کردید ، هرگونه تغییر در داخل nginx / conf.d / پوشه مستقیماً درون کانتینر سرور مجازی منعکس می شود.
در مرحله بعدی ، بیایید تنظیمات MySQL ما را بررسی کنیم.
مرحله 7 – پیکربندی MySQL
با پیکربندی PHP و Nginx ، می توانید MySQL را فعال کنید تا به عنوان بانک اطلاعاتی برنامه تان عمل کند.
برای پیکربندی MySQL ، فایل my.cnf را در پوشه mysql ایجاد خواهید کرد. این فایلی است که شما در مرحله 2 به /etc/mysql/my.cnf داخل کانتینر وصل کرده اید. این bind mount به شما امکان می دهد تنظیمات my.cnf را در صورت لزوم باطل کنید.
برای نشان دادن نحوه کار این ، تنظیمات را به فایل my.cnf اضافه خواهیم کرد که ورود درخواست عمومی را فعال می کند و فایل ورود را مشخص می کند.
ابتدا دایرکتوری mysql را ایجاد کنید:
⦁ $ mkdir ~/laravel-app/mysql

سپس ، فایل my.cnf را ایجاد کنید:
⦁ $ nano ~/laravel-app/mysql/my.cnf

در این فایل ، کد زیر را اضافه کنید تا گزارش ورود فعال شود و محل فایل log را تنظیم کنید:
~/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 مکان های ذخیره log ها را مشخص می کند.
فایل را ذخیره کنید و از ویرایشگر خود خارج شوید.
قدم بعدی ما شروع به کار کانتینرها خواهد بود.
مرحله 8 – اصلاح تنظیمات محیط و اجرای کانتینرها
اکنون که همه خدمات خود را در فایل docker-compose خود تعریف کرده اید و فایل های پیکربندی را برای این سرویس ها ایجاد کرده اید ، می توانید کانتینرهای را شروع کنید. با این حال ، به عنوان آخرین مرحله ، از فایل .env.example کپی تهیه خواهیم کرد که Laravel به طور پیش فرض آن را دارد و نام آن کپی را.env را میگذاریم، که فایلی است که Laravel انتظار دارد محیط آن را تعریف کند:
⦁ $ cp .env.example .env

اکنون می توانید فایل .env را در کانتینر برنامه تغییر دهید تا جزئیات خاصی در مورد راه اندازی شما را شامل شود.
فایل را با استفاده از nano یا ویرایشگر متن مورد نظر خود باز کنید:
⦁ $ 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-composerی را اجرا می کنید ، تمام تصاویر لازم Docker را دانلود می کند ، که ممکن است مدتی طول بکشد. پس از دانلود تصاویر و ذخیره شدن در دستگاه محلی شما ، composer کانتینرهای شما را ایجاد می کند. فلگ -d فرایند را فریبنده می کند ، کانتینرهای شما را در پس زمینه اجرا می کند.
پس از اتمام فرآیند ، از فرمان زیر برای لیست تمام کانتینرهای در حال اجرا استفاده کنید:
⦁ $ docker ps

خروجی زیر را با جزئیات مربوط به کانتینرهای app ، webserver و db مشاهده خواهید کرد:
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 vpsgol.net/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

ID CONTAINER در این خروجی یک شناسه منحصر به فرد برای هر کانتینر است ، در حالی که NAMES نام سرویس مربوط به هر یک را لیست می کند. برای دسترسی به کانتینرها می توانید از هر دو این شناسه استفاده کنید. IMAGE نام هر تصویر را برای هر کانتینر تعریف می کند ، در حالی که STATUS اطلاعاتی در مورد وضعیت کانتینر ارائه می دهد: چه در حال اجرا ، راه اندازی مجدد یا توقف باشد.
اکنون برای تنظیم کلید برنامه برنامه Laravel از docker-compose exec استفاده خواهیم کرد. دستور docker-compose exec به شما امکان می دهد دستورات خاصی را در کانتینرها اجرا کنید.
دستور زیر یک کلید تولید می کند و آن را در فایل .env شما کپی می کند ، اطمینان حاصل کنید که بخش های کاربر و داده های رمزگذاری شده شما ایمن باقی می مانند :
⦁ $ docker-compose exec app php artisan key:generate

اکنون تنظیمات محیطی لازم برای اجرای برنامه خود را دارید. برای ذخیره این تنظیمات در یک فایل ، که باعث افزایش سرعت بارگذاری برنامه شما می شود ، این دستور را اجرا کنید:
⦁ $ docker-compose exec app php artisan config:cache

تنظیمات پیکربندی شما در /var/www/bootstrap/cache/config.php روی کانتینر لود می شود.
به عنوان مرحله آخر ، از http: // your_server_ip در مرورگر بازدید کنید. صفحه اصلی برنامه کاربردی Laravel خود را مشاهده خواهید کرد:

با فعال شدن کانتینرها و اطلاعات پیکربندی شده خود ، می توانید پیکربندی اطلاعات کاربر خود را برای پایگاه داده Laravel موجود در کانتینر db پیش ببرید.
مرحله 9 – ایجاد یک کاربر برای MySQL
نصب پیش فرض MySQL فقط باعث ایجاد حساب کاربری ریشه ای می شود که دارای امتیازات نامحدودی در سرور مجازی پایگاه داده است. به طور کلی ، بهتر است هنگام تعامل با بانک اطلاعاتی ، از استفاده از حساب ادمین ریشه خودداری کنید. در عوض ، یک کاربر پایگاه داده اختصاصی برای بانک اطلاعاتی Laravel برنامه خود ایجاد کنیم.
برای ایجاد یک کاربر جدید ، یک پوسته تعاملی bash را در کانتینر db با docker-compose اجرا کنید:
⦁ $ docker-compose exec db bash

داخل کانتینر ، وارد حساب ادمین ریشه MySQL شوید:
⦁ root@c31b7b3251e0:/# 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;

در آخر ، از کانتینر خارج شوید:
⦁ root@c31b7b3251e0:/# exit

شما حساب کاربری را برای پایگاه داده برنامه Laravel خود پیکربندی کرده اید و آماده انتقال اطلاعات خود و کار با کنسول Tinker هستید.
مرحله 10 – انتقال داده ها و کار با کنسول Tinker
با اجرای برنامه ، می توانید داده های خود را انتقال داده و با دستور tinker آزمایش کنید ، که یک کنسول PsySH دارای Laravel از پیش لود شده است. PsySH یک کنسول توسعه دهنده زمان اجزا و یک اشکال زدای تعاملی برای PHP است و Tinker یک REPL مخصوص Laravel است. استفاده از دستور tinker به شما امکان می دهد تا با برنامه Laravel خود از خط فرمان در یک پوسته تعاملی ارتباط برقرار کنید.
ابتدا اتصال به MySQL را با اجرای دستور artisan Laravel که از داخل کانتینر یک جدول migrations در پایگاه داده ایجاد می کند ، آزمایش نمایید:
⦁ $ 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 در محل خود ، آماده توسعه و آزمایش بیشتر هستید.
نتیجه
اکنون یک برنامه پشته LEMP دارید که روی سرور مجازی تان در حال اجرا است که با دسترسی به صفحه استقبال Laravel و ایجاد جا به جایی در پایگاه داده MySQL ، آن را آزمایش کرده اید.
کلید سادگی این نصب Docker Compose است که به شما امکان می دهد گروهی از کانتینرهای Docker را که در یک فایل واحد تعریف شده، با یک دستور واحد ایجاد کنید. اگر دوست دارید درباره نحوه انجام CI با Docker Compose اطلاعات بیشتری کسب کنید به راهنمای پیکربندی یک محیط آزمایش یکپارچه سازی مداوم با Docker و Docker Compose در اوبونتو 16.04 نگاهی بیاندازید. اگر می خواهید روند استقرار برنامه Laravel خود را ساده تر کنید ، راهنمای چگونگی به کارگیری برنامه های کاربردی Laravel با Deployer در Ubuntu 16.04 ، منبع مرتبطی خواهد بود.

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکاخرید سرور مجازی ارزان هلندvpsخرید vps هلندخرید سرور مجازی آمریکاخرید vps فرانسهتست vpsسرور مجازی تستسرور مجازی ویندوزارزانترین vpsخرید وی پی اسvps ارزان – 

برچسب‌ها:, , , , ,