透過Docker Compose、Nginx和MariaDB實現PHP應用程式的資料備份與還原
#隨著雲端運算與容器化技術的快速發展,越來越多的應用程式選擇使用Docker來部署和運行。在Docker生態系統中,Docker Compose是一個非常受歡迎的工具,它可以透過一個單一的設定檔來定義和管理多個容器。
本文將介紹如何使用Docker Compose、Nginx和MariaDB實作PHP應用程式的資料備份與還原。我們將使用一個範例專案來演示這個過程。
範例專案結構如下:
. ├── docker-compose.yml ├── nginx │ └── default.conf ├── mariadb │ ├── Dockerfile │ └── init.sql └── php ├── Dockerfile └── index.php
首先,我們需要建立一個docker-compose.yml
檔案來定義整個專案的容器配置。範例配置如下:
version: '3' services: nginx: image: nginx:latest ports: - 80:80 volumes: - ./nginx:/etc/nginx/conf.d - ./php:/var/www/html depends_on: - php mariadb: build: context: ./mariadb environment: - MYSQL_ROOT_PASSWORD=123456 - MYSQL_DATABASE=mydb volumes: - ./mariadb/data:/var/lib/mysql ports: - 3306:3306 php: build: context: ./php volumes: - ./php:/var/www/html
在上面的設定中,我們定義了三個服務:Nginx、MariaDB和PHP。 Nginx服務負責處理HTTP請求,將請求轉送到PHP容器上的應用程式;MariaDB服務提供資料庫服務;PHP容器運行PHP應用程式。
接下來,我們需要建立一個Nginx設定檔default.conf
,用於將HTTP請求轉送到PHP容器上的應用程式。範例配置如下:
server { listen 80; server_name localhost; root /var/www/html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ .php$ { try_files $uri =404; fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
在上面的設定中,我們定義了兩個location區塊。第一個location區塊用於處理靜態檔案請求,例如圖片、CSS和JavaScript檔案;第二個location區塊用於將PHP腳本請求轉送到PHP容器上的FastCGI進程。
然後,我們需要建立一個MariaDB容器的Dockerfile和初始化腳本init.sql
。範例Dockerfile如下:
FROM mariadb:latest COPY init.sql /docker-entrypoint-initdb.d
範例init.sql
腳本用於建立一個mydb
資料庫和一個users
表:
CREATE DATABASE IF NOT EXISTS mydb; USE mydb; CREATE TABLE IF NOT EXISTS users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL );
最後,我們需要建立一個PHP容器的Dockerfile和一個範例的PHP應用程式index.php
。範例Dockerfile如下:
FROM php:7.4-fpm RUN apt-get update && apt-get install -y zlib1g-dev libzip-dev RUN docker-php-ext-install zip pdo_mysql COPY index.php /var/www/html
範例index.php
應用程式用於示範資料備份和還原的過程:
<?php $dbHost = 'mariadb'; $dbUser = 'root'; $dbPass = '123456'; $dbName = 'mydb'; try { $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]); // 插入数据 $pdo->exec("INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com')"); // 查询数据 $stmt = $pdo->query("SELECT * FROM users"); $users = $stmt->fetchAll(); // 打印数据 foreach ($users as $user) { echo $user['name'] . ' (' . $user['email'] . ')' . PHP_EOL; } } catch (PDOException $e) { echo "Error: " . $e->getMessage(); }
現在,我們可以執行docker- compose up
指令來啟動整個專案。在瀏覽器中存取http://localhost
,應該可以看到插入的資料和列印的結果。
為了實現資料備份,我們可以新增一個Shell腳本來定期執行資料庫備份作業。範例腳本如下:
#!/bin/bash BACKUP_DIR="/path/to/backup" DATE=$(date +%Y%m%d%H%M%S) BACKUP_FILE="$BACKUP_DIR/mydb_$DATE.sql" docker exec -i CONTAINER_NAME mysqldump -uroot -p123456 mydb > $BACKUP_FILE if [ $? -eq 0 ]; then echo "Backup completed: $BACKUP_FILE" else echo "Backup failed" fi
上面的腳本首先定義了備份目錄和備份檔案名稱。然後,它使用docker exec
命令執行mysqldump
指令來匯出資料庫,並將匯出的資料儲存到備份檔案。
為了實現資料還原,我們可以建立一個Shell腳本來執行資料庫還原作業。範例腳本如下:
#!/bin/bash BACKUP_FILE="/path/to/backup/mydb_20210101120000.sql" docker exec -i CONTAINER_NAME mysql -uroot -p123456 mydb < $BACKUP_FILE if [ $? -eq 0 ]; then echo "Restore completed" else echo "Restore failed" fi
上述腳本會使用docker exec
指令將備份檔案中的資料匯入到資料庫中。
透過上述步驟,我們成功地使用Docker Compose、Nginx和MariaDB實現了PHP應用程式的資料備份與還原。透過定期執行備份腳本,我們可以建立資料庫的快照,以便在需要時進行還原。這為我們的應用程式提供了更高的可用性和容錯性。
以上是透過Docker Compose、Nginx和MariaDB實現PHP應用程式的資料備份與還原的詳細內容。更多資訊請關注PHP中文網其他相關文章!