Terapkan Aplikasi PHP Menggunakan Docker-compose

Aplikasi PHP biasanya dibuat oleh webserver, sistem pangkalan data relasional dan interpreter bahasa itu sendiri. Dalam tutorial ini, kami akan memanfaatkan stack aplikasi PHP penuh menggunakan docker. Ini adalah tutorial mendalam di mana kita akan membina dan mengarang bekas untuk Nginx (webserver), MySQL (sistem pangkalan data) dan PHP.

Demi tutorial ini, kami akan menulis aplikasi mudah yang membaca senarai kota dari pangkalan data dan memaparkannya di laman web, dengan cara ini kami akan menunjukkan aplikasi PHP yang asas tetapi berfungsi.

Panduan ini mengandaikan bahawa anda mempunyai Docker-CE yang telah dipasang dan sekurang-kurangnya pengetahuan kerja minimum docker. Untuk perkara itu, anda boleh menyemak tutorial berikut:

Mengkonfigurasi persekitaran kerja kami

Aplikasi berasaskan docker sebenarnya akan terdiri daripada beberapa bekas. Menguruskan secara manual dengan mudah boleh menjadi agak kemas dan rumit. Itulah tempat penyusun docker bermain. Ia membantu anda menguruskan beberapa bekas melalui yamlfail konfigurasi yang mudah .

Pasang penyusun docker.

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

Buat folder untuk menyimpan semua fail yang diperlukan dari contoh ini dan kemudian cdke dalamnya. Mulai sekarang, ini adalah direktori kerja kami dan setiap arahan akan dilaksanakan di dalam folder ini dan setiap laluan akan dirujuk berbanding dengannya. Folder ini boleh dirujuk kemudian sebagai WORKING_DIR.

mkdir ~/docker
cd ~/docker

Sekarang buat tiga lagi folder.

mkdir php nginx app

The phpfolder adalah di mana kita akan membina imej PHP adat kami, nginxfolder akan mengadakan fail yang diperlukan untuk imej nginx adat kami dan appfolder adalah di mana kita akan meletakkan kod sumber dan konfigurasi aplikasi sampel kami.

Mengkonfigurasi bekas PHP

Dalam contoh ini, kita akan gunakan php-fpmuntuk menyambung ke webserver Nginx. Kami akan menggunakan imej asas PHP rasmi. Walau bagaimanapun, kami juga perlu memasang dan mendayakan beberapa sambungan supaya kami boleh mengakses pangkalan data. Di dalam phpfolder buat fail bernama Dockerfiledan masukkan isi berikut ke dalamnya.

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

Perhatikan bahawa kami menggunakan versi Alpine imej rasmi PHP. Alpine adalah sebaran yang sangat kecil yang disasarkan ke kontena dengan memberikan jejak kaki yang jauh lebih kecil. Juga, perhatikan penggunaan arahan itu docker-php-ext-install, imej rasmi PHP memberikan arahan ini untuk memudahkan proses memasang dan mengkonfigurasi pelanjutan PHP.

Sekarang, mari kita bina gambar Docker ini dengan mengeluarkan yang berikut (di dalam kami WORKING_DIR):

docker build -t vultr-php php/

yang docker-compose.ymlfail

Seperti yang telah disebutkan, docker-composemembolehkan anda menguruskan beberapa bekas melalui fail konfigurasi yang mudah. Fail konfigurasi ini biasanya dinamakan docker-compose.yml. Buat fail ini di dalam appfolder.

touch app/docker-compose.yml

Sekarang masukkan kandungan berikut ke dalam fail ini.

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

Kami akan menerangkan sintaks ini. Pertama, perhatikan baris pertama.

version: '2'

Ini menentukan versi docker-compose.ymlfail konfigurasi yang digunakan. Baris seterusnya menentukan perkhidmatan, atau dengan kata lain, bekas yang akan disediakan.

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

Perhatikan bahawa setiap perkhidmatan mempunyai kunci tertentu di dalam servicesblok. Nama yang dinyatakan di sini akan digunakan untuk merujuk bekas khusus ini kemudian. Juga ambil perhatian bahawa di dalam phpkonfigurasi, kami menentukan imej yang digunakan untuk menjalankan bekas (ini adalah imej yang kami bina sebelum ini). Kami juga menentukan pemetaan kelantangan.

volumes:
  - ./:/app

Ini memberitahu docker-composepeta direktori semasa ( ./) ke /appdirektori di dalam bekas. Baris terakhir menetapkan /appfolder di dalam wadah sebagai direktori yang berfungsi, yang bermaksud bahawa ini adalah folder di mana semua perintah masa depan di dalam bekas secara lalai dijalankan dari.

Kami sekarang boleh mengatur bekas kami.

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

Anda boleh menjalankan perintah berikut untuk memastikan bahawa wadah PHP telah dijalankan:

docker ps

Cara melaksanakan perintah di dalam bekas

Masih di dalam appfolder, kita boleh menjalankan sebarang arahan di dalam bekas perkhidmatan yang ditentukan dengan bantuan docker-composeperintah itu.

docker-compose exec [service] [command]

Pemegang [service]tempat merujuk kepada kunci perkhidmatan. Dalam kes kami, ini adalah php. Mari jalankan arahan di dalam bekas untuk memeriksa versi PHP kami.

docker-compose exec php php -v

Anda akan melihat output berikut.

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

Mengkonfigurasi bekas Nginx

Sama seperti bekas PHP, kita perlu membuat gambar khusus untuk pelayan laman web. Tetapi dalam kes ini, kita hanya perlu menyediakan konfigurasi untuk kita virtual host. Pastikan anda berada di dalam kami WORKING_DIRdan buat folder Dockerfiledi dalam nginx:

cd ~/docker
touch nginx/Dockerfile

Sekarang masukkan kandungan berikut ke dalam ini Dockerfile:

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

Kami menggunakan imej Nginx lalai berdasarkan Alpine. Pada fail Docker ini kami hanya menyalin fail konfigurasi ke dalam penyediaan aplikasi kami. Sebelum membina gambar ini, buat fail konfigurasi.

touch nginx/default.conf

Sekarang isi dengan kandungan ini.

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;
    }
}

Perhatikan bahawa pada fastcgi_pass php:9000baris kami merujuk kepada bekas PHP dengan nama itu di dalam serviceblok docker-compose.ymlfail konfigurasi. Secara dalaman docker-composemembuat rangkaian dan memberikan nama perkhidmatan sebagai nama host untuk setiap perkhidmatan yang ditentukan. Kita sekarang boleh membina imej Nginx.

docker build -t vultr-nginx nginx/

Mengemas kini docker-compose.yml

Sekarang kemas kini app/docker-compose.ymlfail.

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

Kami hanya menambah perkhidmatan baru. Konfigurasi hampir sama, kecuali yang berikut.

depends_on:
  - php
ports:
  - 80:80

Apabila bekas Nginx memerlukan perkhidmatan PHP untuk dimulakan sepenuhnya, kami memaksa keperluan ini dalam depends_onpilihan. Yang portsutama konfigurasi maps port tuan rumah kepada pelabuhan kontena, di sini kita map pelabuhan 80dalam tuan rumah ke pelabuhan 80dalam bekas.

Sekarang buat fail yang dipanggil index.phpdi dalam appfolder dan masukkan yang berikut di dalamnya.

<?php phpinfo();

Pastikan port 80boleh diakses melalui firewall anda dan laksanakan perkara berikut.

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

Sekali lagi, semak semula perkhidmatan itu.

docker ps

Buka penyemak imbas dan akses [vultr-instance-ip]. Anda mungkin mengetahui alamat IP contoh Vultr anda dengan menjalankan yang berikut.

hostname -I

Anda akan melihat halaman maklumat PHP.

Mengkonfigurasi bekas MySQL

Imej MySQL rasmi membolehkan anda mengkonfigurasi bekas melalui pemboleh ubah persekitaran mudah. Ini boleh dilakukan dengan environmentpilihan dalam definisi blok perkhidmatan. Kemas kini ~/docker/app/docker-compose.ymlfail ke yang berikut.

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:

Sekarang kami telah menentukan perkhidmatan baru untuk pangkalan data. Perhatikan garis dbdata:/var/lib/mysql. Ini menaikkan jalan pada wadah /var/lib/mysqlke kelantangan berterusan yang dikendalikan oleh Docker, dengan cara ini data pangkalan data berterusan setelah wadah dikeluarkan. Jilid ini perlu ditentukan dalam blok tingkat atas seperti yang anda dapat lihat di akhir fail.

Sebelum mengatur konfigurasi baru kami, mari memuat turun contoh pangkalan data MySQL. The dokumentasi MySQL rasmi menyediakan beberapa pangkalan data sampel. Kami akan menggunakan pangkalan data dunia yang terkenal. Pangkalan data ini menyediakan senarai negara dan bandar. Untuk memuat turun sampel ini, jalankan perkara berikut di dalam folder aplikasi kami.

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

Sekarang mari kita mengatur bekas kami.

docker-compose up -d

Seperti yang telah anda perhatikan, docker-compose uparahan itu hanya bermula dengan bekas yang belum dimulakan. Ia memeriksa perbezaan antara docker-compose.ymlfail anda dan konfigurasi bekas yang sedang berjalan.

Sekali lagi, periksa bahawa bekas MySQL telah dimulakan.

docker ps

Kini mengisi pangkalan data dunia.

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

Anda boleh mengesahkan bahawa pangkalan data diisi dengan memilih data secara langsung dari pangkalan data. Akses terlebih dahulu petikan MySQL di dalam bekas.

docker-compose exec mysql mysql -uroot -proot world

Dalam prompt MySQL, jalankan yang berikut.

select * from city limit 10;

Anda akan melihat senarai bandar-bandar. Sekarang tutup arahan MySQL.

mysql> exit

Membina permohonan kami

Sekarang bahawa semua bekas yang diperlukan dan berjalan, kita boleh memberi tumpuan kepada permohonan sampel kami. Kemas kini app/index.phpfail ke yang berikut.

<?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>

Jika anda mengakses [vultr-instance-ip]dalam penyemak imbas web, anda akan melihat senarai bandar yang paling ramai penduduk di dunia. Tahniah, anda telah menggunakan aplikasi PHP yang berfungsi sepenuhnya menggunakan docker.

Kesimpulannya

Dalam tutorial ini, saya telah menunjukkan langkah demi langkah bagaimana mengkonfigurasi aplikasi PHP yang berfungsi sepenuhnya. Kami membina imej tersuai untuk PHP dan Nginx, dan dikonfigurasikan docker-compose untuk mengaturkan bekas kami. Walaupun sangat asas dan sederhana, persediaan ini mencerminkan senario kehidupan sebenar.

Dalam panduan ini, kami telah membina dan menandakan imej kami secara tempatan. Untuk persediaan yang lebih fleksibel, anda boleh menolak imej-imej ini ke registry docker . Anda boleh menolak ke pendaftaran docker rasmi atau juga membuat pendaftaran docker anda sendiri. Walau apa pun, ini akan membolehkan anda membina gambar anda pada satu host dan menggunakannya pada yang lain.

Untuk penggunaan yang lebih terperinci docker-compose, anda harus merujuk kepada dokumentasi rasmi .

Bergantung pada keperluan aplikasi anda dan kerangka PHP yang anda gunakan, anda mungkin ingin menambahkan lebih banyak sambungan. Ini dapat dilakukan dengan mudah dengan mengubah suai yang Dockerfiledigunakan untuk membina gambar PHP tersuai kami. Walau bagaimanapun, sesetengah pelanjutan memerlukan lebih banyak dependensi untuk dipasang di dalam bekas. Anda harus merujuk pada senarai peluasan dalam dokumentasi rasmi PHP untuk mengkaji keperluan asas setiap peluasan.



Leave a Comment

Terapkan Kubernetes Dengan Kubeadm di CentOS 7

Terapkan Kubernetes Dengan Kubeadm di CentOS 7

Gambaran Keseluruhan Artikel ini dimaksudkan untuk membantu anda mendapatkan cluster Kubernet dan berjalan dengan kubeadm dalam waktu singkat. Panduan ini akan menggunakan dua pelayan, di

Pasang Docker CE pada Ubuntu 18.04

Pasang Docker CE pada Ubuntu 18.04

Pengenalan Docker adalah aplikasi yang memungkinkan kita menyebarkan program yang dijalankan sebagai wadah. Ia ditulis dalam bahasa pengaturcaraan Go yang popular

Buat Docker Swarm pada Alpine Linux 3.9.0

Buat Docker Swarm pada Alpine Linux 3.9.0

Pendahuluan Panduan ini akan menunjukkan kepada anda cara membuat dan mengkonfigurasi kawanan Docker menggunakan beberapa pelayan Alpine Linux 3.9.0 dan Portainer. Harap maklum tha

Pasang Rancher pada Ubuntu 16.04

Pasang Rancher pada Ubuntu 16.04

Menggunakan Sistem Berbeza? Pengenalan Rancher adalah platform sumber terbuka untuk menjalankan kontena dan membina perkhidmatan kontena peribadi. Rancher adalah asas

Memasang komposisi dok pada CoreOS

Memasang komposisi dok pada CoreOS

Artikel ini menerangkan cara memasang docker-compose pada CoreOS. Di CoreOS, folder / usr / tidak berubah sehingga jalan standard / usr / local / bin tidak tersedia

Pada CoreOS, Sediakan Docker Registry Anda Sendiri

Pada CoreOS, Sediakan Docker Registry Anda Sendiri

Kita semua tahu dan menyukai Docker, platform untuk membuat, mengurus dan mengedarkan bekas aplikasi di pelbagai mesin. Docker Inc. menyediakan perkhidmatan t

Pasang Rancher di CentOS 7

Pasang Rancher di CentOS 7

Menggunakan Sistem Berbeza? Pengenalan Rancher adalah platform sumber terbuka untuk menjalankan kontena dan membina perkhidmatan kontena peribadi. Rancher adalah asas

Sesi Sticky Dengan Swarm Docker (CE) pada CentOS 7

Sesi Sticky Dengan Swarm Docker (CE) pada CentOS 7

Menggunakan Sistem Berbeza? Pengenalan Docker Swarm menukarkan pelayan individu anda ke dalam kumpulan komputer, memudahkan scaling, ketersediaan tinggi

Memasang Docker di CentOS 7

Memasang Docker di CentOS 7

Menggunakan Sistem yang berbeza? Docker adalah aplikasi yang memungkinkan penggunaan perisian dalam wadah maya. Ia ditulis dalam program Go

Pasang Rancher Server di RancherOS

Pasang Rancher Server di RancherOS

Gambaran Keseluruhan RancherOS adalah sistem operasi yang sangat ringan (hanya sekitar 60 MB) yang menjalankan sistem Docker daemon sebagai PID 0 untuk menjalankan sistem perkhidmatan

Sesi Melekit Dengan Docker Swarm (CE) di Debian 9

Sesi Melekit Dengan Docker Swarm (CE) di Debian 9

Menggunakan Sistem Berbeza? Pengenalan Docker Swarm menukarkan pelayan individu anda ke dalam kumpulan komputer; memudahkan penskalaan, ketersediaan tinggi dan

Cara Menggunakan Docker: Membuat Bekas Docker Pertama Anda

Cara Menggunakan Docker: Membuat Bekas Docker Pertama Anda

Tutorial ini menerangkan asas-asas untuk memulakan Docker. Saya menganggap bahawa anda sudah memasang Docker. Langkah-langkah dalam tutorial ini akan berfungsi pada

Muatkan Baki dengan Docker

Muatkan Baki dengan Docker

Semasa menjalankan aplikasi web, biasanya anda ingin memanfaatkan sepenuhnya sumber anda tanpa perlu menukar perisian anda untuk menggunakan multithreading o

Mulakan Dengan SQL Server 2017 (MS-SQL) di CentOS 7 With Docker

Mulakan Dengan SQL Server 2017 (MS-SQL) di CentOS 7 With Docker

Prasyarat enjin Docker 1.8+. Minimum ruang cakera 4GB. Minimum RAM 4GB. Langkah 1. Pasang Docker Untuk memasang SQL-Server, Docker mus

Memasang Docker CE pada Debian 9

Memasang Docker CE pada Debian 9

Menggunakan Sistem Berbeza? Pengenalan Docker adalah aplikasi yang memungkinkan penggunaan perisian dalam wadah maya. Ia ditulis dalam G

Memasang Docker di Ubuntu 14.04

Memasang Docker di Ubuntu 14.04

Menggunakan Sistem yang berbeza? Docker adalah aplikasi yang memungkinkan untuk menyebarkan program yang dijalankan sebagai wadah. Ia ditulis dalam program Go yang popular

Terapkan Aplikasi Node.js Menggunakan Docker

Terapkan Aplikasi Node.js Menggunakan Docker

Artikel ini akan menunjukkan kepada anda cara menyebarkan aplikasi Node anda dalam wadah Docker. Catatan: Tutorial ini mengandaikan bahawa anda telah memasang dan membaca Docker

Persediaan Sentry melalui Docker di Ubuntu 16.04

Persediaan Sentry melalui Docker di Ubuntu 16.04

Menggunakan Sistem Berbeza? Pengenalan Sentry adalah penyelesaian sumber terbuka untuk pengesanan ralat. Sentry menjejaki pengecualian dan mesej berguna lain dari sana

Cara Memasang Harbour di CentOS 7

Cara Memasang Harbour di CentOS 7

Harbour adalah pelayan pendaftaran kelas perusahaan sumber terbuka yang menyimpan dan menyebarkan gambar Docker. Harbour memperluas sumber terbuka Docker Distribution b

Pasang Rancher OS melalui iPXE

Pasang Rancher OS melalui iPXE

Rancher OS adalah sebaran Linux yang sangat ringan yang dibina di sekitar Docker. OS itu sendiri mempunyai berat sekitar 20MB. Tutorial ini akan membuatkan anda dapat menggunakannya

Pandangan tentang 26 Teknik Analisis Data Besar: Bahagian 1

Pandangan tentang 26 Teknik Analisis Data Besar: Bahagian 1

Pandangan tentang 26 Teknik Analisis Data Besar: Bahagian 1

6 Perkara Yang Sangat Menggila Tentang Nintendo Switch

6 Perkara Yang Sangat Menggila Tentang Nintendo Switch

Ramai daripada anda tahu Switch akan keluar pada Mac 2017 dan ciri baharunya. Bagi yang tidak tahu, kami telah menyediakan senarai ciri yang menjadikan 'Tukar' sebagai 'gajet yang mesti ada'.

Janji Teknologi Yang Masih Tidak Ditepati

Janji Teknologi Yang Masih Tidak Ditepati

Adakah anda menunggu gergasi teknologi memenuhi janji mereka? semak apa yang masih belum dihantar.

Fungsi Lapisan Seni Bina Rujukan Data Besar

Fungsi Lapisan Seni Bina Rujukan Data Besar

Baca blog untuk mengetahui lapisan berbeza dalam Seni Bina Data Besar dan fungsinya dengan cara yang paling mudah.

Bagaimana AI Boleh Mengambil Automasi Proses ke Tahap Seterusnya?

Bagaimana AI Boleh Mengambil Automasi Proses ke Tahap Seterusnya?

Baca ini untuk mengetahui cara Kecerdasan Buatan semakin popular di kalangan syarikat berskala kecil dan cara ia meningkatkan kebarangkalian untuk menjadikan mereka berkembang dan memberikan pesaing mereka kelebihan.

CAPTCHA: Berapa Lama Ia Boleh Kekal Sebagai Teknik Berdaya maju Untuk Perbezaan Manusia-AI?

CAPTCHA: Berapa Lama Ia Boleh Kekal Sebagai Teknik Berdaya maju Untuk Perbezaan Manusia-AI?

CAPTCHA telah menjadi agak sukar untuk diselesaikan oleh pengguna dalam beberapa tahun kebelakangan ini. Adakah ia dapat kekal berkesan dalam pengesanan spam dan bot pada masa hadapan?

Keunikan Teknologi: Masa Depan Tamadun Manusia yang Jauh?

Keunikan Teknologi: Masa Depan Tamadun Manusia yang Jauh?

Apabila Sains Berkembang pada kadar yang pantas, mengambil alih banyak usaha kita, risiko untuk menundukkan diri kita kepada Ketunggalan yang tidak dapat dijelaskan juga meningkat. Baca, apakah makna ketunggalan bagi kita.

Teleperubatan Dan Penjagaan Kesihatan Jauh: Masa Depan Ada Di Sini

Teleperubatan Dan Penjagaan Kesihatan Jauh: Masa Depan Ada Di Sini

Apakah teleperubatan, penjagaan kesihatan jauh dan impaknya kepada generasi akan datang? Adakah ia tempat yang baik atau tidak dalam situasi pandemik? Baca blog untuk mencari paparan!

Pernahkah Anda Terfikir Bagaimana Penggodam Mendapatkan Wang?

Pernahkah Anda Terfikir Bagaimana Penggodam Mendapatkan Wang?

Anda mungkin pernah mendengar bahawa penggodam memperoleh banyak wang, tetapi pernahkah anda terfikir bagaimana mereka memperoleh wang seperti itu? Mari berbincang.

Kemas Kini Tambahan macOS Catalina 10.15.4 Menyebabkan Lebih Banyak Isu Daripada Penyelesaian

Kemas Kini Tambahan macOS Catalina 10.15.4 Menyebabkan Lebih Banyak Isu Daripada Penyelesaian

Baru-baru ini Apple mengeluarkan macOS Catalina 10.15.4 kemas kini tambahan untuk menyelesaikan masalah tetapi nampaknya kemas kini itu menyebabkan lebih banyak masalah yang membawa kepada pemusnahan mesin mac. Baca artikel ini untuk mengetahui lebih lanjut