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

مقدمه

در این بخش از آموزش مربوط به docker سراغ docker compose رفتیم. لطفا تا انتها با ما همراه باشید. استفاده از containerize برای یک برنامه به فرآیند سازگاری برنامه و اجزای آن برای اینکه بتواند آن را در محیط های سبک که به عنوان container شناخته می شوند، اشاره دارد. چنین محیط هایی جدا و یکبار مصرف هستند و می توانند برای توسعه، آزمایش و استقرار برنامه های کاربردی در تولید استفاده شوند.

در این راهنما، ما از Docker Compose برای containerize برنامه Laravel برای توسعه استفاده خواهیم کرد. پس از پایان کار، یک برنامه دمو لاراول در سه کانتینر سرویس مجزا اجرا خواهید کرد:

  • یک سرویس app با PHP7.4-FPM
  • سرویس db با MySQL 5.7
  • سرویس nginx که از سرویس app برای تجزیه کد PHP قبل از ارائه برنامه لاراول به کاربر نهایی ،استفاده می کند.

برای پردازش ساده و تسهیل دیباگ برنامه، ما با استفاده از volume های مشترک ، فایلهای های برنامه را همگام سازی خواهیم کرد. همچنین نحوه استفاده از دستورات docker-compose exec برای اجرای Composer و Artisan در کانتینر app را خواهیم دید.

پیش نیازها

  • دسترسی به یک ماشین لوکال یا سرور توسعه اوبونتو 20.04 به عنوان یک کاربر غیر root با sudo. اگر به صورت ریموت از سرور استفاده می کنید، توصیه می شود فایروال فعال نصب کنید. برای تنظیم این موارد ، لطفاً به این لینک Initial Server Setup Guide for  Ubuntu 20.04 مراجعه کنید.
  • Docker بر روی سرور شما نصب شده است، مراحل 1 و 2 نحوه نصب و استفاده از Docker در اوبونتو 20.04 را دنبال کنید.
  • Docker Compose بر روی سرور نصب شده است، مرحله 1 نحوه نصب و استفاده از Docker Compose در اوبونتو 20.04 را دنبال کنید.

مرحله 1 - دستیابی به برنامه دمو

برای شروع، برنامه demo Laravel را از Github repository آن واکشی می کنیم. ما به برنچ tutorial-01 علاقه مندیم، که شامل برنامه اصلی Laravel است که در اولین راهنمای این مجموعه ایجاد کرده ایم.

برای به دست آوردن کد برنامه ای که با این آموزش سازگار است، نسخه 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 

حالا، محتویات application را از حالت فشرده خارج کرده و برای دسترسی آسان دایرکتوری باز شده را تغییر نام دهید:

unzip travellist.zip
mv travellist-laravel-demo-tutorial-1.0.1 travellist-demo 

به دایرکتوری travellist-demo بروید:

cd travellist-demo 

در مرحله بعدی، یک فایل پیکربندی .env برای راه اندازی برنامه ایجاد خواهیم کرد.

مرحله 2 - تنظیم فایل .env

فایل های پیکربندی Laravel در یک دایرکتوری به نام config در دایرکتوری root برنامه قرار دارند. علاوه بر این، از یک فایل .env برای تنظیمات  environment-dependent configuration مانند credential ها و هر اطلاعاتی که ممکن است بین استقرار متفاوت باشد استفاده می شود.

هشدار: فایل environment configuration شامل اطلاعات حساس سرور شماست، از جمله database credential و کلیدهای امنیتی. به همین دلیل، هرگز نباید این فایل را به صورت عمومی به اشتراک بگذارید.

مقادیر موجود در فایل .env بر مقادیر تنظیم شده در فایل های پیکربندی واقع در دایرکتوری config اولویت دارند. هر نصب بر روی یک محیط جدید نیاز به یک فایل مناسب محیطی دارد تا مواردی مانند تنظیمات اتصال پایگاه داده، گزینه های دیباگ ، URL برنامه و سایر موارد را تعریف کند که بسته به اینکه برنامه در چه محیطی اجرا می شود، ممکن است متفاوت باشد.

اکنون برای سفارشی کردن گزینه های پیکربندی محیط توسعه ای که در حال راه اندازی آن هستیم، یک فایل .env جدید ایجاد خواهیم کرد. لاراول با یک فایل example.env همراه است که می توانیم آن را کپی کنیم تا خود ایجاد کنیم:

cp .env.example .env 

با استفاده از nano یا ویرایشگر متن خود، این فایل را باز کنید:

nano .env 

فایل .env  فعلی از برنامه travellist شامل تنظیماتی برای استفاده از پایگاه داده MySQL لوکال با ip 127.0.0.1 به عنوان میزبان پایگاه داده است. ما باید متغیر DB_HOST را به روز کنیم تا به دیتابیس سرویسی که در محیط Docker ایجاد خواهیم کرد، اشاره کند. در این راهنما، ما سرویس دیتابیس خود db را فراخوانی خواهیم کرد. ادامه دهید و مقدار لیست شده DB_HOST را با نام database service جایگزین کنید:

.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 ما براساس image های پیش فرض به دست آمده از Docker Hub خواهد بود، ما هنوز هم باید یک custom image برای container برنامه ایجاد کنیم. ما یک Dockerfile جدید برای آن ایجاد خواهیم کرد.

travellist image ما بر اساس php:7.4-fpm از Docker Hub خواهد بود.  بالای محیط PHP-FPM، چند ماژول PHP و ابزار مدیریت وابستگی Composer نصب خواهیم کرد.

ما همچنین یک کاربر سیستم جدید ایجاد خواهیم کرد. این برای اجرای دستورات artisan و composer هنگام توسعه برنامه ضروری است. تنظیم uid باعث می شود که کاربر درون کانتینر همان uid کاربر سیستم شما را در host machine، جایی که شما Docker را اجرا می کنید، داشته باشد. به این ترتیب، هر فایل ایجاد شده توسط این دستورات با پرمیشن های صحیح در host تکرار می شود. این همچنین بدان معنی است که شما می توانید از code editor خود در ماشین میزبان برای توسعه برنامه ای که در داخل کانتینرها اجرا می شود استفاده کنید.

ایجاد یک 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 ما با تعریف image پایه شروع می شود:php:7.4-fpm.

پس از نصب پکیج های سیستمی و برنامه های افزودنی PHP، با کپی کردن composer executable از آخرین image رسمی آن در image برنامه خود، Composer را نصب می کنیم.

سپس یک کاربر سیستم جدید با استفاده از user و آرگومانهای uid ایجاد شده و تنظیم می شود که در ابتدای Dockerfile اعلام شده است. این مقادیر زمان build توسط Docker Compose وارد می شود.

در آخر، تنظیمات پیش فرض کار را به صورت / /var/www تنظیم کرده و به کاربر تازه ایجاد شده تغییر می دهیم. با این کار هنگام اجرای دستورات composer و artisan در کانتینر برنامه، اطمینان حاصل می کنید که به عنوان یک کاربر عادی در حال اتصال هستید و در دایرکتوری مناسبی قرار دارید.

مرحله 4 - تنظیم پیکربندی Nginx و Database Dump File ها

هنگام ایجاد محیط های توسعه با Docker Compose، برای راه اندازی مجدد آن سرویس ها، اغلب لازم است که فایلهای پیکربندی را با کانتینرها به اشتراک بگذارید.

اکنون یک فولدر با فایل هایی تنظیم می کنیم که برای پیکربندی و مقداردهی اولیه container ما استفاده می شود.

برای راه اندازی 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 به عنوان صفحه index پیش فرض استفاده کند. document root را روی /var/www/public تنظیم کرده و سپس Nginx را برای استفاده از سرویس app روی پورت 9000 برای پردازش فایل های *.php پیکربندی می کند.

پس از پایان ویرایش، فایل را ذخیره کرده و ببندید.

برای راه اندازی دیتابیس MySQL، ما یک دیتابیس را به اشتراک می گذاریم که هنگام راه اندازی اولیه container ایمپورت می شود. این یک ویژگی ارائه شده توسط MySQL 5.7 image است که ما در آن container استفاده خواهیم کرد.

یک فولدر جدید برای فایلهای اولیه MySQL خود در داخل فولدر docker-compose ایجاد کنید:

mkdir docker-compose/mysql 

یک فایل .sql جدید باز کنید:

nano docker-compose/mysql/init_db.sql 

MySQL زیر بر اساس پایگاه داده ای است که ما در Laravel on LEMP guide تنظیم کرده ایم. این یک جدول جدید به نام places ایجاد می کند. سپس، جدول را با مجموعه ای از place های نمونه پر می کند.

کد زیر را به فایل اضافه کنید:

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

ما راه اندازی Dockerfile و فایل های پیکربندی سرویس را به پایان رسانده ایم. در مرحله بعدی، Docker Compose را تنظیم می کنیم تا هنگام ایجاد سرویس های خود از این فایل ها استفاده کنیم.

مرحله 5 - ایجاد یک محیط چند کانتینر با Docker Compose

Docker Compose به شما امکان می دهد برای برنامه هایی که روی Docker اجرا می شوند، محیط های multi-container ایجاد کنید. از تعاریف سرویس برای ایجاد محیطهای کاملاً  customize  با چندین کانتینر استفاده می کند که می توانند شبکه ها و data volume ها را به اشتراک بگذارند.

برای تنظیم تعاریف سرویس، یک فایل جدید به نام docker-compose.yml ایجاد خواهیم کرد. به طور معمول، این فایل در root فولدر application قرار دارد و محیط کانتینر شما را تعریف می کند، از جمله image پایه ای که برای ساخت container های خود استفاده می کنید و نحوه تعامل سرویس های شما.

ما سه سرویس مختلف را در فایل docker-compose.yml تعریف خواهیم کرد: nginx، dbو app.

سرویس app براساس Dockerfile که قبلاً ایجاد کرده ایم image یی به نام travellist ایجاد خواهد کرد. کانتینر تعریف شده توسط این سرویس برای پارس کد PHP یک سرور php-fpm را اجرا می کند و نتایج را به سرویس nginx ارسال می کند که در یک container جداگانه اجرا می شود. سرویس mysql کانتینری را تعریف می کند که یک سرور MySQL 5.7 را اجرا می کند. سرویس های ما یک bridge network به نام travellist را به اشتراک خواهند گذاشت.

فایل های application از طریق bind mounts روی هر دو app و سرویس های nginx هماهنگ می شوند. bind mounts در محیط های توسعه مفید هستند زیرا امکان همگام سازی دو طرفه بین ماشین میزبان و کانتینرها را فراهم می کنند.

یک فایل جدید docker-compose.yml در root فولدر application ایجاد کنید:

nano docker-compose.yml 

یک فایل معمولی docker-compose.yml با یک تعریف version شروع می شود و به دنبال آن یک services node قرار می گیرد که همه سرویس های تحت آن تعریف می شوند. شبکه های مشترک معمولاً در پایین آن فایل تعریف می شوند.

برای شروع، این کد را در فایل docker-compose.yml خود کپی کنید:

docker-compose.yml
version: "3.7"
services:


networks:
  travellist:
    driver: bridge

اکنون services node را ویرایش می کنیم تا شامل app، db و nginx services شود.

app Service

سرویس app کانتینری به نام travellist-app راه اندازی می کند. یک Docker image جدید بر اساس Dockerfile واقع در همان مسیر فایل docker-compose.yml ایجاد می کند. image جدید به صورت لوکال و با نام travellist ذخیره می شود.

حتی اگر document root به عنوان برنامه در nginx container قرار دارد، ما به فایلهای برنامه در جایی از app container نیز نیاز داریم، بنابراین ما می توانیم تسک های خط فرمان را با ابزار Laravel Artisan اجرا کنیم.

تعریف سرویس زیر را در services node خود، داخل فایل 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 می گوید که با استفاده از مسیر مشخص (context) و Dockerfile برای دستورها، یک image لوکال برای سرویس app ایجاد کند. آرگومان های user و uid به Dockerfile وارد می شوند تا دستورات ایجاد کاربر زمان build را customize کنند.
  • image: نامی که برای image در حال ساخت استفاده خواهد شد.
  • container_name: نام کانتینر را برای این سرویس تنظیم می کند.
  • restart: همیشه راه اندازی مجدد شود، مگر اینکه سرویس قطع شود.
  • working_dir: دایرکتوری پیش فرض این سرویس را به صورت/var/www تنظیم می کند.
  • volumes: یک shared volume ایجاد می کند که content ها را از دایرکتوری جاری در/var/www درون کانتینر همگام سازی می کند. توجه داشته باشید که این document root شما نیست، زیرا در nginx container قرار دارد.
  • networks: این سرویس را تنظیم می کند تا از شبکه ای به نام travellist استفاده کند.

db Service

سرویس db از یک image از قبل ساخته شده MySQL 5.7 از Docker Hub استفاده می کند. از آنجا که Docker Compose به طور خودکار فایل های متغیر .env را که در همان دایرکتوری فایل docker-compose.yml قرار دارند لود می کند، می توانیم تنظیمات پایگاه داده خود را از فایل .env لاراول که در مرحله قبل ایجاد کردیم ، بدست آوریم.

درست بعد از سرویس app، تعریف سرویس زیر را در services node خود قرار دهید:

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 image از Docker Hub استفاده می کنیم.
  • container_name: نام کانتینر را برای این سرویس تنظیم می کند: travellist-db.
  • restart: این سرویس را همیشه راه اندازی کنید، مگر اینکه متوقف شود.
  • environment: متغیرهای محیط را در کانتینر جدید تعریف می کند. ما برای راه اندازی سرویس MySQL خود از مقادیر به دست آمده از فایل .env استفاده می کنیم که به طور خودکار یک دیتابیس و کاربر جدید بر اساس متغیرهای محیط ارائه شده ایجاد می کند.
  • volumes: والیومی را برای به اشتراک گذاردن دیتابیس .sql ایجاد می کند که برای مقداردهی اولیه دیتابیس برنامه استفاده خواهد شد. MySQL image به طور خودکار فایل های .sql را که در فولدر/docker-entrypoint-initdb.d قرار دارد در داخل کانتینر وارد می کند.
  • networks: این سرویس را تنظیم می کند تا از شبکه ای به نام travellist استفاده کند.

 nginx Service

سرویس nginx از یک Nginx image از پیش ساخته شده Alpine، توزیع سبک لینوکس استفاده می کند. کانتینری به نام travellist-nginx ایجاد می کند و از تعریف ports برای redirection از پورت 8000 روی ماشین میزبان به پورت 80 داخل کانتینر استفاده می کند.

درست بعد از سرویس db، تعریف سرویس زیر را در services node خود قرار دهید:

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 image استفاده می کنیم.
  • container_name: نام کانتینر را برای این سرویس تنظیم می کند: travellist-nginx.
  • restart: این سرویس را همیشه راه اندازی کنید، مگر اینکه متوقف شود.
  • ports: تغییر مسیر پورت را تنظیم می کند که به شما امکان دسترسی خارجی از طریق پورت 8000 به وب سروری را می دهد که روی پورت 80 داخل container قرار دارد.
  • volumes: دو volume مشترک ایجاد می کند. اولی، محتویات موجود را از دایرکتوری جاری در/var/www درون کانتینر همگام سازی می کند. به این ترتیب، وقتی تغییرات لوکال را در فایل های برنامه ایجاد می کنید، به سرعت در برنامه ای که توسط Nginx درون container ارائه می شود منعکس می کند. volume دوم اطمینان حاصل خواهد کرد که فایل پیکربندی Nginx ما، واقع در docker-compose/nginx/travellist.conf، در فولدر Nginx configuration کانتینر کپی شده است.
  • 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 برای ساخت image برنامه و اجرای سرویس هایی که در تنظیمات خود مشخص کرده ایم، استفاده خواهیم کرد.

app image را با دستور زیر ایجاد کنید:

docker-compose build app 

انجام این دستور ممکن است چند دقیقه طول بکشد. خروجی مشابه این را مشاهده خواهید کرد:

خروجی

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 

هنگامی که build به پایان رسید، می توانید environment را در حالت پس زمینه اجرا کنید:

docker-compose up -d 

خروجی

Creating travellist-db ... done Creating travellist-app ... done Creating travellist-nginx ... done 

با این کار کانتینرهای شما در پس زمینه اجرا می شوند. برای نمایش اطلاعات در مورد وضعیت سرویس های فعال خود،این دستور را اجرا کنید:

docker-compose ps 

خروجی مانند این را مشاهده خواهید کرد:

خروجی

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 

environment شما اکنون در حال اجرا است، اما ما هنوز هم برای انجام تنظیم برنامه باید چند دستور را اجرا کنیم. می توانید از دستور docker-compose exec برای اجرای دستورات در کانتینر های سرویس مانند ls -l که برای نمایش اطلاعات دقیق در مورد فایل ها در دایرکتوری application است، استفاده کنید:

docker-compose exec app ls -l 

خروجی

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 

خروجی مانند این را مشاهده خواهید کرد:

خروجی

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 است. این کلید برای رمزگذاری user session ها و سایر داده های حساس استفاده می شود:

docker-compose exec app php artisan key:generate 

خروجی

Application key set successfully. 

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

http://server_domain_or_IP:8000

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

صفحه ای به این شکل را مشاهده خواهید کرد:

Demo Laravel Application

برای بررسی لاگ های تولید شده توسط سرویس های خود می توانید از دستور 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 

خروجی

Pausing travellist-db ... done Pausing travellist-nginx ... done Pausing travellist-app ... done 

برای ادامه دادن می توانید از دستور زیر استفاده کنید:

docker-compose unpause 

خروجی

Unpausing travellist-app ... done Unpausing travellist-nginx ... done Unpausing travellist-db ... done 

برای خاموش کردن محیط Docker Compose و حذف همه کانتینرها، شبکه ها و volume ها، این دستور را اجرا کنید:

docker-compose down 

خروجی

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 command-line reference مراجعه کنید.

نتیجه

در این آموزش از بخش های مرتبط با داکر، ما یک Docker environment با سه کانتینر با استفاده از Docker Compose تنظیم کرده ایم تا زیرساخت های خود را در یک فایل YAML تعریف کنیم.

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

× در حال پاسخ به: