本文最后更新于 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
你需要修改数据库密码