创建Bagisto Docker环境
系统要求
-
Bagisto基于Laravel框架
-
PHP 8.1+(Laravel 10+要求)
-
MySQL 8.0+或MariaDB
-
Nginx作为Web服务器
实现步骤
- 创建`docker-compose.yml`文件,配置以下服务:
-
Nginx:Web服务器,端口80
-
PHP 8.4-fpm:PHP解释器(本次安装使用的是8.4-fpm)
-
MySQL 8.0:数据库,端口3306
-
phpMyAdmin:数据库管理工具,端口8080
-
配置Nginx虚拟主机,指向Bagisto项目的`public`目录
-
配置PHP扩展,确保Bagisto所需的扩展已安装
-
配置MySQL环境变量,设置根密码和数据库名
-
提供启动和停止Docker环境的命令说明
文件结构
```
bagisto-docker/
├── docker-compose.yml
├── nginx/
│ └── default.conf
├── php/
│ └── Dockerfile
│ └── php.ini
└── src/ # Bagisto项目目录(将在启动后克隆)
```
预期结果
-
成功启动Docker容器
-
可以通过浏览器访问Bagisto(http://localhost)
-
可以通过phpMyAdmin管理数据库(http://localhost:8080)
-
所有服务正常通信
开始部署
说明一下,现在需要在Docker中安装需要的环境,我使用的是Nginx+mysql+php+phpmyadmin
版本分别为:
nginx:alpine # 使用轻量级的Alpine Linux版本的Nginx镜像。nginx/1.29.4
php:8.4-fpm # 直接使用官方PHP 8.4 FPM镜像,本来想直接使用Batisto建议的8.1版本,但是始终安装不成功,在Docker仓库中找到了8.4-fpm版本,就先安装这个版本。
mysql:8.0 # 使用MySQL 8.0镜像,符合Bagisto要求
phpmyadmin/phpmyadmin # 使用官方phpMyAdmin镜像
首先
创建docker-compose.yml文件,包含Nginx、PHP 8.4-fpm、MySQL 8.0和phpMyAdmin服务。
该文件定义了环境版本、端口映射、目录映射、各种配置文件的目录等。
docker-compose.yml 文件内容:
# Docker Compose配置文件,用于创建Bagisto电商平台运行环境
services:
# Nginx Web服务器服务
nginx:
image: nginx:alpine # 使用轻量级的Alpine Linux版本的Nginx镜像
container_name: bagisto-nginx # 容器名称,方便管理
restart: unless-stopped # 除非手动停止,否则容器崩溃时自动重启
ports:
- "80:80" # 将主机的80端口映射到容器的80端口,用于访问Bagisto网站
volumes:
- ./src:/var/www/html # 将主机的src目录挂载到容器的/var/www/html,存放Bagisto项目代码
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 挂载Nginx配置文件
depends_on:
- php # 依赖php服务,确保php服务先启动
networks:
- bagisto-network # 加入自定义网络,方便容器间通信
# PHP服务,使用PHP-FPM模式
php:
build: ./php #php:8.4-fpm # 直接使用官方PHP 8.4 FPM镜像
container_name: bagisto-php # 容器名称
restart: unless-stopped # 除非手动停止,否则自动重启
volumes:
- ./src:/var/www/html # 挂载Bagisto项目代码
- ./php/php.ini:/usr/local/etc/php/conf.d/php.ini # 挂载PHP配置文件
environment:
- DB_HOST=mysql # 数据库主机名,对应下面的mysql服务名
- DB_PORT=3306 # 数据库端口
- DB_DATABASE=bagisto # 数据库名称
- DB_USERNAME=bagisto # 数据库用户名
- DB_PASSWORD=bagisto123 # 数据库密码
depends_on:
- mysql # 依赖mysql服务
networks:
- bagisto-network # 加入自定义网络
# MySQL数据库服务
mysql:
image: mysql:8.0 # 使用MySQL 8.0镜像,符合Bagisto要求
container_name: bagisto-mysql # 容器名称
restart: unless-stopped # 除非手动停止,否则自动重启
ports:
- "3306:3306" # 将主机的3306端口映射到容器的3306端口,方便外部连接
volumes:
- mysql-data:/var/lib/mysql # 挂载数据卷,持久化存储MySQL数据
environment:
- MYSQL_ROOT_PASSWORD=root123 # MySQL根用户密码
- MYSQL_DATABASE=bagisto # 自动创建的数据库名称
- MYSQL_USER=bagisto # 自动创建的数据库用户
- MYSQL_PASSWORD=bagisto123 # 自动创建的数据库用户密码
networks:
- bagisto-network # 加入自定义网络
# phpMyAdmin数据库管理工具
phpmyadmin:
image: phpmyadmin/phpmyadmin # 使用官方phpMyAdmin镜像
container_name: bagisto-phpmyadmin # 容器名称
restart: unless-stopped # 除非手动停止,否则自动重启
ports:
- "8080:80" # 将主机的8080端口映射到容器的80端口,用于访问phpMyAdmin
environment:
- PMA_HOST=mysql # 数据库主机名,对应mysql服务名
- PMA_PORT=3306 # 数据库端口
- MYSQL_ROOT_PASSWORD=root123 # MySQL根用户密码,用于phpMyAdmin登录
depends_on:
- mysql # 依赖mysql服务
networks:
- bagisto-network # 加入自定义网络
# 数据卷定义,用于持久化存储
volumes:
mysql-data: # MySQL数据卷,确保数据不会丢失
# 自定义网络,用于容器间通信
networks:
bagisto-network: # 定义网络名称
driver: bridge # 使用bridge驱动,Docker默认网络类型
然后,创建各个配置文件
各配置文件目录都在docker-compose.yml文件中
Nginx
-
./src:/var/www/html # 将主机的src目录挂载到容器的/var/www/html,存放Bagisto项目代码
-
./nginx/default.conf:/etc/nginx/conf.d/default.conf # 挂载Nginx配置文件
default.conf
# Nginx虚拟主机配置文件,用于Bagisto电商平台
# 定义HTTP服务器
server {
listen 80; # 监听80端口
server_name localhost; # 服务器名称,可以是域名或IP地址
# 网站根目录,指向Bagisto项目的public目录
root /var/www/html/public;
index index.php index.html index.htm; # 默认索引文件
# 访问日志和错误日志配置
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# 处理静态文件请求,直接返回文件内容
location ~* \.(css|js|gif|png|jpg|jpeg|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y; # 静态文件缓存1年
add_header Cache-Control "public, immutable";
try_files $uri $uri/ =404; # 尝试查找文件,找不到返回404
}
# 处理PHP文件请求,转发给PHP-FPM处理
location ~ \.php$ {
try_files $uri =404; # 检查PHP文件是否存在,不存在返回404
fastcgi_pass php:9000; # 转发请求到php服务的9000端口(PHP-FPM默认端口)
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 设置脚本文件名参数
include fastcgi_params; # 包含FastCGI通用参数
}
# 处理目录请求,用于Laravel路由(Bagisto基于Laravel)
location / {
try_files $uri $uri/ /index.php?$query_string; # 尝试查找文件,找不到则转发给index.php处理
}
# 禁止访问.htaccess等隐藏文件
location ~ /\.ht {
deny all; # 拒绝所有访问
}
}
PHP
重点:必须安装Bagisto需要的扩展
- php-intl:国际化支持的必需
- php-gd:图像处理和处理的必备工具
- 其他标准的Laravel扩展 :通过命令进行检查
php -m
关键设置:php.ini
memory_limit = 4G
max_execution_time = 360
这些配置是Bagisto要求的必须配置
-
./src:/var/www/html # 挂载Bagisto项目代码
-
./php/php.ini:/usr/local/etc/php/conf.d/php.ini # 挂载PHP配置文件
PHP配置文件,用于Bagisto电商平台
基本配置
max_execution_time = 360 ; 最大执行时间,Bagisto需要较长时间处理某些操作
memory_limit = 4G ; 内存限制,Bagisto需要足够的内存
upload_max_filesize = 200M ; 最大上传文件大小
post_max_size = 500M ; 最大POST数据大小
max_input_vars = 10000 ; 最大输入变量数,用于表单提交时区配置
date.timezone = Asia/Shanghai ; 设置时区为上海
错误报告
display_errors = On ; 开发环境显示错误
display_startup_errors = On ; 显示启动错误
error_reporting = E_ALL ; 报告所有错误
log_errors = On ; 记录错误到日志文件会话配置
session.save_path = /tmp ; 会话文件保存路径
OPcache配置(提高PHP性能)
opcache.enable = 1 ; 启用OPcache
opcache.memory_consumption = 256 ; OPcache内存大小
opcache.max_accelerated_files = 10000 ; 最大加速文件数
opcache.validate_timestamps = 1 ; 验证文件时间戳
opcache.revalidate_freq = 2 ; 重新验证频率(秒)MySQLi配置
mysqli.default_host = mysql ; 默认MySQL主机
mysqli.default_port = 3306 ; 默认MySQL端口PDO MySQL配置
pdo_mysql.default_socket = ; 默认MySQL套接字(留空使用TCP连接)
其他配置
cgi.fix_pathinfo = 0 ; 修复路径信息(安全配置)
allow_url_fopen = On ; 允许打开URL文件
short_open_tag = On ; 允许短标签 <? ?>
Dockerfile
# 使用官方PHP 8.4 FPM镜像作为基础镜像
FROM php:8.4-fpm
# 维护者信息
LABEL maintainer="Bagisto Docker Environment"
# 安装系统依赖包
RUN apt-get update && apt-get install -y \
curl \
git \
zip \
unzip \
libpng-dev \
libjpeg-dev \
libfreetype-dev \
libxml2-dev \
libzip-dev \
libonig-dev \
libicu-dev \
&& rm -rf /var/lib/apt/lists/*
# 配置GD扩展(支持JPEG、PNG等图片格式)
RUN docker-php-ext-configure gd --with-freetype --with-jpeg
# 安装PHP扩展
RUN docker-php-ext-install \
bcmath \
calendar \
gd \
intl \
mbstring \
mysqli \
pdo_mysql \
soap \
zip \
opcache
# 安装Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# 设置工作目录
WORKDIR /var/www/html
# 设置文件权限
RUN chown -R www-data:www-data /var/www/html
# 暴露PHP-FPM端口
EXPOSE 9000
# 启动PHP-FPM服务
CMD ["php-fpm"]
配置文件做好,下面开始创建环境
- 启动Docker容器
在项目根目录(包含docker-compose.yml的目录)中执行以下命令:
docker-compose --project-name bagisto up -d --build
project-name bagisto 为项目名字
这个命令会:
-
拉取所需的Docker镜像(如果本地没有)
-
创建并启动所有配置的服务容器:
-
Nginx(Web服务器)
-
PHP 8.1-fpm(PHP解释器)
-
MySQL 8.0(数据库)
-
phpMyAdmin(数据库管理工具)
-
所有容器在后台运行
中间出现的问题:
①国外源镜像拉取不到,需要再Docker->Docker 引擎配置国内源
目前亲测可用的镜像源 "https://docker.1ms.run", "https://docker.xuanyuan.me/",
或者网络问题,需要科学上网或者配置国内源
②php拓展安装不成功,需要手动安装
安装系统依赖包
进入PHP容器
docker-compose --project-name bagisto exec php bash
apt-get update && apt-get install -y \
curl \
git \
zip \
unzip \
libpng-dev \
libjpeg-dev \
libfreetype-dev \
libxml2-dev \
libzip-dev \
libonig-dev \
libicu-dev \
&& rm -rf /var/lib/apt/lists/*
查看是否安装成功
在容器内部执行apt命令验证依赖是否成功安装
apt list --installed | grep -E 'curl|git|zip|unzip|libpng-dev|libjpeg-dev|libfreetype-dev|libxml2-dev|libzip-dev|libonig-dev|libicu-dev'
来个简单的脚本给小白,# 检查所有必需的系统依赖
echo "=== 系统依赖检查 ===" && deps="curl git zip unzip libpng-dev libjpeg-dev libfreetype-dev libxml2-dev libzip-dev libonig-dev libicu-dev" && for pkg in $deps; do if dpkg -s $pkg > /dev/null 2>&1; then echo "✓ $pkg (已安装)"; else echo "✗ $pkg (未安装)"; fi; done
输出显示更直观
=== 系统依赖检查 ===
✓ curl (已安装)
✓ git (已安装)
✓ zip (已安装)
✓ unzip (已安装)
✓ libpng-dev (已安装)
✓ libjpeg-dev (已安装)
✓ libfreetype-dev (已安装)
✓ libxml2-dev (已安装)
✓ libzip-dev (已安装)
✓ libonig-dev (已安装)
✓ libicu-dev (已安装)
手动安装PHP扩展
docker-php-ext-install \
bcmath \
calendar \
gd \
intl \
mbstring \
mysqli \
pdo_mysql \
soap \
zip \
opcache
检查所有必需的PHP扩展
验证安装结果
php -m | grep -E 'bcmath|calendar|gd|intl|mbstring|mysqli|pdo_mysql|soap|zip|opcache'
来个简单的小白能看到懂的直接运行命令 # 检查所有必需的PHP扩展
echo "=== PHP扩展检查 ===" && extensions="bcmath calendar gd intl mbstring mysqli pdo_mysql soap zip opcache" && for ext in $extensions; do if php -m | grep -q "^$ext$"; then echo "✓ $ext"; else echo "✗ $ext"; fi; done
输出
root@97a320f33ad2:/var/www/html# # 检查所有必需的PHP扩展
string mysqli pdo_mysql soap zip opcache" && for ext in $exts; do if php -m | grep -i -q "^$ext$";
then echo "✓ $ext"; else echo "✗ $ext"; fi; done
=== PHP扩展检查 ===
✗ bcmath
✗ calendar
✗ gd
✗ intl
✓ mbstring
✗ mysqli
✗ pdo_mysql
✗ soap
✗ zip
✗ opcache
root@97a320f33ad2:/var/www/html#
所有依赖安装成功之后安装composer
-
进入PHP容器
docker-compose --project-name bagisto exec php bash
-
安装Composer
下载并安装Composer到/usr/local/bin目录
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
验证Composer安装成功
composer --version
Composer安装成功后
-
继续执行Bagisto部署步骤
进入项目根目录
cd /var/www/html
安装项目依赖
composer install
配置环境变量
cp .env.example .env
vi .env生成应用密钥
php artisan key:generate
运行数据库迁移和填充
php artisan migrate
php artisan db:seed发布资源和创建存储链接
php artisan vendor:publish --all
php artisan storage:link设置文件权限
chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache