کانتینرایز کردن یک اپلیکیشن به فرآیند سازگار کردن یک اپلیکیشن و کامپوننتهای آن اشاره دارد تا بتوان آن را در محیطهای سبکتر به نام کانتینر اجرا کرد. کانتینرها محیطهایی ایزوله و قابل دسترس هستند و میتوان از آنها برای توسعه، تست و دپلوی اپلیکیشنها استفاده کرد. در این آموزش به بررسی نحوه نصب لاراول با داکر کامپوز بر روی اوبونتو 20.04 میپردازیم. در واقع، از داکر کامپوز برای کانتینرایز کردن یک اپلیکیشن لاراولی برای توسعه آن استفاده میکنیم.
در انتهای این آموزش، یک دمو از اپلیکیشن لاراولی خواهید داشت که روی سه سرویس کانتینری مجزا اجرا میشود:
- یک سرویس app که PHP7.4-FPM را اجرا میکند.
- یک سرویس db که MySQL 5.7 را اجرا میکند.
- یک سرویس وب سرور nginx که از سرویس app برای پارس کردن کد PHP قبل از سرو کردن اپلیکیشن لاراولی به کاربر نهایی استفاده میکند.
برای برخورداری از فرآیند توسعه ساده و تسهیل اشکالزدایی برنامه، فایلهای برنامه را با استفاده از والیومهای مشترک همگام نگه خواهیم داشت. همچنین نحوه استفاده از دستور docker-compose exec برای اجرای composer و artisan در کانتینر app را بررسی خواهیم کرد.
پیش نیازها
- دسترسی به یک ماشین مجازی لوکال Ubuntu 20.04 یا سرور مجازی برای توسعه به عنوان یک کاربر غیر روت با مجوز دسترسیهای sudo. اگر از یک سرور راه دور (ریموت) استفاده میکنید، توصیه میکنیم یک فایروال فعال نصب داشته باشید.
- لازم است docker بر روی سرور مجازی لینوکس شما نصب باشد. برای اینکار میتوانید به مطلب مرتبط با نصب داکر مراجعه نمایید.
- نیاز است تا Docker Compose بر روی سرور شما نصب باشد.
- برای اطلاع از راه اندازی اولیه سرور با اوبونتو 20.04 میتوانید مطلبی که مرتبط با آن تهیه کردهایم را مطالعه نمایید.
مرحله ۱: دریافت اپلیکیشن دمو
برای شروع نصب لاراول با داکر کامپوز بر روی اوبونتو 20.04، دموی اپلیکیشن لاراولی را از ریپازیتوری گیت هاب فچ (fetch) میکنیم. برنچ tutorial-01 مدنظر ماست که شامل برنامه اصلی لاراولی است که در اولین راهنمای این سری ایجاد کردهایم.
برای دریافت کد برنامه که با این آموزش سازگار است، نسخهی tutorial-1.0.1 را در دایکتوری home خود دانلود کنید:
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 برای راه اندازی اپلیکیشن استفاده میکنیم.
مرحله ۲: تنظیم فایل .env اپلیکیشن
در اپلیکیشنهای لاراولی، فایلهای پیکربندی در پوشهای به نام config داخل دایرکتوری اصلی اپلیکیشن وجود دارند.
فایل env برای تنظیم پیکربندیهای وابسته به محیط، مانند اعتبارنامه ها و هرگونه اطلاعاتی که ممکن است برای دیپلوی برنامه نیاز داشته باشیم استفاده میشود.
مقادیر موجود در فایل env از مقادیر تنظیم شده در فایل های پیکربندی معمولی که در دایرکتوری config قرار دارند، اولویت بیشتری دارند.
برای هر نصب لاراول در محیط جدید به یک فایل env مخصوص نیاز است تا برنامه و سایر مواردی مانند تنظیمات اتصال دیتابیس، گزینههای دیباگ و موارد دیگری که ممکن است بسته به محیطی application url که برنامه اجرا می شود متفاوت باشد را تعریف کند.
حالا یک فایل جدید برای کاستومایز کردن گزینههای پیکربندی برای محیط توسعه ایجاد میکنیم. لاراول دارای یک فایل به نام.env است که میتوانیم آن را کپی کنیم تا فایل خودمان را ایجاد کنیم.
cp .env.example .env
اکنون این فایل را با nano با ویرایشگر متن دلخواه خود باز کنید.
nano .env
فایل env پروژهی دموی travelist شامل تنظیماتی برای استفاده از دیتابیس لوکال با ip 127.0.0.1 به عنوان دیتابیس است.
باید متغیرهای DB_HOST را به گونه ای اپدیت کنیم که به دیتابیسی که ما در محیط داکر ایجاد کردهایم اشاره کند. در این آموزش ما بهجای دیتابیس از 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
پس از اتمام ویرایش، فایل را ذخیره کنید.
مرحله ۳: تنظیم فایل داکر اپلیکیشن
اگرچه هر دو فایل Mysql و Nginx از سرویس DockerHub دریافت میشوند. هنوز نیاز به ساخت یک image سفارشی برای کانتینر اپلیکیشن داریم. به این منظور یک فایل داکر جدید ایجاد می کنیم.
image پروژه travellist براساس php:7.4-fpm و image نسخه رسمی php در Docker Hub را علاوه بر PHP-FPM چند ماژول دیگر و Composer نصب خواهیم کرد.
بعلاوه یک سیستم یوزر جدید نیز ایجاد خواهیم کرد. این کار برای اجرای artisan و دستورات composer در زمان توسعه برنامه ضروری است. تنظیمات uid این اطمینان را به ما خواهد داد که کاربر داخل کانتینر هم uid مشابه کابر ماشین مجازی یا هاست در زمانی که داکر اجرا میشود برخوردار باشد.
این بدان معناست که، فایلی که توسط این دستورات ایجاد میشود، با مجوزهای صحیح در host تکثیر میشود. همچنین به این معناست که شما قادر خواهید بود از ویرایشگر کد مورد علاقه خود در ماشین میزبان برای توسعه برنامه استفاده کنید که درون کانتینرها در حال اجرا است.
یک فایل داکر جدید بسازید:
nano 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
وقتی کارتان تمام شد حتما فایل را سیو کنید.
بعد از نصب سیستم پکیج ها و افزونههای php باید composer را با استفاده از image رسمی آن نصب کنیم.
همچنین یک یوزر جدید با استفاده از پارامتر uid که در ابتدای Dockerfile تعریف کرده بودیم ایجاد میشود. این مقادیر از طریق Docker Compose در زمان ساخت inject میشوند.
در نهایت دایرکتوری پیشفرض را به /var/www تغییر داده و به یوزر تازه ایجاد شده سوئیچ میکنیم. این کار به شما این مکان را میدهد که به عنوان یک یوزر معمولی کانکت شده و در زمان اجرای دستورات، کامپوزر و artisan در دایرکتوری درستی قرار دارید.
مرحله ۴: تنظیم فایلهای پیکربندی و Dump فایل های دیتابیس
هنگام ایجاد محیطهای توسعه با Docker Compose اغلب نیاز است تا فایل های پیکربندی را باز کنید، تا این سرویس ها را پیکربندی یا نصب کنید. این عمل به شما کمک میکند تا تغییراتی را در فایلهای پیکربندی انجام داده و محیط خود را در حالتی که در حال توسعه برنامه هستید، بهینه کنید. حال، در این مرحله از نصب لاراول با داکر کامپوز، یک پوشه با فایلهایی که برای پیکربندی و راهاندازی کانتینرهای سرویس ما استفاده خواهند شد، ایجاد می کنیم.
برای نصب nginx ما travellist.conf را، که نحوه پیکره بندی پروژه را مشخص میکند share میکنیم. فولدر 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 به عنوان صفحه اصلی استفاده کند و داکیومنت روت /var/www/public خواهد بود. سپس nginx را برای استفاده از app service ها در پورت 9000 برای اجرای فایلهای .php پیکربندی میکند. هنگامی که فایلتان را ویرایش کردید آن را سیو کرده و فایل را ببندید.
برای راه اندازی دیتابیس mysql یک dump به اشتراک میگذاریم که که در زمان مقداردهی اولیه کانتینر وارد میشود.
برای ایجاد یک فولدر جدید برای مقداردهی MySQL در داخل docker-compose از دستور زیر استفاده میکنیم:
mkdir docker-compose/mysql
یک فایل جدید با پسوند .sql باز کنید.
nano docker-compose/mysql/init_db.sql
برای ساخت جدول 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 است.
فایل را سیو کرده و آن را ببندید.
مرحله ۵: ساخت محیط مولتی کانتینر با داکر کامپوز
داکر کامپوز شما را قادر میسازد تا محیطهای چند کانتینری برای اپلیکیشنهایی که روی داکر اجرا میکنید بسازید. داکر کامپوز از تعریف service برای ساخت محیطهای کاملا قابل سفارشیسازی با چندین کانتینر استفاده میکند که میتواند داده والیومها و نتورکها را به اشتراک بگذارد. این قابلیت امکان یکپارچه سازی بدون وقفه بین کامپوننتهای اپلیکیشن را فراهم میآورد.
برای پیاده سازی تعاریف سرویسها، معمولا فایلی با نام docker-compose.yml میسازیم، این فایل در دایرکتوری روت اپلیکیشن قرار گرفته ست و محیط کانتینرایز شده شامل ایمیجهای پایهای را تعریف میکند که برای ساخت کانتینرهای خود استفاده میکنید و همچنین نحوه تعامل سرویسها نیز در این فایل مشخص میشود.
۳ سرویس مختلف در فایل docker-compose.yml تعریف میکنیم: app و db و nginx.
سرویس app با توجه به Dockerfile که قبلا ساختیم، یک ایمیج با نام travellist خواهد ساخت. کانتینر تعریف شده توسط این سرویس یک سرور php-fpm برای پارس کردن کدهای PHP و بازگرداندن نتایج به سرویس nginx اجرا خواهد کرد که سرویس nginx خود بر روی یک کانتینر مجزا در حال اجرا است. سرویس mysql یک کانتینر تعریف میکند که یک سرور MySQL 5.7 را اجرا میکند. سرویسهای ما یک شبکه bridge با نام travellist را به اشتراک میگذارند.
با استفاده از bind mount فایلهای اپلیکیشن هم بر روی سرویس app و هم بروی سرویس nginx همگامسازی خواهند شد. bind mount در محیطهای توسعه کاربردی هستند زیرا امکان همگامسازی دوطرفه بین ماشین میزبان و کانتینرها را فراهم میکند.
یک فایل با نام docker-compose.yml در دایرکتوری روت اپلیکیشن بسازید:
nano docker-compose.yml
یک فایل docker-compose.yml متداول با تعریف ورژن شروع میشود که به دنبال آن گره سرویسها آورده میشوند که در زیر آن تمامی سرویسها آورده شدهاند. شبکههای به اشتراک گذاشته شده معمولا در پایین فایل تعریف میشوند.
برای شروع، کد قالب زیر را در فایل docker-compose.yml خود کپی کنید:
version: "3.7" services: networks: travellist: driver: bridge
گره سرویسها را ویرایش خواهیم نمود تا سرویسهای app و db و nginx را اضافه کنیم.
سرویس app
سرویس app کانتینری با نام travellist-app راه اندازی میکند. این سرویس یک ایمیج داکر جدید بر مبنای Dockerfile قرار داده شده در مسیر یکسانی با فایل docker-compose.yml میسازد. ایمیج جدید به صورت لوکالی با نام travellist ذخیره میشود. حتی اگر ریشه سندی که به عنوان اپلیکیشن سرو میشوددر کانتینر nginx قرار داشته باشد، باید فایلهای اپلیکیشن نیز در جایی داخل کانتینر app قرار گرفته شوند، بنابراین باید بتوانیم تسکهای کامندلاین را با استفاده از ابزار آرتیسان لاراول اجرا کنیم.
تعریف سرویس زیر را در گروه سرویسهای خود، در فایل 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: این تنظیمات به داکر کامپوز میگوید که یک ایمیج لوکال برای سرویس app بسازد، با استفاده از مسیر مشخص شده (context) و داکرفایل برای دستورالعملها. آرگومان user و uid داخل داکرفایل اینجکت شدهاند تا بتوان کامندهای ساخت کاربر در زمان بیلد را سفارشی ساخت.
- img: نامی که برای ایمیجی که بیلد شده استفاده خواهد شد.
- container_name: نام کانتینر برای این سرویس را مشخص میکند.
- restart: همیشه ریستارت تا زمانی که متوقف شود.
- working_dir: دایرکتوری پیش فرض برای این سرویس را /var/www تنظیم میکند.
- volumes: یک والیوم به اشتراک گذاشته شده ایجاد میکند که محتواها را از دایرکتوری جاری به دایرکتوری /var/www داخل کانتینر همگام سازی خواهد کرد. دقت کنید که این دایرکتوری، روت سند شما نیست، زیرا در انجینکس کانتینر قرار دارد.
- networks: این سرویس برای راه اندازی یک نتورک با نام travellist استفاده میشود.
سرویس db
سرویس db از ایمیج از پیش ساخته شدهی MySQL از داکرهاب استفاده میکند. به دلیل اینکه داکر کامپوز به صورت خودکار فایل متغیرهای .env را که در دایرکتوری یکسانی با docker-compose.yml قرار دارند را لود میکند، میتوانیم تنظیمات دیتابیس را از فایل .env لاراول ایجاد شده در گام قبل بگیریم.
تعریف سرویس زیر را در گره سرویسها اضافه کنید، دقیقا بعد از سرویس app:
db: image: mysql:8.0 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: ایمیج داکر را تعریف میکند که باید برای این کانتینر استفاده شود. در این مورد، از ایمیج MySQL 5.7 از داکرهاب استفاده میکنیم.
- container_name: نام کانتینر برای این سرویس را مشخص میکند: travellist-db
- restart: همیشه ریستارت تا زمانی به صورت صریح متوقف شود.
- environment: متغیرهای محیطی در کانتینر جدید را تعریف میکند. از مقادیر گرفته شده از فایل .env لاراول برای راه اندازی سرویس MySQL استفاده میکنیم که به صورت خودکار یک دیتابیس و یوزر بر اساس متغیرهای محیطی ارائه شده میسازد.
- volumes: یک والیوم برای اشتراک گذاری یک کپی دیتابیس .sql ایجاد میکند که برای راه اندازی دیتابیس اپلیکیشن استفاده میشود. ایمیج MySQL به صورت اتوماتیک فایل .sql را که در دایرکتوری docker-compose/mysql قرار دارد را در کانتینر ایمپورت کند.
- networks: برای این سرویس یک نتورک با نام travellist راه اندازی میکند.
سرویس nginx
سرویس انجینکس از یک ایمیج از پیش ساخته شده بر روی apline استفاده میکند، آلپین یک توزیع سبک لینوکس است. این سرویس یک کانتینر با نام travellist-nginx میسازد و از تعریف پورتها استفاده میکند تا یک ریدایرکشن از پورت ۸۰۰۰ سیستم میزبان به پورت ۸۰ کانتینر بزند.
تعریف سرویس زیر را در گره سرویسها اضافه کنید، دقیقا بعد از تعریف سرویس db:
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: ایمیج داکر را تعریف میکند که باید برای این کانتینر استفاده شود. در این مورد، ما از ایمیج Alpine Nginx 1.17 استفاده میکنیم.
- container_name: نام کانتینر برای این سرویس را راه اندازی میکند: travellist-nginx
- restart: این سرویس را همیشه سرویس ریستارت میکند، تا زمانی که صراحتا متوقف شود.
- ports: یک پورت ریدایرکشن راه اندازی میکند که اجازه دسترسی خارجی از طریق پورت ۸۰۰۰ وب سرور به پورت ۸۰ داخل کانتینر را میدهد.
- volumes: دو والیوم اشتراکی میسازد. اولین والیوم محتوای دایرکتوری جاری را با دایرکتوری /var/www داخل کانتینر به اشتراک میگذارد. با این کار، هنگامی که تغییری محلی در فایلهای اپلیکیشن ایجاد شود، به سرعت در اپلیکیشن اعمال خواهد شد که توسط انجینکس درون کانتینر سرو خواهد شد. دومین والیوم این اطمینان را حاصل میکند که فایل کانفیگ انجینکس، که در docker-compose/nginx/travellist.conf قرار دارد، در پوشه تنظیمات انجینکس داخل کانتینر کپی شده است.
- networks: برای این سرویس یک شبکه با نام travellist راه اندازی میکند.
فایل 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:8.0 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
حتما این فایل را در پایان کار ذخیره کنید.
مرحله ۵: اجرای برنامه با استفاده از Docker Compose
اکنون باید از دستورات Docker Compose برای ساخت image و اجرای سرویسها استفاده کنیم.
با استفاده از دستورات زیر image 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
زمانی که اجرای دستور برای نصب لاراول با داکر کامپوز به پایان رسید میتوانید environment را در بکگراند مد با استفاده از دستور زیر اجرا کنید.
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/t
محیط توسعه اکنون بالا است اما برای پایان تنظیمات برنامه هنوز نیاز داریم که آن را با استفاده از چند دستور اجرا کنیم. شما میتوانید از docker-compose exe برای اجرای دستورات در کانتینر مانند ls -l استفاده کنید تا بتوانید لیست اطلاعات را در مورد فایل ها در دایرکتوری برنامه مشاهده کنید.
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 برای نصب dependency های برنامه استفاده میکنم.
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.
اخرین کاری که باید پیش از تست برنامه انجام دهیم، ساخت application key یونیک با استفاده از artisan است، این کلید برای رمزنگاری سشن کاربران و سایر دیتاهای حساس استفاده میشود.
docker-compose exec app php artisan key:generate
Output Application key set successfully.
نصب لاراول با داکر کامپوز به پایان رسیده است. اکنون در مرورگر آدرس زیر را تایپ کنید.
http://server_domain_or_IP:8000
شما باید صفحه ای مطابق زیر مشاهده کنید.
میتوانید از دستور log برای مشاهده لاگ سرویس استفاده کنید.
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 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 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
نتیجه گیری
در این راهنما، به نحوه نصب لاراول با داکر کامپوز پرداختیم و یک محیط داکر را با استفاده از داکر کامپوز با سه کانتینر راه اندازی کردیم تا زیرساختمان را در یک فایل YAML تعریف کنیم.
از این مرحله به بعد، میتوانید روی اپلیکیشن داکری خود بدون نیاز به نصب و راه اندازی یک وب سرور لوکال برای توسعه و تست کار کنید. علاوه بر این، با یک محیط قابل دسترسی کار خواهید کرد که به راحتی میتواند تکرار و توزیع شود، که میتواند در هنگام توسعه اپلیکیشن شما و همچنین در هنگام حرکت به یک محیط توسعه مفید باشد.