نحوه نصب لاراول با داکر کامپوز بر روی اوبونتو 20.04

نحوه نصب لاراول با داکر کامپوز بر روی اوبونتو 20.04

آنچه در مقاله می‌خوانید

کانتینرایز کردن یک اپلیکیشن به فرآیند سازگار کردن یک اپلیکیشن و کامپوننت‌های آن اشاره دارد تا بتوان آن را در محیط‌های سبک‌تر به نام کانتینر اجرا کرد. کانتینرها محیط‌هایی ایزوله و قابل دسترس هستند و می‌توان از آن‌ها برای توسعه، تست و دپلوی اپلیکیشن‌ها استفاده کرد. در این آموزش به بررسی نحوه نصب لاراول با داکر کامپوز بر روی اوبونتو 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 حاوی اطلاعات حساس درباره سرور شما، از جمله اطلاعات دیتابیس و کلیدهای امنیتی است. به همین دلیل، شما هرگز نباید این فایل را به صورت عمومی به اشتراک بگذارید.

مقادیر موجود در فایل 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
توجه: در صورتی که برنامه را در لوکال اجرا میکنید باید از http://localhost: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 تعریف کنیم.

از این مرحله به بعد، می‌توانید روی اپلیکیشن داکری خود بدون نیاز به نصب و راه اندازی یک وب سرور لوکال برای توسعه و تست کار کنید. علاوه بر این، با یک محیط قابل دسترسی کار خواهید کرد که به راحتی می‌تواند تکرار و توزیع شود، که می‌تواند در هنگام توسعه اپلیکیشن شما و همچنین در هنگام حرکت به یک محیط توسعه مفید باشد.

5/5 - (1 امتیاز)
دیدن نظرات
small

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

1 × 1 =

عضویت در خبرنامه مبین هاست
مطالب کدام دسته‌بندی‌ها برای شما جذاب‌تر است؟

آنچه در مقاله می‌خوانید

مقالات مرتبط
فریمورک Django
آموزش برنامه نویسی

همه چیز درباره فریمورک Django و نحوه استفاده از آن

فریم ورک Django یک ابزار متن‌باز بر پایه زبان برنامه‌نویسی پایتون است که از آن برای ساخت انواع وب‌سایت‌ها و پلتفرم‌های پیچیده استفاده می‌شود. این

خدمات مبین هاست