透過Docker Compose、Nginx和MariaDB實現PHP應用程式的資料備份與還原

王林
發布: 2023-10-12 11:48:02
原創
993 人瀏覽過

通过Docker Compose、Nginx和MariaDB实现PHP应用程序的数据备份与还原

透過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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!