Ubuntu 20.04

نحوه نصب و راه اندازی Laravel با Docker Compose در اوبونتو 20.04

کانتینرایز کردن یک برنامه به فرآیند سازگاری یک برنامه و اجزای آن گفته میشود برای اینکه بتوان آن را در محیط های سبک که به کانتینر شناخته می شود اجرا کنید. چنین محیط هایی منزوی و یکبار مصرف هستند و می توانند برای توسعه ، آزمایش و بکارگیری برنامه های کاربردی برای تولید ، از آن استفاده کرد.
در این راهنما ، ما از Docker Compose برای کانتینرایز کردن برنامه Laravel برای توسعه استفاده خواهیم کرد. پس از اتمام ، یک برنامه نمایشی Laravel در سه کانتینرها سرویس جداگانه اجرا می شود:
• یک سرویس app که PHP7.4-FPM را اجرا میکند.
• سرویس db که MySQL 5.7 را اجرا می کند.
• سرویس nginx که قبل از ارائه برنامه Laravel به کاربر نهایی از سرویس برنامه برای تجزیه کد PHP استفاده می کند.
برای ایجاد یک روند توسعه ساده و تسهیل اشکال زدایی برنامه ، فایل های برنامه را با استفاده از حجم های مشترک همگام سازی خواهیم کرد. همچنین خواهیم دید که چگونه می توان از دستورات docker-compose exec برای اجرای Composer و Artisan در کانتینر برنامه استفاده کرد.
پیش نیازها
⦁ دسترسی به یک دستگاه محلی یا سرور مجازی توسعه Ubuntu 20.04 به عنوان یک کاربر غیر ریشه و دارای امتیازات sudo. اگر از سرور مجازی راه دور استفاده می کنید ، توصیه می شود یک فایروال فعال نصب شود. برای تنظیم این موارد ، لطفاً به راهنمای راه اندازی سرور مجازی اولیه ما برای اوبونتو 20.04 مراجعه کنید.
⦁ Docker نصب شده بر روی سرور مجازی تان، مراحل 1 و 2 نحوه نصب و استفاده از Docker را در اوبونتو 20.04 دنبال کنید.
⦁ Docker Compose نصب شده بر روی سرور مجازی تان. مرحله 1 نحوه نصب Docker Compose را در اوبونتو 20.04 را دنبال کنید.
مرحله 1 – به دست آوردن برنامه نسخه ی نمایشی
برای شروع ، برنامه نسخه ی نمایشی Laravel را از منبع Github آن دریافت خواهیم کرد. ما علاقه مند به شاخه tutorial-01 هستیم که شامل برنامه اصلی Laravel است که در اولین راهنمای این مجموعه ایجاد کرده ایم.
برای به دست آوردن کد برنامه ای که با این آموزش سازگار است ، با دستور زیر آموزش نسخه-1.0.1 را روی دیرکتوری هوم خود دانلود کنید:
⦁ $ cd ~
⦁ $ curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zip

برای باز کردن کد برنامه به دستور unzip نیاز خواهیم داشت. اگر قبلاً این بسته را نصب نکرده اید ، اکنون این کار را انجام دهید:
⦁ $ sudo apt update

⦁ $ sudo apt install unzip
اکنون محتویات برنامه را از حالت فشرده خارج کرده و برای دسترسی آسانتر نام دیرکتوری باز شده را تغییر دهید:
⦁ $ unzip travellist.zip

⦁ $ mv travellist-laravel-demo-tutorial-1.0.1 travellist-demo

به دیرکتوری travellist-demo بروید:
⦁ $ cd travellist-demo
در مرحله بعدی ، یک فایل پیکربندی .env برای تنظیم برنامه ایجاد خواهیم کرد.
مرحله 2 – تنظیم فایل .env برنامه
فایل های پیکربندی Laravel در پوشه ای به نام config ، در دیرکتوری اصلی برنامه قرار دارند. علاوه بر این ، از یک فایل .env برای تنظیم پیکربندی وابسته به محیط ، مانند اعتبارات و اطلاعاتی که ممکن است بین استقرارها متفاوت باشد ، استفاده می شود. این فایل در revision control گنجانده نشده است.
هشدار: فایل تنظیمات محیط شامل اطلاعات حساس در مورد سرور مجازی شما ، از جمله اطلاعات پایگاه داده و کلیدهای امنیتی است. به همین دلیل ، شما هرگز نباید این فایل را به صورت عمومی به اشتراک بگذارید.
مقادیر موجود در فایل .env بر مقادیر تعیین شده در فایل های پیکربندی معمولی واقع در دیرکتوری config  ارجحیت دارند. هر نصب بر روی یک محیط جدید نیاز به یک فایل متناسب با محیط دارد تا مواردی از قبیل تنظیمات اتصال بانک اطلاعاتی ، گزینه های اشکال زدایی ، URL برنامه را از موارد دیگری که بسته به نوع محیطی که برنامه در آن اجرا میشود تغییر میکنند، متمایز نماید.
اکنون ما یک فایل .env جدید را برای سفارشی کردن گزینه های پیکربندی برای محیط توسعه ای که تنظیم می کنیم ایجاد خواهیم کرد. Laravel با یک فایل.env مثال همراه است که می توانیم آن را کپی کنیم تا نمونه خودمان را ایجاد کنیم:
⦁ $ cp .env.example .env

این فایل را با استفاده از nano یا ویرایشگر متن مورد نظر خود باز کنید:
⦁ $ nano .env

فایل .env کنونی از برنامه نمایشی Travellist شامل تنظیماتی برای استفاده از یک پایگاه داده محلی MySQL ، با 127.0.0.1 به عنوان میزبان پایگاه داده است. ما باید متغیر DB_HOST را به روز کنیم تا به سرویس دیتابیس که در محیط Docker خود ایجاد خواهیم کرد اشاره کند. در این راهنما ، ما سرویس دیتابیس خود را db می نامیم. پیش بروید و مقدار ذکر شده DB_HOST را با نام سرویس بانک اطلاعات جایگزین کنید:
.env
APP_NAME=Travellist
APP_ENV=dev
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost:8000

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password

در صورت تمایل می توانید نام بانک اطلاعاتی ، نام کاربری و رمزعبور را نیز تغییر دهید. این متغیرها در مرحله بعدی استفاده می شود که در آن فایل docker-compose.yml را برای پیکربندی خدمات خود تنظیم خواهیم کرد.
پس از پایان ویرایش ، فایل را ذخیره کنید. اگر از nano استفاده کرده اید ، می توانید با فشار دادن Ctrl + x این کار را انجام دهید، سپس Y و Enter را برای تأیید فشار دهید.
مرحله 3 – تنظیم Dockerfile برنامه
اگرچه هر دو سرویس MySQL و Nginx ما مبتنی بر تصاویر پیش فرض به دست آمده از Docker Hub خواهد بود ، اما ما هنوز نیاز به ساختن یک تصویر دلخواه برای کانتینر برنامه داریم. برای آن یک Dockerfile جدید ایجاد خواهیم کرد.
تصویر travellist  ما بر اساس PHP: 7.4-fpm تصویر رسمی PHP از Docker Hub خواهد بود. در بالای آن محیط اصلی PHP-FPM ، چند ماژول PHP اضافی و ابزار مدیریت متعلقات Composer را نصب خواهیم کرد.
همچنین یک کاربر جدید برای سیستم ایجاد خواهیم کرد. این کار برای اجرای دستورات artisan  و composer  هنگام تهیه برنامه ضروری است. تنظیم uid تضمین می کند که کاربر درون کانتینر دارای همان کاربری است که کاربر سیستم شما در دستگاه میزبان شما دارد ، جایی که running Docker را اجرا میکنید. به این ترتیب ، هر فایل ایجاد شده توسط این دستورات با مجوزهای صحیح در هاست تکرار می شود. این نکته همچنین بدان معنی است که شما می توانید از ویرایشگر کد مورد نظر خود در دستگاه میزبان استفاده کنید تا برنامه ای را که درون کانتینرها اجرا می شود توسعه دهید.
یک Dockerfile جدید ایجاد کنید:
⦁ $ nano Dockerfile
محتوای زیر را در Dockerfile خود کپی کنید:
Dockerfile
FROM php:7.4-fpm

# Arguments defined in docker-compose.yml
ARG user
ARG uid

# Install system dependencies
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip

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

# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

# Get latest Composer
COPY –from=composer:latest /usr/bin/composer /usr/bin/composer

# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
chown -R $user:$user /home/$user

# Set working directory
WORKDIR /var/www

USER $user

فراموش نکنید که فایل را پس از اتمام کار ذخیره کنید.
Dockerfile ما با تعریف تصویر پایه ای که ما استفاده می کنیم شروع می شود: php: 7.4-fpm.
پس از نصب بسته های سیستم و پسوندهای PHP ، با کپی کردن composer  قابل اجرا از آخرین تصویر رسمی آن روی تصویر برنامه کاربردی خود ، Composer را نصب می کنیم.
سپس کاربر جدید سیستم با استفاده از آرگومانهای user و uid که در ابتدای Dockerfile اعلام شد ، ایجاد و تنظیم می شود. این مقادیر توسط Docker Compose در زمان ساخت وارد می شوند.
در آخر ، دیرکتوری پیش فرض در حال کار را به عنوان / var / www تنظیم کرده و به کاربر تازه ایجاد شده سوییچ می کنیم. این کار اطمینان حاصل می کند که شما به عنوان یک کاربر معمولی متصل میشوید ، و هنگام اجرای دستورات composer و artisan در کانتینر برنامه ، در کانتینر صحیح قرار دارید.
مرحله چهارم – تنظیم پیکربندی Nginx و فایلهای رونوشت دیتابیس
هنگام ایجاد محیط های توسعه با Docker Compose ، اغلب لازم است فایل های پیکربندی یا شروع را با کانتینرهای سرویس به اشتراک بگذارید تا این سرویس ها را تنظیم یا به صورت خودکار راه اندازی کنید. این روش ایجاد تغییر در فایل های پیکربندی را برای تنظیم دقیق محیط خود در هنگام تهیه برنامه ، تسهیل می کند.
اکنون پوشه ای را با فایل هایی تنظیم خواهیم کرد که برای پیکربندی و شروع کانتینرهای سرویس ما استفاده می شود.
برای راه‌اندازی Nginx ، یک فایل travellist.conf را به اشتراک خواهیم گذاشت که نحوه ارائه برنامه را پیکربندی خواهد کرد. پوشه docker-compose / nginx را با دستور زیر ایجاد کنید:
⦁ $ mkdir -p docker-compose/nginx

فایل جدیدی به نام travellist.conf را در آن دیرکتوری باز کنید:
⦁ $ nano docker-compose/nginx/travellist.conf

پیکربندی Nginx زیر را در آن فایل کپی کنید:
docker-compose/nginx/travellist.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 را برای گوش دادن به پورت 80 و استفاده از index.php به عنوان صفحه ایندکس پیش فرض پیکربندی می کند. وroot مطالب را بر روی /var/www/public تنظیم می کند ، و سپس Nginx را برای استفاده از سرویس برنامه در پورت 9000 تنظیم می کند تا فایل های * .php را پردازش کند.
پس از پایان ویرایش ، فایل را ذخیره کنید و ببندید.
برای راه اندازی بانک اطلاعاتی MySQL ، یک رونوشت پایگاه داده را به اشتراک می گذاریم که هنگام شروع کانتینر ، وارد می شود. این ویژگی ارائه شده توسط تصویر MySQL 5.7 است که ما از آن کانتینرها استفاده خواهیم کرد.
یک پوشه جدید برای فایل های شروع MySQL خود در داخل پوشه docker-compose ایجاد کنید:
⦁ $ mkdir docker-compose/mysql
یک فایل .sll جدید را باز کنید:
⦁ $ nano docker-compose/mysql/init_db.sql

رونوشت MySQL زیر بر اساس پایگاه داده ای است که ما در Laravel روی راهنمای LEMP خود تنظیم کرده ایم. و یک جدول جدید به نام places ایجاد می کند. سپس ، جدول را با مجموعه ای از مکان های نمونه پر می کند.
کد زیر را به فایل اضافه کنید:
docker-compose/mysql/db_init.sql
DROP TABLE IF EXISTS `places`;

CREATE TABLE `places` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`visited` tinyint(1) NOT NULL DEFAULT ‘0’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `places` (name, visited) VALUES (‘Berlin’,0),(‘Budapest’,0),(‘Cincinnati’,1),(‘Denver’,0),(‘Helsinki’,0),(‘Lisbon’,0),(‘Moscow’,1),(‘Nairobi’,0),(‘Oslo’,1),(‘Rio’,0),(‘Tokyo’,0);

جدول places  شامل سه فیلد است: id ، name و visited. قسمت visited ، فلگی است که برای شناسایی مکانهایی که هنوز در حالت to go هستند، استفاده می شود. در تغییر مکان های نمونه یا مکان های جدید آزادانه عمل کنید. پس از اتمام کار ، فایل را ذخیره کنید و ببندید.
ما تنظیمات Dockerfile برنامه و فایل های پیکربندی سرویس را به پایان رساندیم. در مرحله بعدی ، Docker Compose را تنظیم خواهیم کرد تا هنگام ایجاد خدمات ، از این فایل ها استفاده کنیم.
مرحله 5 – ایجاد یک محیط چند کانتینری با Docker Compose
Docker Compose به شما امکان می دهد محیطهای چند کانتینری را برای برنامه های در حال اجرا در Docker ایجاد کنید. با استفاده از تعاریف سرویس ، محیط های کاملاً قابل تنظیم با چندین کانتینر را ایجاد می کند که می توانند شبکه ها و حجم داده ها را به اشتراک بگذارند. این امر امکان ادغام یکپارچه بین اجزای برنامه را فراهم می آورد.
برای تنظیم تعاریف سرویس ، یک فایل جدید با نام docker-compose.yml ایجاد خواهیم کرد. به طور معمول ، این فایل در ریشه پوشه برنامه قرار دارد و محیط کانتینر شده شما ، از جمله تصاویر پایه ای که برای ساخت کانتینرهای خود استفاده خواهید کرد ، و نحوه تعامل سرویس های شما را تعریف می کند.
ما سه سرویس مختلف را در فایل docker-compose.yml خود تعریف خواهیم کرد: app ،db و nginx.
سرویس app براساس Dockerfile که قبلاً ایجاد کرده ایم ، تصویری به نام travellist ایجاد می کند. کانتینر تعریف شده توسط این سرویس ، سرور مجازی php-fpm را برای تجزیه کد PHP اجرا می کند و نتایج را به سرویس nginx ارسال می کند ، که روی یک کانتینر جداگانه اجرا می شود. سرویس mysql یک کانتینر تعریف می کند که سرور مجازی MySQL 5.7 را راه اندازی می کند. سرویس های ما شبکه پل مانندی با نام travellist را به اشتراک می گذارند.
فایل های برنامه هم در app و هم سوریس های nginx از طریق bind mounts (نصب های اتصالی) همگام می شوند. bind mounts در محیط های توسعه مفید هستند زیرا امکان همگام سازی دو طرفه بین دستگاه میزبان و کانتینرها را فراهم می کنند.
یک فایل docker-compose.yml جدید در ریشه پوشه برنامه ایجاد کنید:
⦁ $ nano docker-compose.yml

یک فایل معمولی docker-compose.yml با تعریف نسخه شروع می شود و به دنبال آن یک گره services  قرار می گیرد که تحت آن همه سرویس ها تعریف می شوند. شبکه های اشتراکی معمولاً در پایین آن فایل تعریف می شوند.
برای شروع ، این کد boilerplate را در فایل docker-compose.yml خود کپی کنید:
docker-compose.yml
version: “3.7”
services:

networks:
travellist:
driver: bridge

اکنون گره services  را ویرایش خواهیم کرد تا خدمات app ، db و nginx را شامل شود.
سرویس app
سرویس app کانتینری به نام travellist-app را تنظیم میکند. این تصویر جدید Docker را بر اساس Dockerfile که در همان مسیر فایل docker-compose.yml قرار دارد ، می سازد. تصویر جدید به صورت محلی تحت عنوان travellist ذخیره می شود.
حتی اگر ریشه سند به عنوان برنامه در کانتینر nginx قرار داشته باشد ، ما به فایل های برنامه نیز در جایی داخل کانتینر برنامه نیاز داریم ، بنابراین می توانیم وظایف خط فرمان را با ابزار Laravel Artisan اجرا کنیم.
تعریف خدمات زیر را در زیر گره خدمات خود ، درون فایل docker-compose.yml کپی کنید:
docker-compose.yml
app:
build:
args:
user: sammy
uid: 1000
context: ./
dockerfile: Dockerfile
image: travellist
container_name: travellist-app
restart: unless-stopped
working_dir: /var/www/
volumes:
– ./:/var/www
networks:
– travellist

این تنظیمات موارد زیر را انجام می دهد:
⦁ Build: این پیکربندی به Docker Compose می گوید یک تصویر محلی برای سرویس app ، با استفاده از مسیر مشخص شده (محتوا) و Dockerfile برای دستورالعمل ها بسازد. آرگومان های user و uid برای سفارشی سازی دستورات ایجاد کاربر در زمان ساخت به Dockerfile تزریق می شوند.
⦁ Image: نامی که برای تصویر استفاده خواهد شد ساخته میشود.
⦁ container_name: نام کانتینر را برای این سرویس تنظیم می کند.
⦁ Restart: همیشه ریستارت میکند ، مگر اینکه سرویس متوقف شود.
⦁ working_dir: دایرکتوری پیش فرض برای این سرویس را به عنوان / var / www تنظیم می کند.
⦁ Volumes: یک والیوم مشترک ایجاد می کند که محتویات موجود از دایرکتوری فعلی را به / var / www داخل کانتینر همگام سازی می کند. توجه کنید که این، ریشه سند شما نیست ، زیرا در کانتینر nginx قرار دارد.
⦁ networks: برای استفاده از شبکه ای به نام Travellist ، این سرویس را تنظیم میکند.
سرویس db
سرویس db از تصویر پیش ساخته MySQL 5.7 از Docker Hub استفاده می کند. از آنجا که Docker Compose به طور خودکار فایلهای متغیر .env را که در همان دیرکتوری فایل docker-compose.yml قرار دارد لود می کند ، می توانیم تنظیمات پایگاه داده خود را از فایل Laravel .env که در مرحله قبلی ایجاد کردیم ، بدست آوریم.
تعریف سرویس زیر را درست بعد از سرویس app در گره services  خود وارد کنید:
docker-compose.yml
db:
image: mysql:5.7
container_name: travellist-db
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
– ./docker-compose/mysql:/docker-entrypoint-initdb.d
networks:
– travellist

این تنظیمات موارد زیر را انجام می دهد:
⦁ Image: تصویر Docker را که باید برای این کانتینر استفاده شود ، تعریف می کند. در این حالت ، ما از تصویر MySQL 5.7 Docker Hub استفاده می کنیم.
⦁ container_name:نام کانتینر را برای این سرویس تنظیم می کند: travellist-db.
⦁ restart: همیشه این سرویس را ریستارت کنید ، مگر اینکه صریحاً متوقف شده باشد.
⦁ environment: متغیرهای محیط را در کانتینر جدید تعریف می کند. ما برای تنظیم سرویس MySQL از مقادیر به دست آمده از فایل Laravel .env استفاده می کنیم که به طور خودکار یک پایگاه داده جدید و کاربر را بر اساس متغیرهای محیط ارائه شده ایجاد می کند.
⦁ Volumes:یک حجم برای به اشتراک گذاشتن یک پایگاه داده dsql ایجاد می کند که برای شروع بانک اطلاعاتی برنامه کاربردی خواهد بود. تصویر MySQL به طور خودکار فایل های .ql قرار داده شده در دیرکتوری /docker-entrypoint-initdb.d را درون کانتینر وارد می کند.
⦁ networks: برای استفاده از شبکه ای به نام Travellist ، این سرویس را تنظیم میکند.
سرویس nginx
سرویس nginx از یک تصویر پیش ساخته Nginx در بالای Alpine ، توزیع لینوکس سبک استفاده می کند. کانتینری به نام travellist-nginx ایجاد می کند و از تعریف پورت ها برای ایجاد تغییر مسیر از پورت 8000 روی سیستم میزبان برای پورت 80 درون کانتینر استفاده می کند.
تعریف خدمات زیر را در گره خدمات خود ، درست بعد از سرویس db وارد کنید:
این تنظیمات موارد زیر را انجام می دهد:
docker-compose.yml
nginx:
image: nginx:1.17-alpine
container_name: travellist-nginx
restart: unless-stopped
ports:
– 8000:80
volumes:
– ./:/var/www
– ./docker-compose/nginx:/etc/nginx/conf.d
networks:
– travellist
⦁ Image: تصویر Docker را که باید برای این کانتینر استفاده شود ، تعریف می کند. در این حالت ، ما از تصویر Alpine Nginx 1.17 استفاده می کنیم.
⦁ container_name: نام کانتینر را برای این سرویس تنظیم می کند: travellist-nginx
⦁ restart: همیشه این سرویس را ریستارت کنید ، مگر اینکه صریحاً متوقف شده باشد.
⦁ ports: تغییر مسیر پورت را تنظیم می کند که امکان دسترسی خارجی از طریق پورت 8000 به سرور مجازی وب را که پورت 80 در داخل کانتینر کار می کند ، فراهم می کند.
⦁ volumes: دو والیوم مشترک ایجاد می کند. اولی همگام سازی محتوا از دیرکتوری فعلی با / var / www داخل کانتینر را انجام میدهد. به این ترتیب ، وقتی تغییرات محلی را در فایل های برنامه اعمال می کنید ، به سرعت در برنامه ارائه شده توسط Nginx در داخل کانتینر منعکس می شوند. دومی اطمینان حاصل خواهد کرد که فایل پیکربندی Nginx ، واقع در docker-compose / nginx / travellist.conf ، در پوشه تنظیمات Nginx کانتینر کپی شده است.
⦁ networks: برای استفاده از شبکه ای به نام Travellist ، این سرویس را تنظیم کنید.
فایل docker-compose.yml پایانی
فایل docker-compose.yml نهایی این گونه خواهد بود:
docker-compose.yml
version: “3.7”
services:
app:
build:
args:
user: sammy
uid: 1000
context: ./
dockerfile: Dockerfile
image: travellist
container_name: travellist-app
restart: unless-stopped
working_dir: /var/www/
volumes:
– ./:/var/www
networks:
– travellist

db:
image: mysql:5.7
container_name: travellist-db
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
– ./docker-compose/mysql:/docker-entrypoint-initdb.d
networks:
– travellist

nginx:
image: nginx:alpine
container_name: travellist-nginx
restart: unless-stopped
ports:
– 8000:80
volumes:
– ./:/var/www
– ./docker-compose/nginx:/etc/nginx/conf.d/
networks:
– travellist

networks:
travellist:
driver: bridge

اطمینان حاصل کنید که فایل را پس از پایان کار ذخیره کنید.
مرحله 6 – اجرای برنامه با Docker Compose
اکنون برای ایجاد تصویر برنامه و اجرای سرویس هایی که در مجموعه خود مشخص کرده ایم ، از دستورات docker-compose استفاده خواهیم کرد.
تصویر app را با دستور زیر بسازید:
⦁ $ docker-compose build app

این دستور ممکن است چند دقیقه طول بکشد تا تکمیل شود. خروجی مشابه این را مشاهده خواهید کرد:
Output
Building app
Step 1/11 : FROM php:7.4-fpm
—> fa37bd6db22a
Step 2/11 : ARG user
—> Running in f71eb33b7459
Removing intermediate container f71eb33b7459
—> 533c30216f34
Step 3/11 : ARG uid
—> Running in 60d2d2a84cda
Removing intermediate container 60d2d2a84cda
—> 497fbf904605
Step 4/11 : RUN apt-get update && apt-get install -y git curl libpng-dev libonig-dev …
Step 7/11 : COPY –from=composer:latest /usr/bin/composer /usr/bin/composer
—> e499f74896e3
Step 8/11 : RUN useradd -G www-data,root -u $uid -d /home/$user $user
—> Running in 232ef9c7dbd1
Removing intermediate container 232ef9c7dbd1
—> 870fa3220ffa
Step 9/11 : RUN mkdir -p /home/$user/.composer && chown -R $user:$user /home/$user
—> Running in 7ca8c0cb7f09
Removing intermediate container 7ca8c0cb7f09
—> 3d2ef9519a8e
Step 10/11 : WORKDIR /var/www
—> Running in 4a964f91edfa
Removing intermediate container 4a964f91edfa
—> 00ada639da21
Step 11/11 : USER $user
—> Running in 9f8e874fede9
Removing intermediate container 9f8e874fede9
—> fe176ff4702b

Successfully built fe176ff4702b
Successfully tagged travellist:latest

پس از اتمام ساخت ، می توانید محیط را در حالت پس زمینه اجرا کنید:
⦁ $ docker-compose up -d
⦁ Output
⦁ Creating travellist-db … done
⦁ Creating travellist-app … done
⦁ Creating travellist-nginx … done

این کار کانتینرهای شما را در پس زمینه اجرا می کند. برای نشان دادن اطلاعات در مورد وضعیت خدمات فعال خود ، این دستور را اجرا کنید:
⦁ $ docker-compose ps
خروجی مانند این را خواهید دید:
Output
Name Command State Ports
——————————————————————————–
travellist-app docker-php-entrypoint php-fpm Up 9000/tcp
travellist-db docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
travellist-nginx /docker-entrypoint.sh ngin … Up 0.0.0.0:8000->80/tcp

اکنون محیط شما در حال اجرا است ، اما ما هنوز باید چند دستور را اجرا کنیم تا تنظیمات برنامه به پایان برسد. برای اجرای دستورات موجود در کانتینرهای سرویس مانند ls-l می توانید از دستور docker-compose برای نمایش اطلاعات در مورد فایل ها در دیرکتوری برنامه استفاده کنید:
⦁ $ docker-compose exec app ls -l
⦁ Output
total 260
-rw-rw-r– 1 sammy sammy 737 Jun 9 11:19 Dockerfile
-rw-rw-r– 1 sammy sammy 101 Jan 7 08:05 README.md
drwxrwxr-x 6 sammy sammy 4096 Jan 7 08:05 app
-rwxr-xr-x 1 sammy sammy 1686 Jan 7 08:05 artisan
drwxrwxr-x 3 sammy sammy 4096 Jan 7 08:05 bootstrap
-rw-rw-r– 1 sammy sammy 1501 Jan 7 08:05 composer.json
-rw-rw-r– 1 sammy sammy 179071 Jan 7 08:05 composer.lock
drwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 config
drwxrwxr-x 5 sammy sammy 4096 Jan 7 08:05 database
drwxrwxr-x 4 sammy sammy 4096 Jun 9 11:19 docker-compose
-rw-rw-r– 1 sammy sammy 965 Jun 9 11:27 docker-compose.yml
-rw-rw-r– 1 sammy sammy 1013 Jan 7 08:05 package.json
-rw-rw-r– 1 sammy sammy 1405 Jan 7 08:05 phpunit.xml
drwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 public
-rw-rw-r– 1 sammy sammy 273 Jan 7 08:05 readme.md
drwxrwxr-x 6 sammy sammy 4096 Jan 7 08:05 resources
drwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 routes
-rw-rw-r– 1 sammy sammy 563 Jan 7 08:05 server.php
drwxrwxr-x 5 sammy sammy 4096 Jan 7 08:05 storage
drwxrwxr-x 4 sammy sammy 4096 Jan 7 08:05 tests
drwxrwxr-x 41 sammy sammy 4096 Jun 9 11:32 vendor
-rw-rw-r– 1 sammy sammy 538 Jan 7 08:05 webpack.mix.js

اکنون composer install را برای نصب متعلقات برنامه اجرا میکنیم:
⦁ $ docker-compose exec app composer install

خروجی مانند این را خواهید دید:
Output
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 85 installs, 0 updates, 0 removals
– Installing doctrine/inflector (1.3.1): Downloading (100%)
– Installing doctrine/lexer (1.2.0): Downloading (100%)
– Installing dragonmantank/cron-expression (v2.3.0): Downloading (100%)
– Installing erusev/parsedown (1.7.4): Downloading (100%)
– Installing symfony/polyfill-ctype (v1.13.1): Downloading (100%)
– Installing phpoption/phpoption (1.7.2): Downloading (100%)
– Installing vlucas/phpdotenv (v3.6.0): Downloading (100%)
– Installing symfony/css-selector (v5.0.2): Downloading (100%)

Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover –ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.

آخرین کاری که قبل از تست برنامه باید انجام دهیم تولید یک کلید برنامه منحصر به فرد با ابزار خط فرمان artisan Laravel است. این کلید برای رمزگذاری بخش های کاربر و سایر داده های حساس استفاده می شود:
⦁ $ docker-compose exec app php artisan key:generate

Output
Application key set successfully.

اکنون به مرورگر خود بروید و به نام دامنه یا آدرس IP سرور مجازی خود در پورت 8000 دسترسی پیدا کنید:
http://server_domain_or_IP:8000

توجه:در این حالت این دمو را در دستکاه محلی خود اجرا میکنید، از http://localhost:8000 برای دسترسی به برنامه از مرورگر خود استفاده کنید.
صفحه ای را به این شکل مشاهده خواهید کرد:

می توانید از دستور logs برای بررسی ورود های ایجاد شده توسط سرویس های خود استفاده کنید:
⦁ $ docker-compose logs nginx

Attaching to travellist-nginx

travellist-nginx | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
travellist-nginx | /docker-entrypoint.sh: Configuration complete; ready for start up
travellist-nginx | 192.168.0.1 – – [09/Jun/2020:11:46:34 +0000] “GET / HTTP/1.1” 200 627 “-” “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36”
travellist-nginx | 192.168.0.1 – – [09/Jun/2020:11:46:35 +0000] “GET / HTTP/1.1” 200 627 “-” “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36”

اگر می خواهید در هنگام حفظ وضعیت کلیه سرویس های آن ، محیط Docker Compose را متوقف کنید ، این دستور را اجرا کنید:

⦁ $ docker-compose pause
Output
Pausing travellist-db … done
Pausing travellist-nginx … done
Pausing travellist-app … done
برای ادامه دوباره برنامه:
⦁ $ docker-compose unpause
Output
Unpausing travellist-app … done
Unpausing travellist-nginx … done
Unpausing travellist-db … done

برای خاموش کردن محیط Docker Compose و حذف همه کانتینرها ، شبکه ها و والیوم های آن ، این دستور را اجرا کنید:
⦁ $ docker-compose down
Output
Stopping travellist-nginx … done
Stopping travellist-db … done
Stopping travellist-app … done
Removing travellist-nginx … done
Removing travellist-db … done
Removing travellist-app … done
Removing network travellist-laravel-demo_travellist

برای مشاهده کلیه دستورات Docker Compose ، لطفاً مرجع خط فرمان Docker Compose را بررسی کنید.
نتیجه
در این راهنما ، ما یک محیط Docker با سه کانتینر را با استفاده از Docker Compose تنظیم کرده ایم تا زیرساخت های خود را در یک فایل YAML تعریف کنیم.
از این مرحله به بعد ، می توانید بدون نیاز به نصب و راه اندازی یک سرور مجازی وب محلی برای توسعه و آزمایش بر روی برنامه Laravel خود کار کنید. علاوه بر این ، با یک محیط یکبار مصرف که می تواند به راحتی تکثیر و توزیع شود ، کار می کنید ، که می تواند در هنگام تهیه برنامه شما و همچنین هنگام حرکت به سمت یک محیط تولید ، مفید باشد.

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

چگونه با FreeBSD شروع کنیم

نحوه نصب Prosody روی اوبونتو 18.04

دسترسی از راه دور به برنامه GUI با Docker در اوبونتو 18.04

راه اندازی سایت توسعه Jekyll در اوبونتو 20.04

نحوه راه اندازی سایت توسعه Jekyll در اوبونتو 18.04

نحوه نصب و استفاده از Docker Compose در اوبونتو 20.04

نحوه اجرای چند نسخه PHP بر روی یک سرور با استفاده از Apache و PHP-FPM در CentOS 8

نحوه نصب و استفاده از TimescaleDB در Ubuntu 20.04

نحوه نصب و راه اندازی Laravel با Docker Compose در اوبونتو 20.04

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


https://vpsgol.net/product/vps-germany/

https://vpsgol.net/product/vps-usa/

https://vpsgol.net/product/vps-france/

https://vpsgol.net/product/vps-canada/

https://vpsgol.net/product/vps-poland/

https://vpsgol.net/product/vps-netherlands/

https://vpsgol.net/product/vps-england/