通过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:latestcopy 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-fpmrun apt-get update && apt-get install -y zlib1g-dev libzip-devrun docker-php-ext-install zip pdo_mysqlcopy 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/bashbackup_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_fileif [ $? -eq 0 ]; then echo "backup completed: $backup_file"else echo "backup failed"fi
上面的脚本首先定义了备份目录和备份文件名。然后,它使用docker exec命令执行mysqldump命令来导出数据库,并将导出的数据保存到备份文件中。
为了实现数据还原,我们可以创建一个shell脚本来执行数据库还原操作。示例脚本如下:
#!/bin/bashbackup_file="/path/to/backup/mydb_20210101120000.sql"docker exec -i container_name mysql -uroot -p123456 mydb < $backup_fileif [ $? -eq 0 ]; then echo "restore completed"else echo "restore failed"fi
上述脚本会使用docker exec命令将备份文件中的数据导入到数据库中。
通过上述步骤,我们成功地使用docker compose、nginx和mariadb实现了php应用程序的数据备份与还原。通过定期执行备份脚本,我们可以创建数据库的快照,以便在需要时进行还原。这为我们的应用程序提供了更高的可用性和容错性。
以上就是通过docker compose、nginx和mariadb实现php应用程序的数据备份与还原的详细内容。