随着云计算和容器化技术的快速发展,越来越多的应用程序选择使用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应用程序的数据备份与还原。通过定期执行备份脚本,我们可以创建数据库的快照,以便在需要时进行还原。这为我们的应用程序提供了更高的可用性和容错性。