نحوه نصب و راه اندازي 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
> IlluminateFoundationComposerScripts::postAutoloadDump
> @php artisan package:discover –ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/غير مجاز مي باشد
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 خود كار كنيد. علاوه بر اين ، با يك محيط يكبار مصرف كه مي تواند به راحتي تكثير و توزيع شود ، كار مي كنيد ، كه مي تواند در هنگام تهيه برنامه شما و همچنين هنگام حركت به سمت يك محيط توليد ، مفيد باشد.
از اين لينك ها زير مي توانيد آمورش هاي بيشتري براي لينوكس پيدا كنيد :
دسترسي از راه دور به برنامه 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 ارزان –
برچسبها:Laravel, MySQL, travellist
برچسب: ،