نشر تطبيق PHP باستخدام Docker-compose

عادة ما تتكون تطبيقات PHP من خادم ويب ونظام قاعدة بيانات علائقية ومترجم لغة نفسه. في هذا البرنامج التعليمي ، سنستفيد من مجموعة تطبيقات PHP الكاملة باستخدام عامل إرساء. هذا هو برنامج تعليمي متعمق سنقوم فيه بإنشاء وتنسيق حاويات لـ Nginx (خادم الويب) و MySQL (نظام قاعدة البيانات) و PHP.

من أجل هذا البرنامج التعليمي ، سنكتب تطبيقًا بسيطًا يقرأ قائمة المدن من قاعدة بيانات ويعرضها على صفحة ويب ، وبهذه الطريقة سنعرض تطبيق PHP أساسي ، ولكنه عامل.

يفترض هذا الدليل أن لديك Docker-CE مثبتة بالفعل وأن يكون لديك على الأقل الحد الأدنى من المعرفة العملية عن عامل الميناء. لهذه المسألة يمكنك مراجعة الدروس التالية:

تكوين بيئة العمل لدينا

عادة ما يتكون التطبيق القائم على عامل الميناء الحقيقي من عدة حاويات. يمكن أن تصبح إدارة هذه يدويًا بسهولة فوضويًا ومرهقًا. وهنا يأتي دور إنشاء عامل الميناء. يساعدك على إدارة عدد من الحاويات من خلال yamlملف تكوين بسيط .

تثبيت Docker-compose.

curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

قم بإنشاء مجلد لاحتواء جميع الملفات الضرورية لهذا المثال ثم cdفي ذلك. من الآن فصاعدًا ، هذا هو دليل العمل لدينا وسيتم تنفيذ كل أمر داخل هذا المجلد وسيتم الرجوع إلى كل مسار بالنسبة إليه. قد تتم الإشارة إلى هذا المجلد لاحقًا باسم WORKING_DIR.

mkdir ~/docker
cd ~/docker

الآن قم بإنشاء ثلاثة مجلدات أخرى.

mkdir php nginx app

في phpالمجلد حيث سنقوم بناء صورتنا PHP العرف، و nginxسوف تعقد مجلد الملفات الضرورية لصورتنا إنجن إكس العرف و appالمجلد حيث سنكون وضع شفرة المصدر وتكوين تطبيق عينة لدينا.

تكوين حاوية PHP

في هذا المثال ، سنستخدم php-fpmللاتصال بخادم ويب Nginx. سنستخدم صورة PHP الأساسية الرسمية. ومع ذلك ، نحتاج أيضًا إلى تثبيت بعض الملحقات وتمكينها حتى نتمكن من الوصول إلى قاعدة البيانات. داخل phpالمجلد ، قم بإنشاء ملف مسمى Dockerfileووضع المحتويات التالية فيه.

FROM php:7.1-fpm-alpine3.4
RUN apk update --no-cache \
    && apk add --no-cache $PHPIZE_DEPS \
    && apk add --no-cache mysql-dev \
    && docker-php-ext-install pdo pdo_mysql

لاحظ أننا نستخدم نسخة جبال الألب من صورة PHP الرسمية. Alpine هو توزيع صغير للغاية يستهدف الحاويات عن طريق توفير آثار أقدام أصغر بكثير. لاحظ أيضًا استخدام الأمر docker-php-ext-install، حيث توفر صورة PHP الرسمية هذا الأمر لتسهيل عملية تثبيت ملحقات PHP وتكوينها.

الآن ، دعنا نبني صورة Docker هذه من خلال إصدار ما يلي (داخل موقعنا WORKING_DIR):

docker build -t vultr-php php/

في docker-compose.ymlملف

كما ذكرنا من قبل ، docker-composeيسمح لك بإدارة عدد من الحاويات من خلال ملف تكوين بسيط. عادةً ما يتم تسمية ملف التكوين هذا docker-compose.yml. قم بإنشاء هذا الملف داخل appالمجلد.

touch app/docker-compose.yml

الآن ضع المحتويات التالية في هذا الملف.

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app

سنشرح هذا النحو. أولاً ، لاحظ السطر الأول.

version: '2'

يحدد هذا إصدار docker-compose.ymlملف التكوين المستخدم. يحدد السطر التالي الخدمات ، أو بعبارة أخرى ، الحاويات المراد توفيرها.

services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app

لاحظ أن كل خدمة لها مفتاح محدد داخل servicesالكتلة. سيتم استخدام الاسم المحدد هنا للإشارة إلى هذه الحاوية المحددة لاحقًا. لاحظ أيضًا أنه داخل phpالتكوين ، نحدد الصورة المستخدمة لتشغيل الحاوية (هذه هي الصورة التي أنشأناها سابقًا). نحدد أيضًا تعيين حجم.

volumes:
  - ./:/app

docker-composeيشير هذا إلى تعيين الدليل الحالي ( ./) إلى /appالدليل داخل الحاوية. يقوم السطر الأخير بتعيين /appالمجلد داخل الحاوية كدليل العمل ، مما يعني أن هذا هو المجلد حيث يتم تنفيذ جميع الأوامر المستقبلية داخل الحاوية افتراضيًا من.

يمكننا الآن تنظيم حاوياتنا.

cd ~/docker/app
docker-compose up -d

يمكنك تشغيل الأمر التالي للتأكد من تنفيذ حاوية PHP:

docker ps

كيفية تنفيذ الأوامر داخل الحاويات

لا يزال داخل appالمجلد ، يمكننا تشغيل أي أمر داخل حاوية خدمة محددة بمساعدة docker-composeالأمر.

docker-compose exec [service] [command]

و [service]يشير النائب إلى مفتاح الخدمة. في حالتنا ، كان هذا php. لنقم بتشغيل أمر داخل الحاوية للتحقق من إصدار PHP الخاص بنا.

docker-compose exec php php -v

سترى الناتج التالي.

PHP 7.1.14 (cli) (built: Feb  7 2018 00:40:45) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

تكوين حاوية Nginx

تمامًا مثل حاوية PHP ، نحتاج إلى إنشاء صورة مخصصة لخادم الويب. ولكن في هذه الحالة ، نحن بحاجة فقط إلى توفير تكوين لدينا virtual host. تأكد من أنك داخل موقعنا WORKING_DIRوأنشئ المجلد Dockerfileداخل nginx:

cd ~/docker
touch nginx/Dockerfile

الآن ضع المحتويات التالية في هذا Dockerfile:

FROM nginx:1.13.8-alpine
COPY ./default.conf /etc/nginx/conf.d/default.conf

نحن نستخدم صورة Nginx الافتراضية القائمة على Alpine. في ملف Docker هذا ، نقوم ببساطة بنسخ ملف تكوين إلى إعداد التطبيق الخاص بنا. قبل إنشاء هذه الصورة ، قم بإنشاء ملف تكوين.

touch nginx/default.conf

الآن ملأها بهذا المحتوى.

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /app;
    index index.php;

    #server_name server_domain_or_IP;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

لاحظ أنه في fastcgi_pass php:9000السطر نشير إلى حاوية PHP باسمها داخل serviceكتلة docker-compose.ymlملف التكوين. داخليًا docker-composeإنشاء شبكة وتعيين اسم الخدمة كاسم المضيف لكل من الخدمات المحددة. يمكننا الآن بناء صورة Nginx.

docker build -t vultr-nginx nginx/

جارٍ التحديث docker-compose.yml

الآن قم بتحديث app/docker-compose.ymlالملف.

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app
  web:
    image: vultr-nginx
    volumes:
      - ./:/app
    depends_on:
      - php
    ports:
      - 80:80

لقد أضفنا فقط خدمة جديدة. التكوين هو نفسه تقريبًا ، باستثناء ما يلي.

depends_on:
  - php
ports:
  - 80:80

بمجرد أن تحتاج حاوية Nginx إلى تهيئة خدمة PHP بالكامل ، فإننا نفرض هذا الشرط في depends_onالخيار. يعيّن portsمفتاح التكوين منفذ مضيف إلى منفذ حاوية ، وهنا نقوم بتعيين المنفذ 80في المضيف إلى المنفذ الموجود 80في الحاوية.

الآن قم بإنشاء ملف يسمى index.phpداخل appالمجلد ووضع ما يلي فيه.

<?php phpinfo();

تأكد من 80إمكانية الوصول إلى المنفذ من خلال جدار الحماية الخاص بك وقم بتنفيذ ما يلي.

cd ~/docker/app
docker-compose up -d

مرة أخرى ، تحقق جيدًا من انتهاء الخدمة.

docker ps

افتح متصفحًا وادخل [vultr-instance-ip]. يمكنك معرفة عنوان IP لمثيل Vultr عن طريق تشغيل ما يلي.

hostname -I

سترى صفحة معلومات PHP.

تكوين حاوية MySQL

تسمح لك صورة MySQL الرسمية بتهيئة الحاوية من خلال متغيرات البيئة البسيطة. يمكن القيام بذلك من خلال environmentخيار داخل تعريف كتلة الخدمة. قم بتحديث ~/docker/app/docker-compose.ymlالملف لما يلي.

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app
  web:
    image: vultr-nginx
    volumes:
      - ./:/app
    depends_on:
      - php
    ports:
      - 80:80
  mysql:
    image: mysql:5.7.21
    volumes:
      - ./:/app
      - dbdata:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=world
      - MYSQL_ROOT_PASSWORD=root
    working_dir: /app
volumes:
  dbdata:

الآن قمنا بتحديد خدمة جديدة لقاعدة البيانات. لاحظ الخط dbdata:/var/lib/mysql. يؤدي هذا إلى تثبيت المسار على الحاوية /var/lib/mysqlإلى وحدة تخزين ثابتة يديرها Docker ، وبهذه الطريقة تستمر بيانات قاعدة البيانات بعد إزالة الحاوية. يجب تحديد وحدة التخزين هذه في كتلة المستوى الأعلى كما ترى في نهاية الملف.

قبل تنسيق تكويننا الجديد ، لنقم بتنزيل نموذج لقاعدة بيانات MySQL. و ثائق رسمية الخلية يوفر بعض نماذج قواعد البيانات. سنستخدم قاعدة بيانات العالم المعروفة. توفر قاعدة البيانات هذه قائمة بالدول والمدن. لتنزيل هذه العينة ، قم بتنفيذ ما يلي داخل مجلد التطبيق الخاص بنا.

curl -L http://downloads.mysql.com/docs/world.sql.gz -o world.sql.gz
gunzip world.sql.gz

يتيح الآن تنسيق حاوياتنا.

docker-compose up -d

كما لاحظت بالفعل ، docker-compose upيبدأ الأمر فقط الحاويات التي لم تبدأ بالفعل. يتحقق من الاختلافات بين ملفك docker-compose.ymlوالتكوين الحالي للحاويات الجاري تشغيلها.

مرة أخرى ، تحقق من بدء تشغيل حاوية MySQL.

docker ps

الآن ملء قاعدة بيانات العالم.

docker-compose exec -T mysql mysql -uroot -proot world < world.sql

يمكنك التحقق من تعبئة قاعدة البيانات عن طريق تحديد البيانات مباشرة من قاعدة البيانات. قم أولاً بالوصول إلى موجه MySQL داخل الحاوية.

docker-compose exec mysql mysql -uroot -proot world

في موجه MySQL ، قم بتشغيل ما يلي.

select * from city limit 10;

سترى قائمة المدن. الآن قم بإنهاء موجه MySQL.

mysql> exit

بناء تطبيقنا

الآن بعد أن أصبحت جميع الحاويات الضرورية جاهزة للعمل ، يمكننا التركيز على تطبيقنا النموذجي. قم بتحديث app/index.phpالملف لما يلي.

<?php

$pdo = new PDO('mysql:host=mysql;dbname=world;charset=utf8', 'root', 'root');

$stmt = $pdo->prepare("
    select city.Name, city.District, country.Name as Country, city.Population
    from city
    left join country on city.CountryCode = country.Code
    order by Population desc
    limit 10
");
$stmt->execute();
$cities = $stmt->fetchAll(PDO::FETCH_ASSOC);

?>

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Vultr Rocks!</title>
</head>
<body>
    <h2>Most Populous Cities In The World</h2>
    <table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Country</th>
            <th>District</th>
            <th>Population</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach($cities as $city): ?>
            <tr>
                <td><?=$city['Name']?></td>
                <td><?=$city['Country']?></td>
                <td><?=$city['District']?></td>
                <td><?=number_format($city['Population'], 0)?></td>
            </tr>
        <?php endforeach ?>
    </tbody>
    </table>
</body>
</html>

إذا قمت بالوصول [vultr-instance-ip]في مستعرض ويب ، فسترى قائمة بأكثر المدن اكتظاظًا بالسكان في العالم. تهانينا ، لقد قمت بنشر تطبيق PHP يعمل بشكل كامل باستخدام docker.

استنتاج

في هذا البرنامج التعليمي ، عرضت خطوة بخطوة كيفية تكوين تطبيق PHP يعمل بشكل كامل. قمنا ببناء صور مخصصة لـ PHP و Nginx ، وقمنا بتكوين رصيف الميناء لتنسيق حاوياتنا. على الرغم من كونه بسيطًا وبسيطًا للغاية ، إلا أن هذا الإعداد يعكس سيناريو الحياة الحقيقية.

في هذا الدليل ، قمنا بتصميم صورنا ووضع علامات عليها محليًا. لإعداد أكثر مرونة ، يمكنك دفع هذه الصور إلى سجل عامل الميناء . يمكنك الدفع إلى سجل عامل الميناء الرسمي أو حتى إعداد سجل عامل الميناء الخاص بك. على أي حال ، سيسمح لك هذا ببناء صورك على مضيف واحد واستخدامها على مضيف آخر.

لاستخدام أكثر تفصيلاً docker-compose، يجب الرجوع إلى الوثائق الرسمية .

بناءً على متطلبات التطبيق وإطار عمل PHP الذي تستخدمه ، قد ترغب في إضافة المزيد من الإضافات. يمكن القيام بذلك بسهولة عن طريق تعديل Dockerfileالمستخدمة لبناء صورة PHP المخصصة لدينا. ومع ذلك ، تحتاج بعض الإضافات إلى تثبيت تبعيات إضافية في الحاوية. يجب عليك الرجوع إلى قائمة الإضافات في وثائق PHP الرسمية لمراجعة المتطلبات الأساسية لكل ملحق.



Leave a Comment

نشر Kubernetes مع Kubeadm على CentOS 7

نشر Kubernetes مع Kubeadm على CentOS 7

نظرة عامة تهدف هذه المقالة إلى مساعدتك في إنشاء مجموعة Kubernetes وتشغيلها باستخدام kubeadm في لمح البصر. سيقوم هذا الدليل بنشر خادمين في

قم بتثبيت Docker CE على Ubuntu 18.04

قم بتثبيت Docker CE على Ubuntu 18.04

مقدمة Docker هو تطبيق يسمح لنا بنشر البرامج التي يتم تشغيلها كحاويات. وقد كتب بلغة البرمجة Go الشهيرة

نشر تطبيق Node.js باستخدام Docker

نشر تطبيق Node.js باستخدام Docker

ستوضح لك هذه المقالة كيفية نشر تطبيق Node داخل حاوية Docker. ملاحظة: يفترض هذا البرنامج التعليمي أنك قمت بتثبيت Docker وقراءته

نشر وإدارة حاويات LXC بأمان على Ubuntu 14.04

نشر وإدارة حاويات LXC بأمان على Ubuntu 14.04

حاويات LXC (حاويات Linux) هي إحدى ميزات نظام التشغيل في Linux والتي يمكن استخدامها لتشغيل العديد من أنظمة Linux المعزولة على مضيف واحد. هذه

ابدأ مع Kubernetes على CentOS 7

ابدأ مع Kubernetes على CentOS 7

Kubernetes هو نظام أساسي مفتوح المصدر تم تطويره بواسطة Google لإدارة التطبيقات في حاويات عبر مجموعة من الخوادم. إنه يبني على عقد و

قم بتثبيت Rancher على Ubuntu 16.04

قم بتثبيت Rancher على Ubuntu 16.04

استخدام نظام مختلف؟ مقدمة Rancher هي منصة مفتوحة المصدر لتشغيل الحاويات وبناء خدمة حاويات خاصة. رانشر هو القاعدة

تثبيت Docker-compose على CoreOS

تثبيت Docker-compose على CoreOS

تشرح هذه المقالة كيفية تثبيت Docker-compose على CoreOS. في CoreOS ، المجلد / usr / غير قابل للتغيير بحيث لا يتو��ر المسار القياسي / usr / local / bin

على CoreOS ، قم بإعداد سجل Docker الخاص بك

على CoreOS ، قم بإعداد سجل Docker الخاص بك

نعلم جميعًا ونحب Docker ، وهي منصة لإنشاء وإدارة وتوزيع حاويات التطبيقات عبر أجهزة متعددة. تقدم شركة Docker Inc. خدمة ر

قم بتثبيت Rancher على CentOS 7

قم بتثبيت Rancher على CentOS 7

استخدام نظام مختلف؟ مقدمة Rancher هي منصة مفتوحة المصدر لتشغيل الحاويات وبناء خدمة حاويات خاصة. رانشر هو القاعدة

جلسة مثبتة مع سرب Docker (CE) على CentOS 7

جلسة مثبتة مع سرب Docker (CE) على CentOS 7

استخدام نظام مختلف؟ مقدمة يحول Docker Swarm خوادمك الفردية إلى مجموعة من أجهزة الكمبيوتر ، مما يسهل القياس والتوافر العالي

تثبيت Docker على CentOS 7

تثبيت Docker على CentOS 7

استخدام نظام مختلف؟ Docker هو تطبيق يسمح بنشر البرامج داخل حاويات افتراضية. تمت كتابته في برنامج Go

قم بتثبيت Rancher Server على RancherOS

قم بتثبيت Rancher Server على RancherOS

نظرة عامة RancherOS هو نظام تشغيل خفيف الوزن بشكل لا يصدق (حوالي 60 ميجا بايت فقط) يقوم بتشغيل برنامج Docker daemon باسم PID 0 لتشغيل خدمات النظام

جلسة مثبتة مع Docker Swarm (CE) على دبيان 9

جلسة مثبتة مع Docker Swarm (CE) على دبيان 9

استخدام نظام مختلف؟ مقدمة يحول Docker Swarm خوادمك الفردية إلى مجموعة من أجهزة الكمبيوتر ؛ تسهيل التوسع ، وتوافر عالية

كيفية استخدام Docker: إنشاء أول حاوية Docker

كيفية استخدام Docker: إنشاء أول حاوية Docker

يوضح هذا البرنامج التعليمي أساسيات البدء مع Docker. أفترض أن لديك Docker مثبتة بالفعل. ستعمل الخطوات في هذا البرنامج التعليمي على

موازنة التحميل مع عامل الميناء

موازنة التحميل مع عامل الميناء

عند تشغيل تطبيق ويب ، تحتاج عادةً إلى تحقيق أقصى استفادة من مواردك دون الحاجة إلى تحويل البرنامج الخاص بك لاستخدام مؤشرات متعددة

ابدأ مع SQL Server 2017 (MS-SQL) على CentOS 7 مع Docker

ابدأ مع SQL Server 2017 (MS-SQL) على CentOS 7 مع Docker

المتطلبات الأساسية محرك Docker 1.8+. 4 جيجابايت على الأقل من مساحة القرص. 4 غيغابايت على الأقل من ذاكرة الوصول العشوائي. الخطوة 1. تثبيت Docker من أجل تثبيت SQL-Server ، Docker mus

تثبيت Docker CE على دبيان 9

تثبيت Docker CE على دبيان 9

استخدام نظام مختلف؟ مقدمة Docker هو تطبيق يسمح بنشر البرامج داخل حاويات افتراضية. هو مكتوب في G

تثبيت Docker على Ubuntu 14.04

تثبيت Docker على Ubuntu 14.04

استخدام نظام مختلف؟ Docker هو تطبيق يسمح بنشر البرامج التي يتم تشغيلها كحاويات. وقد كتب في برنامج Go الشهير

إنشاء سرب Docker على Alpine Linux 3.9.0

إنشاء سرب Docker على Alpine Linux 3.9.0

مقدمة سيوضح لك هذا الدليل كيفية إنشاء وتكوين سرب Docker باستخدام عدة خوادم Alpine Linux 3.9.0 و Portainer. يرجى الانتباه إلى ذلك

نظرة ثاقبة على 26 أسلوبًا لتحليل البيانات الضخمة: الجزء الأول

نظرة ثاقبة على 26 أسلوبًا لتحليل البيانات الضخمة: الجزء الأول

نظرة ثاقبة على 26 أسلوبًا لتحليل البيانات الضخمة: الجزء الأول

6 أشياء شديدة الجنون حول نينتندو سويتش

6 أشياء شديدة الجنون حول نينتندو سويتش

يعرف الكثير منكم أن Switch سيصدر في مارس 2017 وميزاته الجديدة. بالنسبة لأولئك الذين لا يعرفون ، قمنا بإعداد قائمة بالميزات التي تجعل "التبديل" "أداة لا غنى عنها".

وعود التكنولوجيا التي لم يتم الوفاء بها بعد

وعود التكنولوجيا التي لم يتم الوفاء بها بعد

هل تنتظر عمالقة التكنولوجيا للوفاء بوعودهم؟ تحقق من ما تبقى دون تسليم.

وظائف طبقات معمارية مرجعية للبيانات الضخمة

وظائف طبقات معمارية مرجعية للبيانات الضخمة

اقرأ المدونة لمعرفة الطبقات المختلفة في بنية البيانات الضخمة ووظائفها بأبسط طريقة.

كيف يمكن للذكاء الاصطناعي نقل أتمتة العمليات إلى المستوى التالي؟

كيف يمكن للذكاء الاصطناعي نقل أتمتة العمليات إلى المستوى التالي؟

اقرأ هذا لمعرفة مدى انتشار الذكاء الاصطناعي بين الشركات الصغيرة وكيف أنه يزيد من احتمالات نموها ومنح منافسيها القدرة على التفوق.

CAPTCHA: ما هي المدة التي يمكن أن تظل تقنية قابلة للتطبيق للتميز بين الإنسان والذكاء الاصطناعي؟

CAPTCHA: ما هي المدة التي يمكن أن تظل تقنية قابلة للتطبيق للتميز بين الإنسان والذكاء الاصطناعي؟

لقد أصبح حل CAPTCHA صعبًا جدًا على المستخدمين في السنوات القليلة الماضية. هل ستكون قادرة على أن تظل فعالة في اكتشاف البريد العشوائي والروبوتات في المستقبل القريب؟

التفرد التكنولوجي: مستقبل بعيد للحضارة الإنسانية؟

التفرد التكنولوجي: مستقبل بعيد للحضارة الإنسانية؟

مع تطور العلم بمعدل سريع ، واستلام الكثير من جهودنا ، تزداد أيضًا مخاطر تعريض أنفسنا إلى تفرد غير قابل للتفسير. اقرأ ، ماذا يمكن أن يعني التفرد بالنسبة لنا.

التطبيب عن بعد والرعاية الصحية عن بعد: المستقبل هنا

التطبيب عن بعد والرعاية الصحية عن بعد: المستقبل هنا

ما هو التطبيب عن بعد والرعاية الصحية عن بعد وأثره على الأجيال القادمة؟ هل هو مكان جيد أم لا في حالة الوباء؟ اقرأ المدونة لتجد طريقة عرض!

هل تساءلت يومًا كيف يربح المتسللون الأموال؟

هل تساءلت يومًا كيف يربح المتسللون الأموال؟

ربما سمعت أن المتسللين يكسبون الكثير من المال ، لكن هل تساءلت يومًا كيف يجنون هذا النوع من المال؟ دعنا نناقش.

يتسبب التحديث الإضافي لنظام macOS Catalina 10.15.4 في حدوث مشكلات أكثر من حلها

يتسبب التحديث الإضافي لنظام macOS Catalina 10.15.4 في حدوث مشكلات أكثر من حلها

أصدرت Apple مؤخرًا macOS Catalina 10.15.4 تحديثًا تكميليًا لإصلاح المشكلات ولكن يبدو أن التحديث يتسبب في المزيد من المشكلات التي تؤدي إلى إنشاء أجهزة macOS. قراءة هذه المادة لمعرفة المزيد