使用 docker 部署一个 laravel 5.2 的项目
环境
系统 Ubuntu 24.04 noble
docker 28.3.3 linux/amd64
已安装:https-portal:1、mysql:8.0、redis:8.4.0-bookworm
缺少:php-fpm:7.0、nginx/apache
源码一份、数据库备份一份
部署过程
咨询 deepseek,给出建议:安装 php:7.0.33-apache。里面包含了 php-fpm 和 apache。
计划访问通路:https-portal 给 SSL 域名证书,并将服务转发到 aidrive(项目所在容器名),php:7.0.33-apache 默认监听容器 80 端口。其他的 mysql 和 redis 在项目 .env 中修改 host 为对应的容器名。
最终的目录结构 /root/aidrive_project/:
# apache 配置目录
apache
# 备份的数据库
aidrive.sql
# docker compose 配置文件
docker-compose.yml
# 环境变量,主要声明一下项目名 COMPOSE_PROJECT_NAME=aidrive
.env
# laravel 项目源代码
src最终的配置文件: docker-compose.yml
services:
aidrive:
image: php:7.0.33-apache
container_name: aidrive
restart: unless-stopped
volumes:
- ./src:/var/www/html
- ./apache/000-default.conf:/etc/apache2/sites-available/000-default.conf
networks:
- internal
- shared
command: bash -c "docker-php-ext-install pdo_mysql mbstring && a2enmod rewrite && apache2-foreground"
networks:
internal:
driver: bridge
shared:
external: true
name: shared-services
以下为过程中遇到的问题,做一下记录。
添加了 apache host 配置之后,访问 502
/root/aidrive_project/apache/000-default.conf
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/public # 项目根目录
<Directory /var/www/html/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>直接创建文件复制进来的,可能是中文或者空格什么影响了配置文件的格式。
去掉 apache 配置文件中的中文注释,502 变 500
给权限
docker exec -it aidrive ls -ld /var/www/html/storage /var/www/html/bootstrap/cache500 变成 /login 404
public/.htaccess 添加静态重写
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>ok,解决。
数据库备份还原
docker cp aidrive.sql typecho-mysql:/root 用户登录并创建新账号
docker exec -it mysql mysql -uroot -p
# 登录后,创建用户并授权
CREATE USER 'typecho'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT ALL PRIVILEGES ON aidrive.* TO 'typecho'@'%';
FLUSH PRIVILEGES;因为 typecho 已存在,所以不需要创建用户,直接创建数据库:
CREATE DATABASE IF NOT EXISTS `aidrive`
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;授权并刷新权限
GRANT ALL PRIVILEGES ON `aidrive`.* TO 'typecho'@'%';
# GRANT ALL PRIVILEGES ON `aidrive`.* TO 'typecho'@'localhost';
FLUSH PRIVILEGES;授权如果是使用 localhost 会报错,因为 typecho 用户 host 定义为 %
GRANT ALL PRIVILEGES ON `aidrive`.* TO 'typecho'@'localhost';
ERROR 1410 (42000): You are not allowed to create a user with GRANT还原数据库,之前一般是在容器内 mysql -uroot -p aidrive > aidrive.sql 这种形式。
现在有了新的操作方法(登录 mysql 服务后):
USE `aidrive`;
SOURCE /aidrive.sql;
EXIT;手动重新创建上传文件映射
laravel 5.3 以上可以使用指令生成,5.2 需要手动创建软链,以便后台上传的文件资源前台可以访问到。
/root/aidrive_project/src/public
rm -f storage
ln -s ../storage/app/public storage登录还是不行
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client确认并强制修改 typecho 用户的认证插件
docker exec -it typecho-mysql mysql -uroot -p
# 查看当前用户认证方式
SELECT user, host, plugin FROM mysql.user WHERE user = 'typecho';
# 新版本的caching_sha2_password,要改成mysql_native_password
ALTER USER 'typecho'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
FLUSH PRIVILEGES;测试数据库连接
docker exec -it aidrive php -r "new PDO('mysql:host=mysql;dbname=aidrive', 'typecho', 'password');"报错:
Fatal error: Uncaught PDOException: PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password] in Command line code:1
Stack trace:
#0 Command line code(1): PDO->__construct('mysql:host=type...', 'typecho', 'password')
#1 {main}
Next PDOException: SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client in Command line code:1
Stack trace:
#0 Command line code(1): PDO->__construct('mysql:host=type...', 'typecho', 'password')
#1 {main}
thrown in Command line code on line 1在修改了认证插件之后,需要重启一下容器 docker-compose restart aidrive
登录还是报这个错,尝试其他办法。
修改 docker-compose.yml,为 MySQL 服务添加启动参数
mysql:
image: mysql:8.0
container_name: typecho-mysql
command: --default-authentication-plugin=mysql_native_password重启 MySQL 容器(删除重新创建)
docker compose up -d
[+] Running 2/2
✔ Container typecho-mysql Started 1.5s
✔ Container typecho-app Running 测试 PDO 连接
docker exec -it aidrive php -r "new PDO('mysql:host=typecho-mysql;dbname=aidrive', 'typecho', 'password');"无输出,OK!再次登录,OK!
新增两个字段
ALTER TABLE `aidrive`.`box_alert_log`
ADD COLUMN `checked` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否处理 1=已处理 0=未处理' AFTER `video`;
ALTER TABLE `aidrive`.`boxes`
ADD COLUMN `name` varchar(255) NOT NULL DEFAULT '' COMMENT '设备名' AFTER `id`; 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
海滨擎蟹
微信
支付宝