لفهم أفضل للمواد التالية ، يوصى بقراءة
المنشور السابق أولاً
النظر في مثال على تطوير بيئة محلية تتألف من مجموعة من Nginx + PHP + MySql + phpMyAdmin. تحظى هذه الحزمة بشعبية كبيرة ويمكنها تلبية عدد من الاحتياجات القياسية للمطور العادي.
كما في المنشور السابق ، سيتم تحويل التركيز نحو الأداة المساعدة لرسو السفن بدلاً من عامل الإرساء في أنقى صوره.
لذلك دعونا نذهب!
لنبدأ بـ docker-compose.yml ، الموجود في مجلد وكيل منفصل:
عامل ميناء compose.yml ل nginx الوكيلversion: '3.0' services: proxy: image: jwilder/nginx-proxy ports: - 80:80 volumes: - /var/run/docker.sock:/tmp/docker.sock:ro networks: - proxy networks: proxy: driver: bridge
يصف الملف المقدم التكوين الخاص بإنشاء حاوية واحدة باستخدام
وكيل الاسم استنادًا إلى
الصورة: صورة jwilder / nginx-proxy وإنشاء شبكة بنفس الاسم. يشير توجيه
الشبكات إلى الشبكات التي تتصل بها الحاوية ، في هذا المثال ، هذه هي شبكة الخادم الوكيل لدينا.
عند إنشاء شبكة ، برنامج التشغيل: يمكن حذف توجيه الجسر. برنامج تشغيل الجسر هو برنامج التشغيل الافتراضي. ستتواصل هذه الحاوية عبر الشبكة مع حاويات أخرى.
تعد صورة jwilder / nginx-proxy أساسية ويتم التقاطها ، كما يوفر
Docker Hub وصفًا واسعًا ومفصلًا إلى حد ما لاستخدامه. يعد مبدأ تشغيل nginx-proxy بسيطًا للغاية: فهو يصل إلى معلومات حول تشغيل الحاويات من خلال مأخذ توصيل عامل إعادة التوجيه ، ويحلل وجود متغير بيئة باسم VIRTUAL_HOST ويعيد توجيه الطلبات من المضيف المحدد إلى الحاوية التي تم تعيين متغير البيئة لها.
نبدأ الوكيل باستخدام الأمر up -d المعروف بالفعل لرسو السفن ، ونلاحظ الإخراج التالي:
Creating network "proxy_proxy" with driver "bridge" Creating proxy_proxy_1 ... done
يعلمنا هذا الاستنتاج أنه في البداية تم إنشاء شبكة proxy_proxy ، ثم تم إنشاء الحاوية proxy_proxy_1. يتم الحصول على اسم الشبكة من اسم المجلد الذي يوجد به ملف docker-compose.yml ، ولدي وكيل واسم شبكة يحمل نفس الاسم.
إذا أدخلت أمر
docker network ls ، فسنرى قائمة بشبكات docker في نظامنا ويجب أن يكون أحدها proxy_proxy.
تم بناء اسم الحاوية على نفس مبدأ اسم المجلد بالإضافة إلى اسم الخدمة ورقمها ، مما يسمح بعدم تكرار الحاويات التي تحمل أسماء مشابهة.
باستخدام توجيه
الحاوية ، يمكنك تحديد اسم الحاوية بشكل صريح ، لكنني أجد أن هذه وظيفة غير مجدية. سيتم مناقشة هذا بمزيد من التفصيل في الوظائف التالية.
قم بإنشاء عامل إرساء ثاني compose.yml بالمحتوى التالي:
docker-compose.yml للخدمات الأخرى version: '3.0' services: nginx: image: nginx environment: - VIRTUAL_HOST=site.local depends_on: - php volumes: - ./docker/nginx/conf.d/default.nginx:/etc/nginx/conf.d/default.conf - ./html/:/var/www/html/ networks: - frontend - backend php: build: context: ./docker/php volumes: - ./docker/php/php.ini:/usr/local/etc/php/php.ini - ./html/:/var/www/html/ networks: - backend mysql: image: mysql:5.7 volumes: - ./docker/mysql/data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: root networks: - backend phpmyadmin: image: phpmyadmin/phpmyadmin:latest environment: - VIRTUAL_HOST=phpmyadmin.local - PMA_HOST=mysql - PMA_USER=root - PMA_PASSWORD=root networks: - frontend - backend networks: frontend: external: name: proxy_proxy backend:
ما أعلن هنا؟
يتم سرد أربع خدمات: nginx ، php ، mysql و phpmyadmin. وشبكتين. يتم الإعلان عن شبكة وكيل واحدة ، تسمى الواجهة الأمامية ، كشبكة خارجية وشبكة خلفية داخلية جديدة. لم يتم تحديد برنامج التشغيل الخاص به ، كما كتبت سابقًا ، سيتم استخدام برنامج التشغيل الافتراضي من نوع الجسر.
إنجن إكس
كل شيء يجب أن يكون واضحا هنا. نحن نستخدم الصورة الأساسية مع لوحة الوصل. متغير البيئة ضروري لكي يعمل البروكسي ويخبره على العنوان الذي يجب أن تكون الحاوية قابلة للوصول إليه. يشير الخيار depend_on إلى اعتماد هذه الحاوية على حاوية php. هذا يعني أنه سيتم إطلاق حاوية php مسبقًا ، وبعدها سيتم إطلاق حاوية nginx التي تعتمد عليها. بعد ذلك ، نعيد توجيه التكوين الخاص بـ nginx. سيكون أقل قليلا وتثبيت المجلد مع أتش تي أم أل. نلاحظ أيضًا أن الحاوية لديها حق الوصول إلى شبكتين في وقت واحد. يجب أن يتصل كل من الوكلاء من شبكة الواجهة الأمامية و php من شبكة الواجهة الخلفية. من حيث المبدأ ، سيكون من الممكن نقل جميع الحاويات في نفس شبكة الواجهة الأمامية ، لكنني أؤكد أن هذا الفصل أكثر صحة.
default.nginx server { listen 80; server_name_in_redirect off; access_log /var/log/nginx/host.access.log main; root /var/www/html/; location / { try_files $uri /index.php$is_args$args; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php: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 ~ /\.ht { deny all; } }
default.nginx هو تكوين لـ nginx يتم توجيهه إلى الحاوية. النقطة الأساسية هنا هي توجيه
fastcgi_pass php: 9000 . يحدد عنوان خادم FastCGI. يمكن تحديد العنوان كاسم مجال أو عنوان IP ، ومنفذ.
php: 9000 - اسم الخدمة هو عنوان خادم FastCGI. سيتلقى Nginx الوصول إلى php عنوان IP للحاوية التي يتم تشغيل php فيها. المنفذ 9000 هو منفذ قياسي ، ويتم الإعلان عنه عند إنشاء الحاوية الأساسية. يتوفر هذا المنفذ لـ nginx عبر الشبكة ، ولكنه غير متاح على الجهاز المضيف ، لأنه لم تتم إعادة توجيهه.
فب
من غير المألوف عدم الإشارة إلى الصورة. بدلاً من ذلك ، يقوم بإنشاء صورته الخاصة مباشرةً من ملف الإنشاء. يشير توجيه السياق إلى المجلد الذي يوجد فيه Dockerfile.
Dockerfile FROM php:7.3.2-fpm RUN apt-get update && apt-get install -y \ libzip-dev \ zip \ && docker-php-ext-configure zip --with-libzip \ && docker-php-ext-install zip \ && docker-php-ext-install mysqli COPY --from=composer:latest /usr/bin/composer /usr/bin/composer WORKDIR /var/www/html
ينص Dockerfile على أن البنية تستخدم صورة php الأساسية: 7.3.2 - fpm ، ثم يتم تشغيل أوامر تثبيت ملحقات php. بعد ذلك ، يتم نسخ الملحن من صورة أساسية أخرى وتعيين دليل العمل للمشروع. سأنظر في مشكلات التجميع بمزيد من التفصيل في المشاركات الأخرى.
أيضًا ، يتم طرح ملف php.ini ومجلد html مع مشروعنا داخل الحاوية.
لاحظ أن php موجود على الشبكة الخلفية ، على سبيل المثال ، لم يعد بإمكان الوكيل الوصول إليها.
ك
يتم التقاط صورة mysql الأساسية مع علامة 5.7 ، وهي المسؤولة عن إصدار mysql. يتم استخدام المجلد ./docker/mysql/data لتخزين ملفات قاعدة البيانات (لا تحتاج حتى إلى إنشائه ، بل يتم إنشاؤه عند بدء التشغيل). ومن خلال متغيرات البيئة ، يتم تعيين كلمة المرور للمستخدم الجذر ، وكذلك الجذر.
تقع قاعدة البيانات على الشبكة الخلفية ، مما يسمح لها بالبقاء على اتصال مع php. تستخدم الصورة الأساسية المنفذ القياسي 3306. وهي متوفرة على شبكة عامل النقل من أجل php ، ولكنها غير متوفرة على الجهاز المضيف. إذا قمت بإعادة توجيه هذا المنفذ ، فيمكنك الاتصال به ، على سبيل المثال ، من نفس PHPSTORM. ولكن إذا كانت واجهة phpmyadmin كافية لك ، فلا يمكنك القيام بذلك.
بريس
الصورة الرسمية ل phpmyadmin. تستخدم متغيرات البيئة VIRTUAL_HOST للتفاعل مع الوكيل ، على غرار nginx. الوصول PMA_USER و PMA_PASSWORD إلى قاعدة البيانات. و PMA_HOST قاعدة البيانات المضيفة نفسها. ولكن هذا ليس مضيف محلي ، كما هو الحال عادة ، ولكن mysql. أي التواصل مع قاعدة البيانات متاح باسم خدمتها ، أي ماي. يمكن للحاوية phpmyadmin التواصل مع قاعدة البيانات ، لأنه يحتوي على اتصال بشبكة الواجهة الأمامية.
نبدأ الخدمات بالأمر المعتاد: docker-compose -d.
نرى الإخراج التالي:
إطلاق الخدمة Creating network "lesson2_backend" with the default driver Building php Step 1/4 : FROM php:7.3.2-fpm ---> 9343626a0f09 Step 2/4 : RUN apt-get update && apt-get install -y libzip-dev zip && docker-php-ext-configure zip --with-libzip && docker-php-ext-install zip && docker-php-ext-install mysqli ---> Using cache ---> 5e4687b5381f Step 3/4 : COPY --from=composer:latest /usr/bin/composer /usr/bin/composer ---> Using cache ---> 81b9c665be08 Step 4/4 : WORKDIR /var/www/html ---> Using cache ---> 3fe8397e92e6 Successfully built 3fe8397e92e6 Successfully tagged lesson2_php:latest Pulling mysql (mysql:5.7)... 5.7: Pulling from library/mysql fc7181108d40: Already exists 787a24c80112: Already exists a08cb039d3cd: Already exists 4f7d35eb5394: Already exists 5aa21f895d95: Already exists a742e211b7a2: Already exists 0163805ad937: Already exists 62d0ebcbfc71: Pull complete 559856d01c93: Pull complete c849d5f46e83: Pull complete f114c210789a: Pull complete Digest: sha256:c3594c6528b31c6222ba426d836600abd45f554d078ef661d3c882604c70ad0a Status: Downloaded newer image for mysql:5.7 Creating lesson2_php_1 ... done Creating lesson2_mysql_1 ... done Creating lesson2_phpmyadmin_1 ... done Creating lesson2_nginx_1 ... done
نرى أنه في البداية يتم إنشاء شبكة lesson2_backend ، ثم يتم تجميع صورة php ، ثم يمكن تنزيل الصور غير الموجودة بالفعل في النظام (السحب) وتشغيل الخدمات الموصوفة بالفعل.
اللمسة الأخيرة ، بحيث يعمل كل شيء ، هذه الإضافة إلى المضيفين أو المواقع. المحلية و phpmyadmin.local المجالات.
قد تكون محتويات index.php كما يلي:
هنا نتحقق من أن اتصال امتداد php - mysqli ، الذي تمت إضافته أثناء تجميع Dockerfile ، صحيح.
ولاحظ أنه للاتصال بالحاوية ، يتم استخدام اسم الخدمة - mysql.
كان هيكل المشروع بأكمله على النحو التالي:
هيكل المشروع habr/lesson2$ tree . ├── docker │ ├── mysql │ │ └── data │ ├── nginx │ │ └── conf.d │ │ └── default.nginx │ └── php │ ├── Dockerfile │ └── php.ini ├── docker-compose.yml ├── html │ └── index.php └── proxy └── docker-compose.yml