كيفية إعداد Docker لمشروع Symfony

Docker هو مزارع سريع في تطوير البرمجيات مفتوحة المصدر. اتبع خطواتنا البسيطة لإعداد بيئة Docker بسهولة في مشروعك.

ما هو بالضبط عامل الميناء؟

لنبدأ في البداية ونوضح قليلاً ما هو عامل الميناء. بعبارة بسيطة ، عامل الإرساء هو وحدة قياسية من البرامج مستقلة عن مضيفها. يسهل النظام الأساسي المفتوح Docker للمطورين إنشاء التطبيقات وتشغيلها داخل حاويات بدلاً من الأجهزة الافتراضية ، مما يضيف طبقة من التجريد. الحاوية عبارة عن لوحة تجريدية في طبقة التطبيق التي تقوم بتجميع الكود والتبعيات معًا ، وبالتالي التخلص من النسخة الكاملة من نظام التشغيل.

قبل البدء في بناء بيئتنا ، تحتاج إلى تثبيت صورة Docker و Docker.

الهيكل

دعونا نحدد بنية بيئة Docker لدينا:

لدينا 4 مجلدات وأول واحد - build - هو المسؤول عن تخزين المعلومات حول كل من عمال النقل الذين سيعيشون في حاوياتنا. الثانية - سجلات - سوف تستخدم لتخزين ملف السجل من NGINX و PHP. سيقوم مجلد mysql بتخزين قاعدة البيانات بطريقة دائمة في المضيف ، وأخيرا يستضيف مجلد symfony تثبيت Symfony.

داخل مجلد التصميم ، لنبدأ بإنشاء مجلدين ، أحدهما لـ NGINX و PHP آخر:

عامل ميناء NGINX

داخل مجلد NGINX ، دعونا نقوم بإنشاء ملف يسمى Dockerfile ، والذي سيستضيف الحزم اللازمة:

من ديبيان: تمتد
RUN apt-get update && apt-get install -y nginx vim nano
COPY nginx.conf /etc/nginx/nginx.conf
إضافة مواقع تمكين / الخ / nginx / تمكين المواقع
RUN / RM / الخ / nginx / تمكين المواقع / الافتراضي
WORKDIR / var / www / html / symfony
كشف 80
كشف 443
CMD ["nginx"]

شرح قليلاً ، كل من الأوامر الأساسية المعلنة داخل ملف Docker لدينا:

  • FROM هو تحديد الصورة التي سيتم بناء عامل النقل عليها ، وفي حالتنا ، سأستخدم أحدث إصدار من Ubuntu ،
  • يستخدم RUN لتنفيذ الأمر داخل عامل الميناء ،
  • سوف COPY نسخ ملف معين من المضيف إلى عامل ميناء ،
  • سوف ADD نسخ مجلد معين من المضيف إلى عامل ميناء ،
  • يتم استخدام WORKDIR لتحديد المجلد الأساسي داخل عامل الميناء ،
  • يحدد EXPOSE المنافذ التي ستكون متاحة للاتصال من المضيف إلى الضيف ،
  • CMD هي المسؤولة عن تنفيذ الأمر / الأمر.

في ملف عامل الميناء هذا ، سنقوم بتثبيت حزم NGINX على صور Ubuntu وسنقوم بنسخ ملف nginx.conf من المضيف وإضافة محتوى تمكين مواقع المجلدات وأخيراً تنفيذ NGINX.

داخل ملف nginx.conf لدينا ما يلي:

مستخدم شبكة الاتصالات العالمية البيانات ؛
pid /run/nginx.pid؛
العاملون 1
الخفي قبالة
أحداث
        worker_connections 768؛
        # multi_accept on؛
}
http {
        client_max_body_size 20M ؛
        ##
        # الإعدادات الأساسية
        ##
        sendfile على.
        tcp_nopush على ؛
        tcp_nodelay on؛
        keepalive_timeout 65؛
        types_hash_max_size 2048؛
        # server_tokens قبالة ؛
        # server_names_hash_bucket_size 64؛
        # server_name_in_redirect off ؛
        include /etc/nginx/mime.types؛
        default_type application / octet-stream؛
        ##
        # إعدادات SSL
        ##
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2؛ # اسقاط SSLv3 ، المرجع: POODLE
        ssl_prefer_server_ciphers on؛
        ##
        # إعدادات التسجيل
        ##
        access_log /var/log/nginx/access.log؛
        error_log /var/log/nginx/error.log ؛
        ##
        # إعدادات Gzip
        ##
        gzip على ؛
        gzip_disable "msie6"؛
        gzip_vary on؛
        gzip_proxied any؛
        gzip_comp_level 6؛
        gzip_buffers 16 8k؛
        gzip_http_version 1.1؛
        gzip_types text / نص عادي / تطبيق css / تطبيق json / javascript text / xml application / xml application / xml + rss text / javascript؛
        ##
        # الظاهري المضيفات Configs
        ##
        include /etc/nginx/conf.d/*.conf؛
        include / etc / nginx / sites-enable / *؛
}

عادةً ما يكون هذا هو أساس ملف nginx.conf ، باستثناء التشغيل على عملية واحدة ، نظرًا للعمل المنفَّذ وتشغيله في المقدمة مع إيقاف تشغيل البرنامج الخفي ؛

داخل المجلد الذي يدعم المواقع ، سيكون لدينا ملف فريد يسمى default_symfony مع ما يلي:

الخادم {
    اسم الخادم _؛
    root / var / www / html / symfony / web؛
    موقعك / {
        # محاولة لخدمة الملف مباشرة ، والرجوع إلى app.php
        try_files $ uri /app_dev.php$is_args$args؛
    }
    # DEV
    # يجب وضع هذه القاعدة فقط على بيئة التطوير الخاصة بك
    # في الإنتاج ، لا تقم بتضمين هذا ولا تنشر app_dev.php أو config.php
    الموقع ~ ^ / (app_dev | config) \. php (/ | $) {
        fastcgi_pass php: 9000؛
        fastcgi_split_path_info ^ (. + \. php) (/.*) $؛
        تشمل fastcgi_params ؛
        # عند استخدام الارتباطات لربط جذر المستند بـ
        # الإصدار الحالي من التطبيق الخاص بك ، يجب أن تمر الحقيقي
        # مسار التطبيق بدلاً من المسار إلى الارتباط بـ PHP
        # FPM.
        # على خلاف ذلك ، قد لا يكشف OPcache لـ PHP عن التغييرات التي تم إجراؤها بشكل صحيح
        # ملفات PHP الخاصة بك (راجع https://github.com/zendtech/ZendOptimizerPlus/issues/126
        # للمزيد من المعلومات).
        fastcgi_param SCRIPT_FILENAME $ realpath_root $ fastcgi_script_name؛
        fastcgi_param DOCUMENT_ROOT $ realpath_root؛
    }
    # PROD
    الموقع ~ ^ / app \ .php (/ | $) {
        fastcgi_pass php: 9000؛
        fastcgi_split_path_info ^ (. + \. php) (/.*) $؛
        تشمل fastcgi_params ؛
        # عند استخدام الارتباطات لربط جذر المستند بـ
        # الإصدار الحالي من التطبيق الخاص بك ، يجب أن تمر الحقيقي
        # مسار التطبيق بدلاً من المسار إلى الارتباط بـ PHP
        # FPM.
        # على خلاف ذلك ، قد لا يكشف OPcache لـ PHP عن التغييرات التي تم إجراؤها بشكل صحيح
        # ملفات PHP الخاصة بك (راجع https://github.com/zendtech/ZendOptimizerPlus/issues/126
        # للمزيد من المعلومات).
        fastcgi_param SCRIPT_FILENAME $ realpath_root $ fastcgi_script_name؛
        fastcgi_param DOCUMENT_ROOT $ realpath_root؛
        # يمنع URIs التي تشمل وحدة تحكم أمامية. هذا سوف 404:
        # http: //domain.tld/app.php/some-path
        # قم بإزالة التوجيه الداخلي للسماح بمعرفات المستخدمين مثل هذا
        داخلي؛
    }
    # return 404 لجميع ملفات php الأخرى التي لا تتطابق مع وحدة التحكم الأمامية
    # هذا يمنع الوصول إلى ملفات php الأخرى التي لا تريد أن تكون قابلة للوصول.
    الموقع ~ \ .php $ {
        عودة 404 ؛
    }
    error_log /var/log/nginx/error.log ؛
    access_log /var/log/nginx/access.log؛
}

هذا الملف هو تكوين Symfony الافتراضي لـ NGINX ، باستثناء fastcgi_pass php: 9000. سيُعلم هذا NGINX باستخدام PHP من مضيف PHP.

PHP عامل ميناء

داخل مجلد PHP ، لنقم بإنشاء ملف يسمى Dockerfile ، والذي سيستضيف الحزم الضرورية:

من أوبونتو: 17.10
RUN apt-get update && apt-get install -my \
  لفة \
  wget \
  فب حليقة \
  php-fpm \
  php-gd \
  php-xsl \
  php-mysqlnd \
  php-mcrypt \
  فب- CLI \
  فب إنتل \
  php-bz2 \
  فب الرمز البريدي \
  php-mbstring \
  شخص سخيف \
  الرمز البريدي \
  php-apcu \
  فب ريديس \
  فب-opcache
RUN mkdir / run / php
ADD conf / www.conf /etc/php/7.1/fpm/pool.d/www.conf
ADD conf / php-fpm.conf /etc/php/7.1/fpm/php-fpm.conf
RUN php -r "copy ('https://getcomposer.org/installer'، 'composer-setup.php')؛"
RUN php composer-setup.php
RUN php -r "إلغاء الربط ('composer-setup.php')؛"
RUN mv composer.phar / usr / local / bin / composer
RUN chmod + x / usr / local / bin / composer
RUN ln -snf / usr / share / zoneinfo / Europe / Lisbon / etc / localtime
WORKDIR / var / www / html / symfony
كشف 9000
CMD ["php-fpm7.1"]

في ملف عامل الميناء هذا ، سنقوم بتثبيت حزم PHP على صورة Ubuntu مع الملحن وسنقوم بنسخ ملفات www.conf و php-fpm.conf من المضيف وإضافة محتوى مجلدات الضيف.

داخل www.conf إضافة

[شبكة الاتصالات العالمية]
المستخدم = شبكة الاتصالات العالمية البيانات
مجموعة = شبكة الاتصالات العالمية البيانات
الاستماع = 0.0.0.0:9000
listen.owner = www-data
listen.group = www-data
مساء = ديناميكي
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /

وملف php-fpm.conf

[عالمي]
pid = /run/php/php7.1-fpm.pid
error_log = /var/log/php7.1-fpm.log
شيطان = لا
تشمل = / الخ / فب / 7.1 / التيار الوطني الحر / pool.d / *. أسيوط

ويتم التكوين الأساسي لهذا Dockerfile ، التي ستستضيف PHP.

عامل الميناء يؤلف (الموصل)

أخيرًا ، سيكون ملف docker-compose.yml مسؤولاً عن توصيل جميع عمال الإرساء بشبكة محلية ، داخل هذا الملف ، سيكون لدينا:

الإصدار: 3
خدمات:
  فب:
    بناء: بناء / فب
    تعرض:
      - "9000"
    يعتمد على:
      - ديسيبل
    أحجام:
      - ./:/var/www/html/symfony: مخبأة
      - ./logs:/var/log
  على شبكة الإنترنت:
    بناء: بناء / إنجن إكس
    إعادة التشغيل: دائما
    الموانئ:
        - 81: 80 '
    يعتمد على:
        - فب
        - ديسيبل
    أحجام:
        - ./:/var/www/html/symfony: مخبأة
        - ./logs:/var/log/nginx
  ديسيبل:
    الصورة: mysql / mysql-server: الأحدث
    بيئة:
      - MYSQL_DATABASE = $ {MYSQL_DATABASE}
      - MYSQL_ROOT_PASSWORD = $ {MYSQL_ROOT_PASSWORD}
      - MYSQL_ROOT_HOST = $ {MYSQL_ROOT_HOST}
    الموانئ:
      - "3307: 3306"
    أحجام:
      - ./mysql:/var/lib/mysql

سيكون لدينا 3 رصيف ، أحدهما ل php the سوف يعرض المنفذ 9000 ليتم استهلاكه بواسطة nginx والتعامل مع ملفات php. آخر لـ nginx ، يُطلق عليه web والذي سيُعرِّض por 81 للمضيف ليكون قادرًا على الوصول إلى حاوية عامل الميناء وآخر ديسيبل ، والذي سيتم تشغيل mysql.

لبدء البيئة ، ستحتاج إلى تشغيل الأمر:

بناء عامل ميناء - الإنشاء

من شأنها أن تبني الحاويات.

تذكر إضافة مشروعك إلى مجلد Symfony أو ببساطة تشغيل:

عامل ميناء دولار يؤلف

لبدء شبكة عامل ميناء.

الآن ، كل ما عليك فعله هو فتح متصفحك على العنوان http: // localhost: 81.

كما ترون ، هذا ليس بالأمر الصعب! آمل أن يكون هذا الدليل مفيدًا ويجعل أيام المطورين أسهل.

بقلم بيدرو ريسيندي | مدير تطوير البرمجيات وقائد الفريق في Cleverti

تم نشر هذا المقال في الأصل على مدونة Cleverti