وب سایت عباس باقری

وب سایت شخصی عباس باقریوب سایت شخصی عباس باقری

داکرایز کردن پروژه آپاچی ، php ، mysql و phpmyadmin

زمان مطالعه : 4 دقیقه

در این پست به داکرایز کردن یک پروژه php به همراه پایگاه داده mysql میپردازیم.

برای شروع ابتدا داکر را نصب میکنیم. فرض کنید ما پروژه خود را در پوشه php_project ذخیره کرده‌ایم.

اکنون یک پوشه جدید بنام php_docker_project میسازیم و پوشه php_project را به این پوشه منتقل میکنیم. در ابتدا نیاز بهایجاد فایل Dockerfile برای پروژه خود داریم:

# استفاده از php8.3 و آپاچی برای سرو کردن پروژه
FROM php:8.3-apache

# نصب کتابخانه ها و افزونه های مورد نیاز برای اجرای پروژه
RUN apt-get update && apt-get install -y
RUN docker-php-ext-install mysqli pdo pdo_mysql && docker-php-ext-enable pdo_mysql

# کپی کردن سورس فایلهای پروژه
# در صورتی کهه از خاصیت ولوم استفاده می‌کنید نیازی نیست
COPY ./php_project
COPY ./.htaccess /var/www/html/

# دسترسی دادن به اپاچی برای دسترسی به سورس فایل
RUN chown -R www-data:www-data /var/www #this line after COPY

# فعال کردن rewriterule برای آپاچی
RUN a2enmod rewrite

EXPOSE 80
EXPOSE 443

سپس در پوشه php_docker_project یک فایل جدید بنام docker-compose.yaml اضافه میکنیم. سپس کدهای زیر را به آن اضافه میکنیم.

 

version: "3.8"  #yml syntax version

services: # adds 2 services: mysql and phpmyadmin to connect with 
     website:
        container_name: php8.3-apache #نام کانتینر دلخواه
        build:
            context: .
            dockerfile: Dockerfile # اشارهه به  اسم فایلی دارد که ایجاد کردیم
        environment:
            - MYSQL_DBHOST=mysql
            - MYSQL_DBPORT=3306
            - MYSQL_DBUSER=root
            - MYSQL_DBPASS=password
            - MYSQL_DBNAME=mydatabase
        volumes: # با استفاده از خاصیت ولوم دیگر نیازی به بیلد مجدد پس از هربار تغییر کدها نیست
            - ./php_project:/var/www/html 
        ports:
            - 80:80
            - 443:443
        depends_on:
            - db
    db:
        image: mariadb:latest # use latest version of mysql
        container_name: db # add a name for the container
        command: --default-authentication-plugin=mysql_native_password
        restart: unless-stopped
        environment: # add default values, see docs for more info.
            MYSQL_USER: user
            MYSQL_ROOT_PASSWORD: mypassword
            MYSQL_PASSWORD: mypassword
            #MYSQL_DATABASE: dbname # create this database on startup
        volumes:
            - my-db:/var/lib/mysql
        ports:
            - '3306:3306'

    phpmyadmin:
        container_name: phpmyadmin
        image: phpmyadmin/phpmyadmin:latest
        ports:
        - "8082:80"
        environment:
            MYSQL_ROOT_PASSWORD: mypassword #(Required) set the password for the root superuser account.
            PMA_HOST: db   # define the address/hostname of the mysql server eg mysql container name.
            PMA_USER: root # this is the root user to login on startup
            PMA_PASSWORD: mypassword # use the root password to login on startup.
            # Create a new user on startup (optional)
            # MYSQL_USER: newuser
            # MYSQL_PASSWORD: mypassword

volumes: # add persistent data even if container is removed.
        my-db:

 

در ابتدا نسخه docker-compose را انتخاب میکنیم. در حال حاضر آخرین نسخه 3.8 می باشد :

version: "3.8"

در خط بعدی سرویسهای خودمان را معرفی میکنیم. در حال حاضر ما سه سرویس php ، mysql و phpmyadmin داریم :

services: # adds 2 services: mysql and phpmyadmin to connect with
website:
    ...

db:
    ...

phpmyadmin:
    ...

برای سرویس php از image نسخه 8.1 بهمراه apache استفاده میکنیم. بجای این می توانیم یکی از سرویسهای دیگر از این صفحه را انتخاب کرد.

 

 
 
 
 

با build ادرس Dockerfile را مشخص میکنیم که در همین پوشه جاری است.

با environment تعدادی متغیر قابل استفاده در php تعریف میکنیم. اینجا ما مشخصات دیتا بیس را ذخیره کردیم.

با ports هم مشخص کردیم که سایت ما روی پورت 80 و 443 قابل نمایش شود.

با depends_on هم مشخص کردیم که از سرویس db که پاییتر تعریف کرده ایم میخواهیم استفاده کنیم.

 

 db:
  image: mysql:latest # use latest version of mysql
  container_name: db # add a name for the container
  command: --default-authentication-plugin=mysql_native_password
  restart: unless-stopped
  environment: # add default values, see docs for more info.
    MYSQL_USER: user
    MYSQL_ROOT_PASSWORD: password
    MYSQL_PASSWORD: password
    MYSQL_DATABASE: mydatabasename # create this database on startup
  volumes:
    - my-db:/var/lib/mysql
  ports:
    - '3306:3306'
 

 

در این قسمت سرویس mysql را روی پورت 3306 تعریف کردیم.

 
    phpmyadmin:
        container_name: phpmyadmin
        image: phpmyadmin/phpmyadmin:latest
        ports:
        - "8082:80"
        environment:
            MYSQL_ROOT_PASSWORD: mypassword #(Required) set the password for the root superuser account.
            PMA_HOST: db   # define the address/hostname of the mysql server eg mysql container name.
            PMA_USER: root # this is the root user to login on startup
            PMA_PASSWORD: mypassword # use the root password to login on startup.
            # Create a new user on startup (optional)
            # MYSQL_USER: newuser
            # MYSQL_PASSWORD: password
 
 

در این قسمت هم ما پورت 8082 را به mysql اختصاص دادیم.

با توجه به تنظیمات بالا میتوانیم با مشخصات زیر از دیتابیس در php استفاده کنیم.

<?php

$db = new mysqli('db','root','password','password',3306);

 

نکته : بجای localhost نام سرویس دیتابیس را قرار میدهیم.

پس از اجرای این دستورات زیر پروژه روی ip شما در بستر وب قابل مشاهده خواهد بود

cd ~
cd php_docker_project
docker-compose up --build
 
 

درصورتی که قبلا build گرفته باشید:

cd ~
cd php_docker_project
docker-compose up

برای غیرفعال کردن سایت دستورات زیر را اجرا میکنیم:

cd ~
cd php_docker_project
docker-compose down
 

امیدوارم پست مفید بوده باشه

منابع بیشتر برای مطالعه :

docker mysql

docker phpmyadmin