PHP एप्लिकेशन को कंटेनरीकृत करना
प्रोडक्शन के लिए तैयार PHP Dockerfile लिखें।
PHP एप्लिकेशन को कंटेनरीकृत करना, CoddyKit पर PHP Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह PHP Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। PHP Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
PHP को कंटेनर में क्यों रखें
PHP को पुनरुत्पाद्य ढंग से वितरित करने का अर्थ है कि अपने कोड के साथ सटीक व्याख्याकार संस्करण, एक्सटेंशन और OS लाइब्रेरी को भी स्थिर करना। डॉकर इमेज हर वातावरण — लैपटॉप, सीआई और उत्पादन — को समान php -v और समान ext-* सेट देती है।
इस पाठ में हम उत्पादन के लिए तैयार इमेज बनाएँगे: PHP-FPM, केवल आवश्यक एक्सटेंशन, अनुकूलित विन्यास, रूट के अलावा उपयोगकर्ता और स्वास्थ्य जाँच।
FPM बनाम अपाचे आधार
आधिकारिक PHP इमेजें कई रूपों में आती हैं। नगिन्क्स/ट्रैफ़िक के पीछे चलने वाले उत्पादन वेब अनुप्रयोग के लिए php:8.3-fpm-alpine (छोटी) या php:8.3-fpm (डेबियन, ग्लिबसी — मूल लाइब्रेरी के साथ कम अप्रत्याशित समस्याएँ) को प्राथमिकता दें।
cli— कार्यकर्ता, कतारें और क्रॉनfpm— FastCGI प्रक्रिया प्रबंधक, नगिन्क्स के साथ उपयोग करेंapache— शामिल अपाचे, सुविधाजनक लेकिन अधिक भारी
लघु संस्करण निश्चित करें। उत्पादन में :latest का कभी उपयोग न करें।
# Base image choice in your Dockerfile
FROM php:8.3-fpm-alpine AS base
# Why alpine? ~30MB base vs ~140MB Debian.
# Tradeoff: musl libc, occasional native-extension friction.एक्सटेंशन स्थापित करना
इन इमेजों के अंदर कभी apt install php-xxx न चलाएँ — साथ दिए गए सहायक docker-php-ext-install, docker-php-ext-configure और pecl का उपयोग करें। install-php-extensions स्क्रिप्ट (एमलोकाती) व्यवहार में मानक संक्षिप्त तरीका है, जो आपके लिए सही विकास हेडर ले आती है।
FROM php:8.3-fpm-alpine
# Grab the helper that resolves build deps automatically
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions && \
install-php-extensions \
pdo_mysql \
opcache \
intl \
zip \
redis \
bcmathइमेज में कम्पोज़र
किसी इंस्टॉलर को कर्ल करने के बजाय कम्पोज़र बाइनरी उसकी आधिकारिक इमेज से कॉपी करें। उत्पादन के लिए composer install को --no-dev और --optimize-autoloader के साथ चलाएँ, और पहले केवल composer.json/composer.lock कॉपी करें, ताकि निर्भरता-परत स्रोत बदलावों से स्वतंत्र रूप से कैश हो सके।
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /app
# Cache-friendly: deps layer invalidates only when lock changes
COPY composer.json composer.lock ./
RUN composer install \
--no-dev \
--no-scripts \
--no-autoloader \
--prefer-dist
COPY . .
RUN composer dump-autoload --optimize --classmap-authoritativephp.ini को अनुकूलित करना
आधार इमेज में php.ini-production और php.ini-development टेम्पलेट दिए जाते हैं। उत्पादन वाला सक्रिय करें, फिर अपने बदलाव conf.d में रखें — यह निर्देशिका अंत में मिलाई जाती है, इसलिए उसी की प्राथमिकता रहती है।
उत्पादन के मुख्य मान: opcache.enable=1, opcache.validate_timestamps=0 (इमेज में अपरिवर्तनीय कोड) और उचित memory_limit।
# Activate production ini
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
# Custom overrides win because conf.d loads last
COPY docker/php/zz-app.ini $PHP_INI_DIR/conf.d/zz-app.iniओपकैश ओवरराइड फ़ाइल
उत्पादन में यह सबसे बड़ा लाभ देने वाला एकल बदलाव है। validate_timestamps=0 के साथ PHP हर अनुरोध पर फ़ाइलों की स्थिति नहीं जाँचता — लेकिन इसका अर्थ है कि बदलाव तैनात करने के लिए आपको इमेज फिर से बनानी MUST है (और अपरिवर्तनीय कंटेनरों के लिए हम ठीक यही चाहते हैं)।
; docker/php/zz-app.ini
memory_limit = 256M
expose_php = Off
opcache.enable = 1
opcache.enable_cli = 0
opcache.memory_consumption = 256
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 20000
opcache.validate_timestamps = 0
opcache.preload = /app/preload.php
opcache.preload_user = www-dataरूट के बिना चलाएँ
इमेज में पहले से www-data परिभाषित है। FPM को रूट के रूप में चलाना हमले का क्षेत्र अनावश्यक रूप से बढ़ाता है। लिखने योग्य पथों (कैश, लॉग) का स्वामित्व निर्धारित करें और CMD से पहले USER के साथ उपयोगकर्ता बदलें।
क्या FPM की मुख्य प्रक्रिया अभी भी विशेषाधिकार-युक्त पोर्ट बाँधती है? नहीं — FPM 9000 पर बिना विशेषाधिकार के सुनता है, इसलिए रूट के बिना चलाना सीधा है।
# Make runtime-writable dirs owned by the runtime user
RUN chown -R www-data:www-data /app/var /app/storage 2>/dev/null || true
USER www-data
EXPOSE 9000
CMD ["php-fpm"]स्वास्थ्य जाँच
समन्वयकों को यह संकेत चाहिए कि FPM वास्तव में सक्रिय है, केवल यह नहीं कि प्रक्रिया मौजूद है। cgi-fcgi FPM के /status या /ping समापन-बिंदु को पिंग कर सकता है। पहले FPM प्रक्रिया-समूह में pm.status_path और ping.path सक्रिय करें।
# In www.conf pool config:
; ping.path = /ping
; ping.response = pong
# Dockerfile HEALTHCHECK using cgi-fcgi
RUN install-php-extensions @composer >/dev/null 2>&1 || true
HEALTHCHECK --interval=10s --timeout=3s --retries=3 \
CMD SCRIPT_NAME=/ping SCRIPT_FILENAME=/ping REQUEST_METHOD=GET \
cgi-fcgi -bind -connect 127.0.0.1:9000 || exit 1Dockerfile को एक साथ तैयार करना
यह एक सुसंगत, सिंगल-स्टेज प्रोडक्शन Dockerfile है। अगले पाठ में हम बिल्ड टूल हटाने के लिए इसे मल्टी-स्टेज में बाँटेंगे। क्रम पर ध्यान दें: निर्भरताएँ → कॉन्फ़िगरेशन → स्रोत कोड → ऑटोलोड → उपयोगकर्ता बदलना।
FROM php:8.3-fpm-alpine
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions && \
install-php-extensions pdo_mysql opcache intl zip redis
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /app
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
COPY docker/php/zz-app.ini $PHP_INI_DIR/conf.d/
COPY composer.json composer.lock ./
RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist
COPY . .
RUN composer dump-autoload --optimize --classmap-authoritative && \
chown -R www-data:www-data /app/var
USER www-data
EXPOSE 9000
CMD ["php-fpm"]निर्माण की जाँच करना
निर्माण के बाद बुनियादी जाँच करें कि इमेज में वास्तव में क्या शामिल हुआ है: PHP का संस्करण, लोड किए गए एक्सटेंशन और OPcache सत्यापन बंद है या नहीं। एक छोटी CLI स्क्रिप्ट उस रनटाइम अनुबंध की पुष्टि करती है जिस पर आपका ऐप निर्भर करता है।
<?php
// Run inside the container: php verify.php
echo 'PHP ' . PHP_VERSION . PHP_EOL;
$required = ['pdo_mysql', 'opcache', 'intl', 'zip'];
foreach ($required as $ext) {
printf("%-12s %s\n", $ext, extension_loaded($ext) ? 'OK' : 'MISSING');
}
var_dump((bool) ini_get('opcache.enable'));
?>निर्माण संदर्भ की स्वच्छता
एक .dockerignore आपके निर्माण संदर्भ को छोटा रखता है और सीक्रेट्स तथा vendor की अनावश्यक बढ़ोतरी को इमेज में जाने और कैश को अमान्य करने से रोकता है। vendor, VCS, env फ़ाइलों और स्थानीय टूलिंग को बाहर रखें।
# .dockerignore
.git
.gitignore
vendor/
node_modules/
.env
.env.*
tests/
*.md
docker-compose*.yml
storage/logs/*
var/cache/*त्वरित जाँच
प्रोडक्शन इमेज में opcache.validate_timestamps=0 क्यों सेट करें?
पुनरावलोकन
आपने एक प्रोडक्शन PHP-FPM इमेज बनाई: निश्चित 8.3-fpm-alpine बेस, इंस्टॉलर स्क्रिप्ट के माध्यम से केवल आवश्यक एक्सटेंशन इंस्टॉल किए, Composer और कैश की गई निर्भरताओं को अपनी अलग लेयर में कॉपी किया, OPcache ओवरराइड के साथ प्रोडक्शन php.ini सक्रिय की, www-data पर उपयोगकर्ता बदला और FPM हेल्थ चेक जोड़ा।
मुख्य आदतें: संस्करण निश्चित करें, निर्भरता वाली लेयर को कैश करें, रूट उपयोगकर्ता के बिना चलाएँ, टाइमस्टैम्प सत्यापन बंद करें और .dockerignore से निर्माण संदर्भ को हल्का रखें।
एआई शिक्षक के साथ PHP सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 49
- पाठ
- 195
अक्सर पूछे जाने वाले प्रश्न
क्या “PHP एप्लिकेशन को कंटेनरीकृत करना” पाठ निःशुल्क है?
हाँ—“PHP एप्लिकेशन को कंटेनरीकृत करना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और PHP Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। PHP Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“PHP एप्लिकेशन को कंटेनरीकृत करना” में मैं क्या सीखूँगा?
प्रोडक्शन के लिए तैयार PHP Dockerfile लिखें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ PHP Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या PHP Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर PHP Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“PHP एप्लिकेशन को कंटेनरीकृत करना” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस PHP Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर PHP Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- PHP एप्लिकेशन को कंटेनरीकृत करना
- बहु-चरणीय बिल्ड और अनुकूलन
- स्थानीय स्टैक के लिए Docker Compose
- GitHub Actions के साथ CI/CD