کانتینرهای Docker برنامه شما را در بین محیط‌ها قابل حمل می‌کنند. هنگامی‌که یک image کانتینر به دست آوردید، شما می‌توانید از آن در هر جایی که Docker در آن نصب شده باشد، استفاده نمایید. در این مقاله، نحوه containerize کردن یک برنامه وب PHP به همراه سرور آپاچی آورده شده است.

 

در اینجا، از image رسمی PHP Docker به عنوان پایگاه خود استفاده خواهیم کرد که انواع پیش پیکربندی‌ها با سرور آپاچی را ارائه کرده است؛ بنابراین نیازی به نصب وب سرور ندارید. علاوه‌براین، image پایه PHP ابزارهای مفیدی را برای مدیریت برنامه‌های دیگر PHP ارائه می‌دهد.

 

این مطلب نیز ممکن است برای شما مفید باشد: ایجاد و اجرای Docker Image با استفاده از Dockerfile

 

ایجاد Dockerfile

imageهای Docker از یک Dockerfile ایجاد می‌شوند. این فایل حاوی دستورالعمل‌هایی است که برای ساخت image استفاده می‌شود. دستورالعمل‌ها عبارتند از COPY، برای کپی کردن فایل‌ها و پوشه‌ها در کانتینر، و RUN که دستوری را در کانتینر اجرا می‌کند.

شما می‌توانید یک سایت ساده PHP را با کپی کردن فایل‌های آن در یک image مبتنی بر php:8.0-apache اجرا نمایید.

FROM php:8.0-apache
WORKDIR /var/www/html

COPY index.php index.php
COPY src/ src
EXPOSE 80

این Dockerfile، فایل‌های index.php و src را از دایرکتوری فعلی ما گرفته و آن‌ها را در دایرکتوری root آپاچی کپی می‌کند. اکنون شما می‌توانید image را ساخته و یک container از آن راه‌اندازی نمایید. در این صورت مشاهده خواهید کرد که سایت شما توسط آپاچی سرویس دهی می‌شود.

docker build -t my-php-site:latest .
docker run -d -p 80:80 my-php-site:latest

imageهای PHP Docker دارای دایرکتوری root آپاچی در مسیر پیش‌فرض دبیان /var/www/html هستند. دستور WORKDIR در Dockerfile به این معنی است که دستورات بعدی در مسیر root اجرا خواهند شد.

Apache خود را برروی پورت پیش فرض وب سرور (یعنی 80) نشان می‌دهد. دستورالعمل EXPOSE در Dockerfile این را نشان می‌دهد. با افشای صریح پورت، شما می‌توانید از پرچم P- در docker run برای اتصال خودکار یک پورت میزبان تصادفی به پورت 80 کانتینر استفاده کنید.

 

سفارشی کردن پیکربندی آپاچی

imageهای رسمی PHP/Apache بر اساس Debian هستند. شما می‌توانید از ابزار مدیریت بسته apt به منظور اضافه کردن دیگر نرم افزارهای مورد نیاز خود استفاده نمایید.

شما همچنین به ابزارهای داخلی آپاچی دسترسی کامل دارید؛ بنابراین می‌توانید از a2enmod/a2dismod برای مدیریت ماژول‌ها و از a2ensite/a2dissite برای تعامل با میزبان‌های مجازی استفاده کنید.

فایل پیکربندی آپاچی پیش فرض در مسیر /etc/apache2/apache2.conf است. خطوطی را به این فایل اضافه نمایید، یا آن را به طور کامل جایگزین کنید تا پیکربندی آپاچی گسترش یابد.

یکی از تغییراتی مهم، تنظیم صریح ServerName آپاچی است. این تغییر، اخطار “unable to reliably determine ServerName” را (که معمولاً در log‌های کانتینر شما ظاهر می‌شود)، متوقف می‌کند.

علاوه براین ممکن است بخواهید، میزبان مجازی آپاچی خود را اضافه کنید. این به شما امکان می‌دهد، پیکربندی سفارشی را فراتر از آنچه سایت Apache 000-default ارائه می‌دهد، تنظیم نمایید. در اینجا نحوه اعمال این تغییرات آمده است.

COPY my-apache-site.conf /etc/apache2/sites-available/my-apache-site.conf

RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf &&\
    a2enmod rewrite &&\
    a2dissite 000-default &&\
    a2ensite my-apache-site &&\
    service apache2 restart

این مثال، سایت پیش فرض را غیرفعال کرده، سایت سفارشی را فعال می‌نماید و آپاچی را مجدداً راه‌اندازی می‌کند تا تغییرات اعمال شود. ماژول mod_rewrite نیز فعال است که امکان استفاده از دستورالعمل‌های Rewrite را در فایل‌های .htaccess  فعال می‌نماید. ممکن است بخواهید ماژول‌های دیگر را نیز فعال نمایید، مانند headers؛ در صورتی‌که پیکربندی شما با headerهای پاسخ تعامل داشته باشد.

 

افزودن افزونه‌های PHP

imageهای PHP Docker با ابزارهای مدیریت افزونه‌ها ارائه می‌شوند. برخی از برنامه‌های افزونه به‌طور پیش‌فرض فعال هستند. شما می‌توانید با اجرای دستور php -m در یک کانتینر در حال اجرا، آنچه در دسترس است را بررسی کنید.

بسیاری از افزونه‌های رایج را می‌توان با استفاده از docker-php-ext-install نصب کرد:

docker-php-ext-install pdo_mysql

برخی از افزونه‌ها قبل از نصب باید پیکربندی شوند. بدین منظور می‌توانید از docker-php-ext-configure استفاده نمایید. گزینه‌های موجود بر اساس افزونه‌ها متفاوت خواهد بود. به منظور یادگیری بیشتر می‌توانید صفحه manual مربوط به extension را بخوانید تا گزینه‌های موجود برای هر افزونه را بدست آورید.

RUN docker-php-ext-configure gd --with-jpeg=/usr/include/ &&\
    docker-php-ext-install gd

همچنین شما می‌توانید از برنامه‌های توزیع شده از طریق PECL نیز استفاده کنید. این افزونه‌ها نیاز به یک روش نصب دو مرحله‌ای دارند. بدین منظور ابتدا باید بسته PECL را نصب نموده، سپس از docker-php-ext-enable برای ثبت افزونه با نصب PHP خود استفاده کنید.

RUN apt-get install -y libmcached-dev zlib1g-dev &&\
    pecl install memcached-3.1.5 &&\
    docker-php-ext-enable memcached

 

پیکربندی PHP

imageهای Docker برای بارگیری فایل‌های پیکربندی PHP موجود در /usr/local/etc/php/conf.d از قبل پیکربندی شده‌اند. فایل .ini خود را به این دایرکتوری اضافه نمایید. PHP دارای محتویات خود در runtime خواهد بود و مقادیر موجود را بازنویسی می‌کند. این روش توصیه شده برای گسترش تنظیمات پیش فرض است.

مسیر دایرکتوری پیکربندی ممکن است در آینده تغییر کند. شما می‌توانید مکان فعلی آن را با استفاده از متغیر محیطی $PHP_INI_DIR بدست آورید. در حال حاضر این مسیر به /usr/local/etc/php/conf.d نگاشت شده است.

 

این مطلب نیز ممکن است برای شما مفید باشد: نحوه نصب و استفاده از PHP Composer در اوبونتو

 

استفاده از Composer

Composer (که مستقل از PHP وجود دارد)، به طور پیش فرض در دسترس نیست. چنانچه می‌خواهید از آن در کانتینر Docker استفاده کنید، باید آن را به صورت دستی نصب نمایید.

بهترین راه برای استفاده از Composer در کانتینر خود، ارجاع به Docker image ابزار از طریق یک ساخت چند مرحله‌ای (multi-stage build) است. شما می‌توانید از COPY --from برای آوردن Composer binary به کانتینر PHP خود استفاده کنید. سپس می‌توانید از Composer به طور معمول برای نصب وابستگی‌های پروژه خود استفاده نمایید.

COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
COPY composer.json composer.json
COPY composer.lock composer.lock
RUN composer install --no-dev

استفاده از این رویکرد، پیچیدگی را کاهش می‌دهد. بدین معنی که شما نیازی به دانلود و اجرای اسکریپت نصب Composer ندارید. بلکه با ارجاع به composer:2، داکر image رادریافت کرده و سپس Composer binary را کپی می‌نماید.

 

اسکریپت‌های Entrypoint سفارشی

اگر می‌خواهید پیش از شروع runtime سرور اصلی، انتقال برنامه را انجام دهید، ممکن است لازم باشد از یک اسکریپت Entrypoint سفارشی استفاده کنید. شما می‌توانید برای استفاده از دنباله راه‌اندازی خودتان، ENTRYPOINT کانتینر خود را بازنویسی نمایید.

با اجرای apache2-foreground می‌توانید، اجرای کانتینر را به صورت عادی ادامه دهید. این کار، Apache را در پیش زمینه اجرا می‌کند و از خروج کانتینر پس از تکمیل اسکریپت Entrypoint جلوگیری می‌نماید.

ENTRYPOINT ["bash", "/Docker.sh"]

 

مطالب Docker.sh:

php app.php my-migration-command    # run migrations
service cron start                  # start some services
exec apache2-foreground             # main execution

 

 

 

 

منبع:

cloudsavvyit