Docker 搭建 LNMP 环境并且编写定时备份脚本
本文最后更新于 2022年06月24日 已经是 459天前了 ,文章可能具有时效性,若有错误或已失效,请在下方留言

编写 docker-compose.yml

version: '3'
services:
  php:
    deploy:
      resources:
        limits:
          memory: 300M
    image: bitnami/php-fpm:latest
    restart: always
    links:
      - mysql
    depends_on:
      - mysql
    volumes:
      - ./www:/www
      - ./php/etc/:/opt/bitnami/php/etc/
    container_name: php
  nginx:
    deploy:
      resources:
        limits:
          memory: 300M
    image: axizdkr/tengine:latest
    restart: always
    container_name: nginx
    depends_on:
      - php
    links:
      - php
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - ./nginx/logs:/etc/nginx/logs
      - ./nginx/certs:/etc/nginx/certs
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/web.conf:/etc/nginx/conf.d/web.conf
      - ./nginx/key.conf:/etc/nginx/conf.d/key.conf
      - ./www:/www
  mysql:
    deploy:
      resources:
        limits:
          memory: 500M
    image: mysql:5.7
    container_name: mysql
    restart: always
    secrets:
      - mysql_root_password
    volumes:
      - ./backup/mysql:/var/backup
      - ./mysql/conf:/etc/mysql
      - ./mysql/logs:/var/log/mysql
      - ./mysql/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD_FILE: "/run/secrets/mysql_root_password"
secrets:
  mysql_root_password:
    file: ./mysql_root_password

自行修改相关资源限制,根据你的需要,注意配置好www文件的权限,若PHP没权限自行解决吧。如果你需要特定版本,只要修改image: axizdkr/tengine:后面版本号就行,如果没有就需要你自行编译安装了

由于Docker容器与宿主主机共用内核,所以由于php镜像默认运行用户是daemon用户UID为1,所以你需要在宿主主机内将www文件夹的权限授予给UID1,否则PHP脚本的一些功能会受到影响。当然你可以修改配置文件来达到更改php容器运行的UID。

启动环境

docker compose up -d

PHP扩展的安装

我们这里使用pecl安装pecl扩展,并且写入配置文件

Dockerfile

FROM bitnami/php-fpm:latest
RUN install_packages gcc make autoconf libc-dev pkg-config && \
    echo "" | pecl install redis && \
    echo "extension=redis.so\n" > /opt/bitnami/php/etc/conf.d/redis.ini && \
    apt-get -y remove --auto-remove gcc make autoconf libc-dev pkg-config && \
    rm -rf /usr/include/* && \
    rm -rf /tmp/*

查看Pecl命令帮助 🙂 我希望这能帮助你

pecl help

备份脚本编写

文件目录备份

#!/bin/bash
dateBackup=$(TZ=UTC-8 date +%Y-%m-%d_%H:%M:%S)
dir=./backup/www/${dateBackup}
# 宿主机新建目录,通过挂载会自动添加到容器
if [ ! -d "${dir}" ];
then
                mkdir ${dir}
                echo "创建文件夹 ${dir} 成功" >> ${dir}/error.log
else
                echo "创建文件夹 ${dir} 失败,文件夹已存在" >> ${dir}/error.log
fi
files=(./www ./bw-data)
for file in ${files[@]}
do
        echo "-----------------> 备份 ${file} 文件目录 <-----------------" >> ${dir}/error.log
        filename=$(sed 's/\.\///g' <<< "${file}" | sed 's/\//\_/g')
    tar -czvf "${dir}/${filename}.tar.gz" "${file}" > /dev/null
                docker exec rclone rclone copy /data/backup/www/${dateBackup}/${filename}.tar.gz mcenjoy:/backup/file/${dateBackup}/
        if [ $? -eq 0 ]; then
                echo "备份到OneDrive成功" >> ${dir}/error.log
        else
                echo "写入到OneDrive失败" >> ${dir}/error.log
        fi
done


echo -e " \n ----------------> 删除过期文件 <---------------------------" >> ${dir}/error.log
# 判断文件夹数量是否大于7,防止程序意外停止,删除所有备份
dirCount=`ls -l ./backup/www/|grep "^d"|wc -l`
if [ ${dirCount} -gt 7 ];
then
        # 删除超过七天的带"_"的目录
        find ./backup/mysql/ -mtime +6 -name "*" -exec rm -rf {} \;
        echo -e " 删除过期文件成功" >> ${dir}/error.log
else
        echo "删除过期文件失败,文件数量小于 7 " >> ${dir}/error.log

fi

这里我使用了rclone来备份到远端,具体搭建过程参考下面的仓库

备份数据库

当然你可以直接将整个docker文件夹打包复制到服务器备份,这也不失为一个好办法

#!/bin/bash
dateBackup=$(TZ=UTC-8 date +%Y-%m-%d_%H:%M:%S)
dir=./backup/mysql/${dateBackup}
# 宿主机新建目录,通过挂载会自动添加到容器
if [ ! -d "${dir}" ];
then
                mkdir ${dir}
                echo "创建文件夹 ${dir} 成功" >> ${dir}/error.log
else
                echo "创建文件夹 ${dir} 失败,文件夹已存在" >> ${dir}/error.log
fi
dbNames=(mcoo_pw)
for dbName in ${dbNames[@]}
do
                echo "-----------------> 备份 ${dbName} 数据库 <-----------------" >> ${dir}/error.log
        docker exec -i mysql sh -c "mysqldump -uroot -p'*******' ${dbName} 1>> /var/backup/${dateBackup}/${dbName}.sql 2>> /var/backup/${dateBackup}/error.log"
        gzip ${dir}/${dbName}.sql
        docker exec rclone rclone copy /data/backup/mysql/${dateBackup}/${dbName}.sql.gz mcenjoy:backup/mysql/${dateBackup}/
        if [ $? -eq 0 ]; then
                echo "备份到OneDrive成功" >> ${dir}/error.log
        else
                echo "写入到OneDrive失败" >> ${dir}/error.log
        fi
done


echo -e " \n ----------------> 删除过期文件 <---------------------------" >> ${dir}/error.log
# 判断文件夹数量是否大于7,防止程序意外停止,删除所有备份
dirCount=`ls -l ./backup/mysql/|grep "^d"|wc -l`
if [ ${dirCount} -gt 7 ];
then
        # 删除超过七天的带"_"的目录
        find ./backup/mysql/ -mtime +6 -name "*_*" -exec rm -rf {} \;
        echo -e " 删除过期文件成功" >> ${dir}/error.log
else
        echo "删除过期文件失败,文件数量小于 7 " >> ${dir}/error.log

fi

你需要修改数据库密码

广告 广告位招租
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
小黄脸
上一篇
下一篇