راه اندازی PHP و FPM با Docker Compose

راه اندازی PHP و FPM با Docker Compose

در قسمت قبل سرویس MySQL را راه اندازی کردیم. اکنون می توانیم سرویس PHP را اضافه کنیم. مانند image،nginx مربوط به PHP را از یک docker file شخصی سازی شده می سازیم. یک فایل با نام php.dockerfile ایجاد می کنیم.

ابتدا باید image پایه را مشخص کنیم.

FROM php:8-fpm-alpine

قدم بعدی آماده کردن پوشه برنامه است.

RUN mkdir -p /var/www/html/

لاراول برای اجرا به بعضی افزونه های PHP نیاز دارد. تعدادی از این افزونه ها به طور پیش فرض همراه image پایه نصب شده اند اما بعضی ها را باید خودمان نصب کنیم. به طور معمول برای نصب افزونه ها باید یک سری دستور اجرا کنیم و خط هایی را در فایل php.ini از حالت کامنت شده خارج کنیم. اما توسط داکر، این کار خیلی ساده است. یک دستور خاص برای این کار وجود دارد که آن را با استفاده از عبارت RUN در docker file اجرا می کنیم.

RUN docker-php-ext-install pdo pdo_mysql

این دستور تمام کار های لازم برای فعال کردن افزونه های داده شده را انجام می دهد.

چون از FPM استفاده می کنیم نیاز است پیکربندی nginx را به شکلی تغییر دهیم تا فایل های php از طریق FPM پردازش شوند.

server {
	listen 80;
	index index.php index.html;
	server_name _;
	root /var/www/html/;
	
	location / {
		try_files $uri $uri/ /index.php?$query_string;
	}
	
	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;
	}
}

این پیکربندی برای زمانی که از FPM استفاده می کنیم کاملا عادی است. اما یک استثنا در خط مربوط به fastcgi_pass وجود دارد. در آن جا ما به جای استفاده از localhost یا آیپی سرور از عبارت php استفاده کردیم. دلیل این موضوع این است که ما می خواستیم به پورت 9000 اشاره کنیم اما نه پورت 9000 کانتینر nginx بلکه پورت 9000 کانتینر php. وقتی با docker compose کار می کنیم هر جایی که لازم باشد آدرس host یا دامنه سرویسی را بدهیم، می توانیم از اسم آن سرویس استفاده کنیم.

قبل از اجرای کانتینر ها به پوشه src می رویم و به جای فایل index.html یک فایل index.php قرار می دهیم و داخل آن کد زیر را می نویسیم تا با مشاهده localhost:80 بتوانیم اطلاعات PHP را ببینیم.

<?php
phpinfo();

اکنون که همه چیز پیکربندی شده است، می توانیم سرویس php را اضافه کنیم.

version: '3.8'

services:
  nginx:
    build:
      context: .
      dockerfile: nginx.dockerfile
    ports:
      - 80:80
    volumes:
      - ./src:/var/www/html
    depends_on:
      - mysql
  mysql:
    image: mysql:5.7
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: sokanacademy
      MYSQL_USER: sokanacademy
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      - ./mysql:/var/lib/mysql
  php:
    build:
      context: .
      dockerfile: php.dockerfile
    volumes:
      - ./src:/var/www/html/

دستور docker compose up --build را اجرا می کنیم تا سرویس ها فعال شوند.

با استفاده از گزینه build-- کانتینر ها دوباره ساخته می شوند.

همان طور که مشاهده می کنید فعال شدن کانتینر ها با خطا مواجه شد! علت این خطا این است که کانتینر nginx قبل از php اجرا شده و هنوز سرویس php در شبکه وجود ندارد. در حالی که ما در فایل پیکربندی nginx به آن اشاره کرده ایم. برای حل این مشکل php را به سرویس هایی که nginx به آن ها وابسته است اضافه می کنیم.

version: '3.8'

services:
  nginx:
    build:
      context: .
      dockerfile: nginx.dockerfile
    ports:
      - 80:80
    volumes:
      - ./src:/var/www/html
    depends_on:
      - mysql
      - php
  mysql:
    image: mysql:5.7
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: sokanacademy
      MYSQL_USER: sokanacademy
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      - ./mysql:/var/lib/mysql
  php:
    build:
      context: .
      dockerfile: php.dockerfile
    volumes:
      - ./src:/var/www/html

با اجرای دستور docker compose up --build کانتینر ها فعال می شوند و می توانیم اطلاعات PHP را مشاهده کنیم.

فایل‌های مربوط به این قسمت را می‌توانید از اینجا دانلود کنید.

دوره در حال تکمیل است ... rocket