很多网友问我怎么在docker上部署fastadmin,我看大多数网友的教程及搜索很部署方式,感觉大家都讲的一知半解,要么配置文件没有任何的注释和说明,导致很多小白不是很通透。我就自己整理了一份docker部署fastadmin笔记记录,希望对有需求的网友有用,配置文件关键的地方都有注释说明,按照我的部署可以一键安装和构建

1. 项目目录结构准备

your-project/
├── docker-compose.yaml  # docker compose 构建部署文件
├── php-fpm.Dockerfile # 构建php镜像 环境和扩展的文件
├── deploy.sh                # 一键执行脚本文件
├── config/                    # 配置文件夹
│   ├── nginx-site.conf  # nginx的fastadmin配置文件
│   └── php.ini             # php的配置文件
├── fastadmin/           # (需手动创建)将从官网下载的完整包解压至此
└── .env                    # (可选)用于管理敏感环境变量

2. 基础介绍

  • 框架基础:FastAdmin是一个基于ThinkPHP 5.1开发的PHP后台管理框架

  • 核心要求

    • PHP 7.4:这是官方推荐且与v1.3.4+版本兼容的最佳选择

    • Nginx伪静态:必须配置为thinkphp规则,否则路由无法正常工作

    • 关键目录:运行目录必须设置为/public/runtime目录需要写入权限

    • 数据库:需MySQL 5.6至8.0版本(支持InnoDB引擎)

3. 文件编写

1. docker-compose.yaml

version: '3.8'

services:
  # PHP-FPM 7.4 服务,用于运行FastAdmin应用
  php-fpm:
    # 方案1:使用自定义Dockerfile构建镜像(推荐,避免运行时安装扩展)
    build:
      context: .
      dockerfile: php-fpm.Dockerfile  # 使用自定义的Dockerfile构建镜像
    container_name: fastadmin-php
    restart: unless-stopped
    # 将宿主机上的FastAdmin源码目录挂载到容器的工作目录
    volumes:
      - ./fastadmin:/var/www/html
      # 挂载自定义的PHP配置文件,覆盖镜像默认设置
      - ./config/php.ini:/usr/local/etc/php/conf.d/custom.ini
    # 注意:这里不再需要 user: "1000:1000",因为Dockerfile中已设置USER www-data
    # Dockerfile会确保www-data用户的UID与宿主机匹配
    depends_on:
      - mysql
    # 无需在运行时安装扩展,所有扩展已在Dockerfile中预先安装
    networks:
      - fastadmin-network

  # Nginx Web服务器,处理HTTP请求并转发PHP动态请求
  nginx:
    image: nginx:alpine
    container_name: fastadmin-nginx
    restart: unless-stopped
    ports:
      # 将宿主机的8080端口映射到容器的80端口,通过 http://localhost:8080 访问
      - "80:80"
    volumes:
      # 挂载FastAdmin源码,确保Nginx和PHP访问同一份文件
      - ./fastadmin:/var/www/html
      # 挂载自定义的Nginx站点配置(见下文配置片段)
      - ./config/nginx-site.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php-fpm
    networks:
      - fastadmin-network

  # MySQL 5.7 数据库服务
  mysql:
    image: mysql:5.7
    container_name: fastadmin-mysql
    restart: unless-stopped
    environment:
      # 设置数据库root密码(生产环境应使用更安全的方式管理)
      MYSQL_ROOT_PASSWORD: fastadmin123
      # 创建一个专用于FastAdmin的数据库
      MYSQL_DATABASE: fastadmin
    volumes:
      # 持久化数据库数据,防止容器重启后丢失
      - mysql_data:/var/lib/mysql
    networks:
      - fastadmin-network
    ports:
      - "3306:3306"

# 定义网络,允许三个服务间通过服务名称通信
networks:
  fastadmin-network:
    driver: bridge

# 定义卷,用于持久化MySQL数据
volumes:
  mysql_data:
  # 使用默认的local驱动,数据将保存在宿主机上

2.nginx-site.conf

server {
    listen 80;
    server_name localhost;
    root /var/www/html/public;
    index index.html index.htm index.php;

    # 核心伪静态规则:使用ThinkPHP规则[citation:1]
    location / {
        # 如果是访问真实存在的文件或目录,则直接访问
        # 否则,将所有请求重写到 index.php 的 s 参数[citation:9]
        if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php?s=$1 last;
            break;
        }
    }

    # 处理PHP请求 - 此部分是修复“模块不存在”的关键
    location ~ \.php(.*)$ {
        # 1. 关键:注释掉 try_files,避免与pathinfo冲突[citation:7]
        # try_files $uri =404;

        # 2. 将请求转发到php-fpm容器的9000端口
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;

        # 3. 核心修复:设置路径信息拆分,使ThinkPHP能正确解析 /nvuatifvyz.php/admin/index 这类URL
        fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info; # 传递PATH_INFO给PHP[citation:7]

        include fastcgi_params;
    }

    # 安全设置:禁止直接访问敏感目录[citation:3]
    location ~ ^/(runtime|application)/ {
        deny all;
    }
    # 禁止上传目录执行脚本[citation:3]
    location ~ ^/public/(uploads|assets)/.*\.(php|php5|jsp)$ {
        deny all;
    }

    # 静态文件缓存,提升性能
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

3. php.ini

; 允许脚本运行时修改环境变量,某些插件可能依赖于此
disable_functions =
; 调整内存限制,满足生成和上传需求
memory_limit = 256M
; 调整POST数据和文件上传大小限制
post_max_size = 100M
upload_max_filesize = 100M
; 设置时区
date.timezone = Asia/Shanghai

4. php-fpm.Dockerfile

# 使用官方PHP 7.4 FPM镜像作为基础
FROM php:7.4-fpm

# 1. 安装系统依赖包(以root权限运行)
# libpng-dev, libjpeg-dev, libfreetype6-dev: GD扩展的依赖库
# zip, unzip: 用于Composer包管理和文件操作
RUN apt-get update && apt-get install -y \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    zip \
    unzip

# 2. 配置并安装PHP扩展(以root权限运行)
# docker-php-ext-configure: 配置GD扩展支持freetype和jpeg
# docker-php-ext-install: 安装FastAdmin必需的扩展
#   - pdo_mysql: MySQL数据库连接
#   - gd: 图像处理(验证码、图片上传等)
#   - bcmath: 高精度数学计算
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd pdo_mysql bcmath

# 3. 创建和配置非root用户(安全最佳实践)
# 将www-data用户的UID和GID改为1000,与宿主机普通用户匹配
# 这样容器内的进程可以正确读写宿主机挂载的文件
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data

# 4. 设置工作目录(FastAdmin应用代码的位置)
WORKDIR /var/www/html

# 5. 确保工作目录有正确的权限
# 将/var/www/html目录的所有权授予www-data用户
RUN chown -R www-data:www-data /var/www/html

# 6. 切换到非root用户运行(安全加固)
# 注意:这里设置的是默认用户,容器启动时将以www-data运行
USER www-data

# 7. 设置容器启动时的默认命令
# php-fpm将以www-data用户在前台运行
CMD ["php-fpm"]

5. deploy.sh

#!/bin/bash

# FastAdmin Docker 一键部署脚本
# 作者:系统生成
# 功能:设置权限、启动服务、检查状态并显示配置信息

set -e  # 遇到任何错误立即停止执行

echo "🚀 FastAdmin Docker 部署脚本开始执行..."
echo "=========================================="

# 1. 设置文件权限
echo "📁 步骤1/3:设置FastAdmin目录权限..."

# 检查fastadmin目录是否存在
if [ ! -d "./fastadmin" ]; then
    echo "❌ 错误:未找到 ./fastadmin 目录!"
    echo "请确保已将FastAdmin完整包解压到 ./fastadmin 目录"
    exit 1
fi

echo "正在将 ./fastadmin 目录所有者改为UID 1000 (www-data)..."
sudo chown -R 1000:1000 ./fastadmin

echo "正在设置运行时目录权限..."
chmod -R 755 ./fastadmin/runtime ./fastadmin/public/uploads

echo "✅ 权限设置完成!"
echo ""

# 2. 启动Docker服务
echo "🐳 步骤2/3:启动Docker服务..."
echo "正在启动容器(这可能需要几分钟,首次启动需下载镜像)..."

# 使用docker compose up -d启动服务
docker compose up -d

# 检查docker compose命令是否执行成功
if [ $? -ne 0 ]; then
    echo "❌ Docker服务启动失败!"
    echo "请检查 docker-compose.yaml 配置或查看日志:docker compose logs"
    exit 1
fi

echo "✅ Docker服务启动命令已执行!"
echo ""

# 3. 等待服务完全启动(10秒)
echo "⏳ 等待服务初始化(10秒)..."
sleep 10

# 4. 检查服务状态
echo "🔍 步骤3/3:检查服务状态..."
echo "------------------------------------------"
docker compose ps
echo "------------------------------------------"

# 检查所有服务是否正常运行
ALL_RUNNING=$(docker compose ps --format json | grep -c '"State":"running"')
EXPECTED_SERVICES=3  # php-fpm, nginx, mysql

if [ "$ALL_RUNNING" -eq "$EXPECTED_SERVICES" ]; then
    echo "✅ 所有服务运行正常!"
else
    echo "⚠️  有服务未正常运行,请检查:"
    docker compose ps | grep -v "Up"
    echo ""
    echo "查看详细日志:docker compose logs [服务名]"
fi

echo ""
echo "=========================================="
echo "🎉 FastAdmin Docker 环境部署完成!"
echo ""
echo "📋 关键配置信息:"
echo "------------------------------------------"
echo "🌐 访问地址:http://localhost:80"
echo "🔧 安装入口:http://localhost:80/install.php"
echo ""
echo "🗄️  数据库配置(安装时使用):"
echo "  主机地址:mysql"
echo "  数据库名:fastadmin"
echo "  用户名:root"
echo "  密码:fastadmin123"
echo ""
echo "📁 项目目录结构:"
echo "  /fastadmin           - FastAdmin源码"
echo "  /config              - 配置文件目录"
echo "  docker-compose.yaml  - Docker编排配置"
echo "  deploy.sh            - 本部署脚本"
echo ""
echo "🔧 常用管理命令:"
echo "  查看日志:docker compose logs"
echo "  停止服务:docker compose down"
echo "  重启服务:docker compose restart"
echo "  重建服务:docker compose up -d --build"
echo "=========================================="

6. 把 fastadmin 从官方下载完整版解压到fastadmin目录里面

4. 安装

# 1. 创建项目目录
mkdir fastadmin-docker && cd fastadmin-docker

# 2. 把刚才编写文件与 fastadmin文件 上传到此目录
# 在此目录执行
# 3. 给脚本添加执行权限
chmod +x deploy.sh

# 4.执行部署脚本
./deploy.sh

至此 在docker 部署fastadmin 完成 通过ip或者配置域名访问安装即可使用

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐