منذ وقت ليس ببعيد ، قال قائد الفريق: شباب أريد أن يحصل الجميع على نفس بيئة التطوير لمشاريعنا القتالية + يجب أن نكون قادرين على تصحيح كل شيء - كل من تطبيقات الويب وطلبات api والبرامج النصية للتحكم من أجل توفير أعصابنا ووقتنا. ومساعدتنا مع هذا عامل الميناء.
لم يقل قال من القيام به. التفاصيل تحت خفض.
هناك العديد من كتيبات الحاويات على الشبكة ، ولكن كيف يمكن تطبيقها على التطوير القتالي الحقيقي؟ لكل مشروع ، اكتب عامل الإرساء الخاص بك compose.yml؟ لكن جميع مشاريعنا تتواصل مع بعضها البعض من خلال api ، فإنها تستخدم جميعها كومة التقنية القياسية: nginx + php-fpm + mysql.
لذلك ، دعونا نوضح شروط المشكلة:
- نحن نعمل في شركة ، في فريق ، نرافق العديد من المشاريع القتالية. كلنا نعمل تحت Ubuntu + PhpStorm
- للتطوير المحلي ، نريد استخدام عامل النقل من أجل الحصول على نفس بيئة التطوير لكل عضو في الفريق ، وأيضًا حتى يتمكن مطور جديد من الوصول إلى بيئة عمل بسرعة
- نريد أن نطور بكل راحة ونريد أن نظهر لأول مرة في كل شيء: كل من تطبيقات الويب والبرامج النصية لوحدة التحكم وطلبات api.
مرة أخرى: نريد جلب
العديد من مشاريع العمل إلى عامل الميناء.
على خوادم القتال ، يتم استخدام حزمة nginx + php-fpm + mysql القياسية. وما هي المشكلة؟
نقوم بنشر نفس البيئة بالضبط + Xdebug على الجهاز المحلي ، وتكوين مشاريعنا في PhpStorm ، والعمل. للتصحيح ، قم بتشغيل "الأنبوب" في PhpStorm ، كل شيء يعمل خارج الصندوق ، كل شيء على ما يرام.

كل هذا صحيح - كل شيء يعمل خارج الصندوق. ولكن ، دعونا نحاول أن ننظر تحت غطاء بيئة العمل لدينا.
يتواصل Nginx + php-fpm من خلال المقبس ، يستمع xdebug على المنفذ 9000 ، كما يستمع PhpStorm ، افتراضيًا ، إلى المنفذ 9000 لتصحيح الأخطاء ويبدو أن كل شيء على ما يرام. وإذا كان لدينا العديد من التطبيقات المفتوحة في PhpStorm ، وتم تمكين التنصت على المكالمات الهاتفية ("الأنبوب") لعدة تطبيقات؟ ماذا سيفعل PhpStorm؟ سيبدأ أقسم أنه تم اكتشاف اتصال جديد لـ Xdebug ، هل ترغب في تجاهله أم لا؟
وهذا هو ، مع الإعدادات الافتراضية في PhpStorm ، في وقت معين من الوقت ، يمكنني الظهور لأول مرة تطبيق واحد فقط. بالنسبة لجميع التطبيقات المفتوحة الأخرى ، يجب إيقاف تشغيل debug. اللعنة ، لكنه غير مريح. أرغب في الاستماع إلى جميع تطبيقات تصحيح الأخطاء ، وإذا كان هناك نقطة توقف في أحدها ، فأريد إيقاف PhpStorm في هذا التطبيق ، على الخط الذي أحتاج إليه.
وما هو المطلوب لهذا؟ لكنك تحتاج إلى أن يبدأ كل تطبيق بالإعدادات الخاصة به لـ Xdebug. بحيث يستمع كل تطبيق إلى المنفذ الخاص به ، ويبحث عن الخادم الخاص به ، وليس كما لو أن لدينا كل شيء مشترك ، كل ذلك في كومة واحدة.
ولهذا هناك عامل ميناء رائع! يمكننا تشغيل كل تطبيق من تطبيقاتنا القتالية في حاوية منفصلة ، بناءً على صورة واحدة مشتركة ، على سبيل المثال ، php: 7.1-fpm. بفضل تقنية عامل الميناء ، يمكننا عزل تطبيقاتنا بأقل قدر ممكن من الحمل.
حسنًا ، دعنا نبدأ مشاريعنا القتالية تحت عامل الميناء ، قم بتشغيل كل مشروع في حاوية منفصلة ، وقم بتكوين كل مشروع في PhpStorm لتصحيحه بشكل فردي ، يجب أن يكون كل شيء على ما يرام.
و ، عفوًا ، المشكلة الأولى: يتم تشغيل الحاويات الموجودة في عامل الإرساء كجذر ، ونعمل محليًا ، عادةً كمستخدم لديه معرّف مستخدم واحد ، 1000 معرّف gid 1000. التطبيقات تقاتل ، ومنح حقوق كل تطبيق 777 لكل شيء ليس خيارًا. تطبيقاتنا موجودة تحت البوابة ، وإذا منحنا الحقوق 777 محليًا ، فستقوم البوابة بتسجيل كل ذلك ونقلها إلى خادم المعركة.
العكازات ، هنا هو مثال على صورة php: 7.1 - fpm التي سيتم تجميعها.
تحديث
كما أشار المجتمع بحق ، ليست هناك حاجة مطلقًا للعكازات بقوة.
على سبيل المثال 1ntrovert
habrozer في التعليقمثال لصورة php الأولية: 7.1-fpm (معرف المستخدم و gid مشفران)FROM php:7.1-fpm RUN apt-get update && apt-get install -y \ git \ curl \ wget \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev zlib1g-dev libicu-dev g++ libmagickwand-dev libxml2-dev \ && docker-php-ext-configure intl \ && docker-php-ext-install intl \ && docker-php-ext-install mbstring zip xml gd mcrypt pdo_mysql \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd \ && pecl install imagick \ && docker-php-ext-enable imagick \ && pecl install xdebug \ && docker-php-ext-enable xdebug ADD ./php.ini /usr/local/etc/php/php.ini RUN wget https:
تصحيح Dockerfile مثال
FROM php:7.1-fpm ARG USER_ID ARG GROUP_ID RUN apt-get update && apt-get install -y \ git \ curl \ wget \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev zlib1g-dev libicu-dev g++ libmagickwand-dev --no-install-recommends libxml2-dev \ && docker-php-ext-configure intl \ && docker-php-ext-install intl \ && docker-php-ext-install mbstring zip xml gd mcrypt pdo_mysql \ && pecl install imagick \ && docker-php-ext-enable imagick \ && pecl install xdebug-2.5.0 \ && docker-php-ext-enable xdebug ADD ./php.ini /usr/local/etc/php/php.ini RUN wget https://getcomposer.org/installer -O - -q \ | php -- --install-dir=/bin --filename=composer --quiet RUN usermod -u ${USER_ID} www-data && groupmod -g ${GROUP_ID} www-data WORKDIR /var/www USER "${USER_ID}:${GROUP_ID}" CMD ["php-fpm"]
عند بدء تشغيل الحاوية من هذه الصورة ، يحصل المستخدم على www www على معرف مستخدم = 1000 ، gid = 1000. عادةً ما يكون لدى المستخدم الأول الذي تم إنشاؤه على Linux هذه الحقوق. وبالضبط مع هذه الحقوق ستعمل حاويات php-fpm الخاصة بنا. سأكون ممتنًا جدًا لو أخبرني أحدهم عن كيفية العمل دون عكازات مع حقوق الوصول إلى عامل الميناء.عند بدء تشغيل حاوية من هذه الصورة ، يحصل مستخدم www-data على معرف مستخدم وسرد ، وسيتم نقلهما من الخارج.
أيضًا في التعليقات ، تم طرح الموضوع : لماذا تغير حقوق مستخدم www-data على الإطلاق ، لماذا لا تتناسب الحقوق القياسية مع 33. شيء واحد فقط: عندما ندخل في الحاوية وننشئ ، على سبيل المثال ، ملف ترحيل ، لن نكون مالك الملف على الجهاز المضيف. وفي كل مرة سيكون من الضروري تشغيل شيء من هذا القبيل
sudo chown -R user:user ./
والمشكلة الصغيرة الثانية: لكي يعمل Xdebug بشكل صحيح ، يجب عليك تسجيل عنوان IP الصحيح للجهاز المضيف. كل عضو في الفريق مختلف. 127.0.0.1 لا لفة. وهنا يأتي عامل الميناء نفسه لمساعدتنا. على سبيل المثال ، يمكننا تهيئة الشبكة بشكل صريح - 192.168.220.0/28. ثم سيكون لدينا الجهاز دائما عنوان 192.168.220.1. سنستخدم هذا العنوان لتكوين PhpStorm ، وكذلك لتهيئة التطبيقات الأخرى. على سبيل المثال ، عند العمل مع MySql.
Docker-compose.yml نفسه ، بعد النظر في التعليقات ، يبدو كما يلي:
version: '3' services: php71-first: build: context: ./images/php71 args: - USER_ID - GROUP_ID volumes: - ./www:/var/www - ./aliases/php71/bash.bashrc:/etc/bash.bashrc environment: XDEBUG_CONFIG: "remote_host=192.168.220.1 remote_enable=1 remote_autostart=off remote_port=9008" PHP_IDE_CONFIG: "serverName=first" networks: - test-network php71-two: build: context: ./images/php71 args: - USER_ID - GROUP_ID volumes: - ./www:/var/www - ./aliases/php71/bash.bashrc:/etc/bash.bashrc environment: XDEBUG_CONFIG: "remote_host=192.168.220.1 remote_enable=1 remote_autostart=off remote_port=9009" PHP_IDE_CONFIG: "serverName=two" networks: - test-network nginx-test: image: nginx volumes: - ./hosts:/etc/nginx/conf.d - ./www:/var/www - ./logs:/var/log/nginx ports: - "8080:80" depends_on: - php71-first - php71-two networks: test-network: aliases:
نرى أنه في هذا التكوين ، يتم إنشاء حاويتين php71-first و php71-two ، استنادًا إلى صورة php واحدة: 7.1-fpm. كل حاوية لها إعداداتها الخاصة ل Xdebug. سوف تستمع كل حاوية فردية ، لتصحيح الأخطاء ، إلى منفذها وخادمها.
أيضا ، أود أن ألفت انتباهكم إلى التوجيهات
args: - USER_ID - GROUP_ID
بدون هذه المتغيرات ، لن تبدأ صورة php-fpm. السؤال: كيفية تمريرها إلى عامل ميناء compose.yml؟ الجواب: لأنها أكثر ملاءمة لك. يمكنك عند بدء التشغيل:
USER_ID=$(id -u) GROUP_ID=$(id -g) docker-compose up -d
يمكنك كتابة هذه المتغيرات في ملف .env ، والذي يقع على نفس مستوى ملف docker-compose.yml
USER_ID=1000
GROUP_ID=1000
أنا أحب الإصدار مع ملف .env أكثر. بالطبع ، يمكنك استخدام Makefile. كما تحب أكثر.
يتم نشر الرمز الكامل للنسخة التجريبية على
جيثب .
سرد المشروع التجريبي:

انتقل لفترة وجيزة على قائمة المشروع.
الأسماء المستعارة -> php71 -> دليل bash.bashrc. لحظة مثيرة للجدل. أفضل التواصل مع حاويات php-fpm من خلال الأسماء المستعارة.
يتم إعادة توجيه هذا الملف إلى docker-compose.yml: - ./aliases/php71/bash.bashrc:/etc/bash.bashrc
أداة لينكس القياسية.
دليل المضيفين - ملفات التكوين ل Nginx. كل التكوين لديه حاوية php-fpm الخاصة به. مثال:
server { listen 80; index index.php; server_name first.loc; error_log /var/log/nginx/first_error.log; root /var/www/first.loc; location / { try_files $uri /index.php?$args; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$;
دليل الصور - تعليمات لتجميع صور php-fpm ، دليل mysql - نقوم بتخزين قواعد البيانات ، دليل www - جميع مشاريعنا على الويب ، في مثالنا first.loc و two.loc.
دعونا نلخص النتائج الوسيطة : باستخدام قدرات عامل الميناء ، أطلقنا جميع مشاريعنا العاملة في بيئة واحدة. جميع مشاريعنا ترى بعضنا البعض ، يتم تسجيل الإعدادات الفريدة لـ Xdebug لكل مشروع.
يبقى تكوين PhpStorm بشكل صحيح لكل من المشاريع. عند الإعداد ، يجب أن نسجل منفذ التصحيح واسم الخادم في عدة أماكن.
إنشاء مشروع في PhpStorm



سنقوم بتكوين أقسام القائمة
- PHP (يجب عليك تسجيل CLI مترجم بشكل صحيح) ،
- تصحيح (تغيير المنفذ إلى 9008 ، كما هو الحال في ملف docker-compose.yml) ،
- وكيل DBGp (مفتاح IDE ، المضيف ، المنفذ) ،تحديث بفضل
متصفح محور CrazyLazy للحصول على نقطة مهمة. لا يلزم تكوين عنصر قائمة وكيل DBGp.
- الخوادم (يجب عليك تحديد اسم الخادم بشكل صحيح ، كما هو الحال في ملف docker-compose.yml ، واستخدام تعيينات المسار)

سوف أخفي جميع لقطات أخرى تحت المفسد.
توصيف مترجم CLI من ملف docker-compose.yml قم بإعداد قسم قائمة تصحيح الأخطاءمرة أخرى ، نحن نصف كل شيء من إعدادات عامل الإرساء compost.yml لحاوية معينة. في نفس الخطوة ، نقوم بالتحقق من كيفية عمل تصحيح الأخطاء الخاص بنا.


قم بإعداد قسم قائمة الخوادممن المهم تسجيل استخدام تعيينات المسار بشكل صحيح ، مرة أخرى نأخذ اسم الخادم من الإعدادات


نترك قسم القائمة ملف -> إعدادات ، انتقل إلى قسم القائمة تشغيل -> تحرير التكوين ، إنشاء صفحة ويب Php حسنا ، هذا كل شيء. هو مكتوب الكثير من الحروف ، يبدو أن كل شيء ليس بالأمر السهل
في الواقع ، الشيء الرئيسي هو فهم شيء بسيط للغاية. بفضل تقنية الإرساء ، يمكننا تشغيل جميع تطبيقات العمل الخاصة بنا في مساحة واحدة ، ولكن باستخدام إعدادات مختلفة لـ Xdebug. يعمل كل تطبيق في حاوية خاصة به ، وعلينا أن نصف بدقة الإعدادات لكل تطبيق في PhpStorm.
وعند الخروج نحصل على صورة رائعة.
1. نحن استنساخ مستودع على
جيثب . إنشاء ملف .env مع المتغيرات
USER_ID= uid
GROUP_ID= gid
2. نقوم بتسجيل العقد first.loc و two.loc في الملف / etc / hosts
127.0.0.1 first.loc 127.0.0.1 two.loc
3. في مجلد git ، قم بتشغيل
docker-compose up -d
4. نقوم بتهيئة كلا المشروعين أولاً. loc و two.loc في PhpStorm ، كما هو موضح أعلاه ، وتشغيل كلا المشروعين في PhpStorm. أي لدينا نافذة PhpStorm مفتوحة ، مع مشروعين ، كل واحد منهم يستمع للاتصالات الواردة (الهاتف قيد التشغيل).
5. في المشروع two.loc نضع نقطة توقف في الثانية ، على سبيل المثال ، السطر. في المشروع الأول first.loc ، نبدأ طلب http من الملف http.http
وها! لقد تم طرحنا في المشروع الثاني ، عند نقطة توقفنا.
لتصحيح البرامج النصية وحدة التحكم ، ونحن نفعل الشيء نفسه تماما. نقوم بتشغيل التنصت على المكالمات الهاتفية ، وتحديد نقطة توقف ، والانتقال إلى الحاوية الصحيحة ، وتشغيل البرنامج النصي الصحيح.
شيء مثل:
alex@alex-Aspire-ES1-572 ~ $ php71first www-data@a0e771cfac72:~$ cdf www-data@a0e771cfac72:~/first.loc$ php index.php I'am first host www-data@a0e771cfac72:~/first.loc$
حيث php71first هو الاسم المستعار على الجهاز المضيف:
alias php71first="cd ~/docker_git && docker-compose exec php71-first bash"
cdf
- اسم مستعار يعمل في حاوية. كتبت أعلاه أنني أفضل استخدام الأسماء المستعارة للتواصل مع الحاويات.
هذا كل شيء ، النقد البناء ، التعليقات مرحب بها.
ملحوظة: أود أن أعرب عن عميق امتناني
لدينس بوندار
لمقاله PhpStorm + Docker + Xdebug ، الذي كان نقطة الانطلاق لكتابة هذا البرنامج التعليمي.