با استفاده از Docker-compose یک برنامه PHP مستقر کنید

برنامه های PHP معمولاً توسط یک سرور ، یک سیستم پایگاه داده رابطه و خود مفسر زبان تشکیل می شوند. در این آموزش ما با استفاده از داکر از یک پشته کامل برنامه PHP استفاده خواهیم کرد. این یک آموزش جامع است که در آن قصد داریم ظروف مخصوص Nginx (وب سرور) ، MySQL (سیستم پایگاه داده) و PHP ظروف مخصوص ارکستر را بسازیم.

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

این راهنما فرض می کند که شما Docker-CE را قبلاً نصب کرده اید و حداقل دانش کمی از داکر دارید. برای آن موضوع می توانید آموزشهای زیر را مرور کنید:

پیکربندی محیط کار ما

یک برنامه مبتنی بر داکر زندگی واقعی معمولاً از چندین ظروف تشکیل شده است. مدیریت این موارد به راحتی می تواند کاملاً کثیف و دست و پا گیر شود. این جایی است که docker-compose وارد بازی می شود. این کمک می کند تا تعدادی از ظروف را از طریق یک yamlفایل پیکربندی ساده مدیریت کنید.

docker-compose را نصب کنید.

curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

یک پوشه ایجاد کنید تا تمام پرونده های لازم از این مثال و سپس cdدرون آن قرار گیرد. از این پس این دایرکتوری کار ماست و هر دستور در داخل این پوشه اجرا می شود و هر مسیری نسبت به آن ارجاع می شود. این پوشه ممکن است بعداً به عنوان ارجاع داده شود WORKING_DIR.

mkdir ~/docker
cd ~/docker

اکنون سه پوشه دیگر ایجاد کنید.

mkdir php nginx app

این phpپوشه جایی است که ما می خواهیم تصویر PHP دلخواه خود را بسازیم ، nginxپوشه پرونده های لازم را برای تصویر nginx سفارشی ما نگه می دارد و appپوشه همان جایی است که ما می خواهیم کد منبع و پیکربندی برنامه نمونه خود را قرار دهیم.

پیکربندی ظرف PHP

در این مثال ، ما قصد داریم از آن php-fpmبرای اتصال به سرور Nginx استفاده کنیم. ما از تصویر پایه PHP رسمی استفاده خواهیم کرد. با این وجود ، ما همچنین باید برخی از برنامه های افزودنی را نصب و فعال کنیم تا بتوانیم به پایگاه داده دسترسی پیدا کنیم. در داخل phpپوشه پرونده ای به نام خود ایجاد کنید Dockerfileو مطالب زیر را در آن قرار دهید.

FROM php:7.1-fpm-alpine3.4
RUN apk update --no-cache \
    && apk add --no-cache $PHPIZE_DEPS \
    && apk add --no-cache mysql-dev \
    && docker-php-ext-install pdo pdo_mysql

توجه داشته باشید که ما از نسخه Alpine از تصویر رسمی PHP استفاده می کنیم. آلپاین یک توزیع بسیار کوچک است که با تهیه ردپای بسیار کوچکتر به سمت ظروف منتقل می شود. همچنین ، توجه داشته باشید که از دستور استفاده می کنید docker-php-ext-install، تصویر رسمی PHP این دستور را برای سهولت روند نصب و پیکربندی پسوندهای PHP فراهم می کند.

حال ، بیایید با انتشار موارد زیر (در داخل ما WORKING_DIR) این تصویر داکر را بسازیم :

docker build -t vultr-php php/

docker-compose.ymlفایل

همانطور که قبلاً نیز گفته شد ، docker-composeبه شما امکان می دهد تعدادی کانتینر را از طریق یک پرونده پیکربندی ساده مدیریت کنید. این پرونده پیکربندی به طور معمول نامگذاری می شود docker-compose.yml. این پرونده را درون appپوشه ایجاد کنید.

touch app/docker-compose.yml

اکنون مطالب زیر را در این پرونده قرار دهید.

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app

ما این نحو را توضیح خواهیم داد. ابتدا خط اول را یادداشت کنید.

version: '2'

این نسخه docker-compose.ymlپرونده پیکربندی مورد استفاده را مشخص می کند. خط بعدی خدمات یا به عبارت دیگر ظروف مورد نیاز را مشخص می کند.

services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app

توجه داشته باشید که هر سرویس دارای یک کلید خاص در داخل servicesبلوک است. از نام مشخص شده در اینجا برای مرجع این ظرف خاص بعدا استفاده می شود. همچنین توجه داشته باشید که در داخل phpپیکربندی ، تصویری را که برای اجرای ظرف استفاده می شود ، تعریف می کنیم (این تصویری است که قبلاً ساخته ایم). ما همچنین یک نقشه برداری از حجم را تعریف می کنیم.

volumes:
  - ./:/app

این می گوید docker-composeکه دایرکتوری فعلی ( ./) را در /appفهرست موجود درون ظرف قرار دهید. خط آخر /appپوشه داخل ظرف را به عنوان دایرکتوری کار تنظیم می کند ، به این معنی که این پوشه ای است که تمام دستورات آینده درون یک ظرف به طور پیش فرض از آن اجرا می شود.

اکنون می توانیم ظروف خود را ارکستر کنیم.

cd ~/docker/app
docker-compose up -d

می توانید دستور زیر را اجرا کنید تا مطمئن شوید که ظرف PHP اجرا شده است:

docker ps

نحوه اجرای دستورات داخل ظروف

هنوز در داخل appپوشه ، می توانیم با کمک دستور ، هر دستوری را درون یک ظرف سرویس تعریف شده اجرا کنیم docker-compose.

docker-compose exec [service] [command]

[service]حفره یا سوراخ به کلید خدمات اشاره دارد. در مورد ما ، این بود php. بیایید یک دستور در داخل ظرف اجرا کنیم تا نسخه PHP ما را بررسی کنیم.

docker-compose exec php php -v

خروجی زیر را مشاهده خواهید کرد.

PHP 7.1.14 (cli) (built: Feb  7 2018 00:40:45) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

پیکربندی ظرف Nginx

درست مانند ظرف PHP ، ما باید برای وب سرور یک تصویر دلخواه ایجاد کنیم. اما در این حالت ، فقط باید پیکربندی خود را ارائه دهیم virtual host. مطمئن شوید که داخل ما هستید WORKING_DIRو یک پوشه Dockerfileدر داخل ایجاد می nginxکنید:

cd ~/docker
touch nginx/Dockerfile

اکنون مطالب زیر را در این قرار دهید Dockerfile:

FROM nginx:1.13.8-alpine
COPY ./default.conf /etc/nginx/conf.d/default.conf

ما از تصویر پیش فرض Nginx بر اساس Alpine استفاده می کنیم. در این پرونده Docker ما به سادگی یک فایل پیکربندی را در تنظیم برنامه خود کپی می کنیم. قبل از ساختن این تصویر ، یک پرونده پیکربندی ایجاد کنید.

touch nginx/default.conf

اکنون آن را با این محتوا جمع کنید.

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /app;
    index index.php;

    #server_name server_domain_or_IP;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

توجه داشته باشید که در این fastcgi_pass php:9000خط ، ما به پرونده PHP با نام آن در serviceبلوک docker-compose.ymlپرونده پیکربندی اشاره می کنیم. به صورت داخلی docker-composeیک شبکه ایجاد می کند و نام سرویس را به عنوان نام میزبان به هر یک از سرویس های تعریف شده اختصاص می دهد. اکنون می توانیم تصویر Nginx را بسازیم.

docker build -t vultr-nginx nginx/

در حال بروز رسانی docker-compose.yml

اکنون app/docker-compose.ymlپرونده را به روز کنید.

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app
  web:
    image: vultr-nginx
    volumes:
      - ./:/app
    depends_on:
      - php
    ports:
      - 80:80

ما فقط سرویس جدیدی اضافه کرده ایم. پیکربندی تقریباً یکسان است ، به جز موارد زیر.

depends_on:
  - php
ports:
  - 80:80

هنگامی که ظرف Nginx به سرویس اولیه PHP نیاز دارد تا به طور کامل تنظیم شود ، ما این depends_onگزینه را در گزینه اعمال می کنیم. portsکلید پیکربندی نقشه های یک پورت میزبان را به یک بندر کانتینری، در اینجا ما پورت بر روی نقشه 80در میزبان به بندر 80در ظرف.

اکنون یک پرونده بنام index.phpداخل appپوشه ایجاد کرده و موارد زیر را در آن قرار دهید.

<?php phpinfo();

اطمینان حاصل کنید که درگاه 80از طریق فایروال شما قابل دسترسی است و موارد زیر را اجرا کنید.

cd ~/docker/app
docker-compose up -d

یک بار دیگر ، بررسی کنید که سرویس تمام شده است.

docker ps

مرورگر را باز کرده و به آن دسترسی پیدا کنید [vultr-instance-ip]. با اجرای موارد زیر می توانید آدرس IP نمونه Vultr خود را دریابید.

hostname -I

صفحه اطلاعات PHP را مشاهده خواهید کرد.

پیکربندی ظرف MySQL

تصویر MySQL رسمی به شما امکان می دهد ظرف را از طریق متغیرهای ساده محیط پیکربندی کنید. این کار را می توان با environmentگزینه ای در تعریف سرویس سرویس انجام داد. ~/docker/app/docker-compose.ymlپرونده را به شرح زیر به روز کنید.

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app
  web:
    image: vultr-nginx
    volumes:
      - ./:/app
    depends_on:
      - php
    ports:
      - 80:80
  mysql:
    image: mysql:5.7.21
    volumes:
      - ./:/app
      - dbdata:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=world
      - MYSQL_ROOT_PASSWORD=root
    working_dir: /app
volumes:
  dbdata:

اکنون ما سرویس جدیدی را برای پایگاه داده تعریف کرده ایم. به خط توجه کنید dbdata:/var/lib/mysql. این مسیر روی ظرف را /var/lib/mysqlبه یک حجم مداوم که توسط داکر کنترل می شود سوار می کند ، به این ترتیب داده های پایگاه داده پس از حذف کانتینر ادامه می یابد. این حجم باید همانطور که در انتهای پرونده مشاهده می کنید ، در یک بلوک سطح بالا تعریف شود.

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

curl -L http://downloads.mysql.com/docs/world.sql.gz -o world.sql.gz
gunzip world.sql.gz

اکنون اجازه می دهیم ظروفمان را تزیین کنیم.

docker-compose up -d

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

یک بار دیگر ، بررسی کنید که ظرف MySQL شروع شده است.

docker ps

اکنون پایگاه داده جهانی را جمع کنید.

docker-compose exec -T mysql mysql -uroot -proot world < world.sql

با انتخاب داده ها به طور مستقیم از پایگاه داده می توانید تأیید کنید که پایگاه داده جمع شده است. ابتدا به فوری MySQL داخل ظرف دسترسی پیدا کنید.

docker-compose exec mysql mysql -uroot -proot world

در MySQL سریع ، موارد زیر را اجرا کنید.

select * from city limit 10;

لیستی از شهرها را مشاهده خواهید کرد. اکنون از MySQL سریع خارج شوید.

mysql> exit

ساختن برنامه ما

اکنون که تمام ظروف مورد نیاز در حال کار هستند ، می توانیم روی برنامه نمونه خود تمرکز کنیم. app/index.phpپرونده را به شرح زیر به روز کنید.

<?php

$pdo = new PDO('mysql:host=mysql;dbname=world;charset=utf8', 'root', 'root');

$stmt = $pdo->prepare("
    select city.Name, city.District, country.Name as Country, city.Population
    from city
    left join country on city.CountryCode = country.Code
    order by Population desc
    limit 10
");
$stmt->execute();
$cities = $stmt->fetchAll(PDO::FETCH_ASSOC);

?>

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Vultr Rocks!</title>
</head>
<body>
    <h2>Most Populous Cities In The World</h2>
    <table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Country</th>
            <th>District</th>
            <th>Population</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach($cities as $city): ?>
            <tr>
                <td><?=$city['Name']?></td>
                <td><?=$city['Country']?></td>
                <td><?=$city['District']?></td>
                <td><?=number_format($city['Population'], 0)?></td>
            </tr>
        <?php endforeach ?>
    </tbody>
    </table>
</body>
</html>

اگر به [vultr-instance-ip]یک مرورگر وب دسترسی پیدا کنید ، لیستی از پرجمعیت ترین شهرهای جهان را مشاهده خواهید کرد. تبریک می گویم ، شما یک برنامه PHP کاملاً کار با استفاده از docker مستقر کرده اید.

نتیجه

در این آموزش ، من گام به گام نحوه پیکربندی یک برنامه PHP کاملاً کار را نشان داده ام. ما تصاویر دلخواه را برای PHP و Nginx ساخته ایم ، و docker-آهنگسازی را تنظیم کرده ایم تا ظروفمان را بسازیم. این مجموعه با وجود ابتکاری و ساده بودن ، یک سناریوی واقعی زندگی را نشان می دهد.

در این راهنما ، تصاویر خود را بصورت محلی ساخته و برچسب گذاری کرده ایم. برای تنظیم انعطاف پذیر تر ، می توانید این تصاویر را به ر��یستری داکر فشار دهید . شما می توانید به رجیستری داکر رسمی فشار دهید یا حتی رجیستری docker خود را تنظیم کنید. در هر صورت ، این به شما امکان می دهد تا تصاویر خود را روی یک میزبان بسازید و از آنها در دیگری استفاده کنید.

برای استفاده دقیق تر از آن docker-compose، باید به مستندات رسمی مراجعه کنید .

بسته به نیاز برنامه شما و چارچوب PHP که استفاده می کنید ، ممکن است بخواهید افزونه های بیشتری اضافه کنید. این کار را می توان به راحتی با اصلاح Dockerfileمورد استفاده برای ساخت تصویر PHP دلخواه ما انجام داد. با این حال ، برخی از برنامه های افزودنی نیاز به وابستگی های اضافی برای نصب در ظرف دارند. برای مرور الزامات اساسی هر پسوند باید به لیست برنامه های افزودنی در اسناد رسمی PHP مراجعه کنید .



Leave a Comment

نحوه نصب بستر سبد خرید LiteCart در اوبونتو 16.04

نحوه نصب بستر سبد خرید LiteCart در اوبونتو 16.04

LiteCart یک بستر سبد خرید آزاد و منبع باز است که به زبان های PHP ، jQuery و HTML 5 نوشته شده است. این نرم افزار ساده ، سبک و با کاربرد آسان است.

نحوه نصب Anchor CMS بر روی یک VPS Fedora 26 LAMP

نحوه نصب Anchor CMS بر روی یک VPS Fedora 26 LAMP

با استفاده از یک سیستم متفاوت؟ Anchor CMS یک سیستم مدیریت محتوا (CMS) بسیار ساده و بسیار سبک ، بسیار آزاد و آزاد است.

اشتراک NFS را در Debian تنظیم کنید

اشتراک NFS را در Debian تنظیم کنید

NFS یک سیستم فایل مبتنی بر شبکه است که به رایانه ها اجازه می دهد تا از طریق شبکه رایانه ای به فایلها دسترسی پیدا کنند. این راهنما توضیح می دهد که چگونه می توانید پوشه ها را روی NF قرار دهید

نحوه بروزرسانی CentOS 7 ، Ubuntu 16.04 و Debian 8

نحوه بروزرسانی CentOS 7 ، Ubuntu 16.04 و Debian 8

هنگام راه اندازی سرور جدید لینوکس ، به روزرسانی سیستم های هسته و سایر بسته ها تا آخرین نسخه پایدار یک روش توصیه شده است. در این مقاله

نحوه نصب Matomo Analytics در Fedora 28

نحوه نصب Matomo Analytics در Fedora 28

با استفاده از یک سیستم متفاوت؟ Matomo (سابقا پیویک) یک بستر تحلیلی منبع باز است ، یک جایگزین باز برای Google Analytics. منبع Matomo میزبان o

یک سرور TeamTalk را در لینوکس تنظیم کنید

یک سرور TeamTalk را در لینوکس تنظیم کنید

TeamTalk یک سیستم کنفرانس است که به کاربران امکان می دهد مکالمات صوتی / تصویری با کیفیت بالا ، چت متنی ، انتقال فایل ها و صفحه های به اشتراک بگذارند. من

با استفاده از کلید SSH خود برای ورود به کاربران غیر ریشه استفاده کنید

با استفاده از کلید SSH خود برای ورود به کاربران غیر ریشه استفاده کنید

Vultr یک ویژگی را فراهم می کند که به شما امکان می دهد با ایجاد یک نمونه جدید ، کلیدهای SSH را از قبل نصب کنید. این اجازه می دهد تا به کاربر root دسترسی داشته باشید ، با این حال ، th

نحوه نصب انجمن NodeBB در FreeBSD 12

نحوه نصب انجمن NodeBB در FreeBSD 12

با استفاده از یک سیستم متفاوت؟ NodeBB یک نرم افزار انجمن مبتنی بر Node.js است. از سوکت های وب برای تعامل فوری و اعلامیه های زمان واقعی استفاده می کند. NodeB

نصب و راه اندازی ZNC در اوبونتو

نصب و راه اندازی ZNC در اوبونتو

ZNC یک پیشرانه پیشرفته شبکه IRC است که تمام وقت بهم متصل می شود تا مشتری IRC بتواند بدون از دست دادن جلسه گپ قطع یا وصل شود.

نحوه نصب Ranger Terminal File Manager در لینوکس

نحوه نصب Ranger Terminal File Manager در لینوکس

رنجر یک مدیر فایل مبتنی بر خط فرمان است که دارای کلیدهای اتصال VI است. این برنامه یک رابط لعنتی مینیمالیستی و زیبا با نمای سلسله مراتب فهرست ارائه می دهد