نشر تطبيق PHP باستخدام Docker-compose

عادة ما تتكون تطبيقات PHP من خادم ويب ونظام قاعدة بيانات علائقية ومترجم لغة نفسه. في هذا البرنامج التعليمي ، سنستفيد من مجموعة تطبيقات PHP الكاملة باستخدام عامل إرساء. هذا هو برنامج تعليمي متعمق سنقوم فيه بإنشاء وتنسيق حاويات لـ Nginx (خادم الويب) و MySQL (نظام قاعدة البيانات) و PHP.

من أجل هذا البرنامج التعليمي ، سنكتب تطبيقًا بسيطًا يقرأ قائمة المدن من قاعدة بيانات ويعرضها على صفحة ويب ، وبهذه الطريقة سنعرض تطبيق PHP أساسي ، ولكنه عامل.

يفترض هذا الدليل أن لديك Docker-CE مثبتة بالفعل وأن يكون لديك على الأقل الحد الأدنى من المعرفة العملية عن عامل الميناء. لهذه المسألة يمكنك مراجعة الدروس التالية:

تكوين بيئة العمل لدينا

عادة ما يتكون التطبيق القائم على عامل الميناء الحقيقي من عدة حاويات. يمكن أن تصبح إدارة هذه يدويًا بسهولة فوضويًا ومرهقًا. وهنا يأتي دور إنشاء عامل الميناء. يساعدك على إدارة عدد من الحاويات من خلال 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سوف تعقد مجلد الملفات الضرورية لصورتنا إنجن إكس العرف و 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

لاحظ أننا نستخدم نسخة جبال الألب من صورة PHP الرسمية. Alpine هو توزيع صغير للغاية يستهدف الحاويات عن طريق توفير آثار أقدام أصغر بكثير. لاحظ أيضًا استخدام الأمر docker-php-ext-install، حيث توفر صورة PHP الرسمية هذا الأمر لتسهيل عملية تثبيت ملحقات PHP وتكوينها.

الآن ، دعنا نبني صورة Docker هذه من خلال إصدار ما يلي (داخل موقعنا 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إلى وحدة تخزين ثابتة يديرها Docker ، وبهذه الطريقة تستمر بيانات قاعدة البيانات بعد إزالة الحاوية. يجب تحديد وحدة التخزين هذه في كتلة المستوى الأعلى كما ترى في نهاية الملف.

قبل تنسيق تكويننا الجديد ، لنقم بتنزيل نموذج لقاعدة بيانات 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-compose، يجب الرجوع إلى الوثائق الرسمية .

بناءً على متطلبات التطبيق وإطار عمل PHP الذي تستخدمه ، قد ترغب في إضافة المزيد من الإضافات. يمكن القيام بذلك بسهولة عن طريق تعديل Dockerfileالمستخدمة لبناء صورة PHP المخصصة لدينا. ومع ذلك ، تحتاج بعض الإضافات إلى تثبيت تبعيات إضافية في الحاوية. يجب عليك الرجوع إلى قائمة الإضافات في وثائق PHP الرسمية لمراجعة المتطلبات الأساسية لكل ملحق.



Leave a Comment

نظرة ثاقبة على 26 أسلوبًا لتحليل البيانات الضخمة: الجزء الأول

نظرة ثاقبة على 26 أسلوبًا لتحليل البيانات الضخمة: الجزء الأول

نظرة ثاقبة على 26 أسلوبًا لتحليل البيانات الضخمة: الجزء الأول

6 أشياء شديدة الجنون حول نينتندو سويتش

6 أشياء شديدة الجنون حول نينتندو سويتش

يعرف الكثير منكم أن Switch سيصدر في مارس 2017 وميزاته الجديدة. بالنسبة لأولئك الذين لا يعرفون ، قمنا بإعداد قائمة بالميزات التي تجعل "التبديل" "أداة لا غنى عنها".

وعود التكنولوجيا التي لم يتم الوفاء بها بعد

وعود التكنولوجيا التي لم يتم الوفاء بها بعد

هل تنتظر عمالقة التكنولوجيا للوفاء بوعودهم؟ تحقق من ما تبقى دون تسليم.

وظائف طبقات معمارية مرجعية للبيانات الضخمة

وظائف طبقات معمارية مرجعية للبيانات الضخمة

اقرأ المدونة لمعرفة الطبقات المختلفة في بنية البيانات الضخمة ووظائفها بأبسط طريقة.

كيف يمكن للذكاء الاصطناعي نقل أتمتة العمليات إلى المستوى التالي؟

كيف يمكن للذكاء الاصطناعي نقل أتمتة العمليات إلى المستوى التالي؟

اقرأ هذا لمعرفة مدى انتشار الذكاء الاصطناعي بين الشركات الصغيرة وكيف أنه يزيد من احتمالات نموها ومنح منافسيها القدرة على التفوق.

CAPTCHA: ما هي المدة التي يمكن أن تظل تقنية قابلة للتطبيق للتميز بين الإنسان والذكاء الاصطناعي؟

CAPTCHA: ما هي المدة التي يمكن أن تظل تقنية قابلة للتطبيق للتميز بين الإنسان والذكاء الاصطناعي؟

لقد أصبح حل CAPTCHA صعبًا جدًا على المستخدمين في السنوات القليلة الماضية. هل ستكون قادرة على أن تظل فعالة في اكتشاف البريد العشوائي والروبوتات في المستقبل القريب؟

التفرد التكنولوجي: مستقبل بعيد للحضارة الإنسانية؟

التفرد التكنولوجي: مستقبل بعيد للحضارة الإنسانية؟

مع تطور العلم بمعدل سريع ، واستلام الكثير من جهودنا ، تزداد أيضًا مخاطر تعريض أنفسنا إلى تفرد غير قابل للتفسير. اقرأ ، ماذا يمكن أن يعني التفرد بالنسبة لنا.

التطبيب عن بعد والرعاية الصحية عن بعد: المستقبل هنا

التطبيب عن بعد والرعاية الصحية عن بعد: المستقبل هنا

ما هو التطبيب عن بعد والرعاية الصحية عن بعد وأثره على الأجيال القادمة؟ هل هو مكان جيد أم لا في حالة الوباء؟ اقرأ المدونة لتجد طريقة عرض!

هل تساءلت يومًا كيف يربح المتسللون الأموال؟

هل تساءلت يومًا كيف يربح المتسللون الأموال؟

ربما سمعت أن المتسللين يكسبون الكثير من المال ، لكن هل تساءلت يومًا كيف يجنون هذا النوع من المال؟ دعنا نناقش.

يتسبب التحديث الإضافي لنظام macOS Catalina 10.15.4 في حدوث مشكلات أكثر من حلها

يتسبب التحديث الإضافي لنظام macOS Catalina 10.15.4 في حدوث مشكلات أكثر من حلها

أصدرت Apple مؤخرًا macOS Catalina 10.15.4 تحديثًا تكميليًا لإصلاح المشكلات ولكن يبدو أن التحديث يتسبب في المزيد من المشكلات التي تؤدي إلى إنشاء أجهزة macOS. قراءة هذه المادة لمعرفة المزيد