1. 环境准备与需求分析
1.1 选择合适的服务器和操作系统
在进行 Docker部署 的前期,首先需要确定服务器环境和操作系统。常见选择是 Linux 发行版(如 Ubuntu、Debian)或云服务器自带的 Linux 镜像。稳定性、网络带宽 与 安全性 是本次部署的关键指标。本文以 Ubuntu 20.04/22.04 为示例,配合官方镜像能获得更好的兼容性。
另外要确认 SSH 访问、防火墙规则、以及 root 访问权限 的配置是否合规,确保后续安装 Docker 与 Docker Compose 的过程顺利。
1.2 安装 Docker 与 Docker Compose
为了实现 Laravel 的容器化部署,最核心的依赖是 Docker 与 Docker Compose。在服务器上执行以下步骤即可完成初始安装:
# 安装必要工具
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg# 添加 Docker GPG 公钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg# 设置稳定版本仓库
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] \https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/null# 安装 Docker Engine、CLI 与容器运行时
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io# 安装 Docker Compose(根据系统版本选择兼容版本)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" \-o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose# 验证安装
docker --version
docker-compose --version
完成后,应确保 普通用户加入 docker 组,以避免频繁使用 sudo:
sudo usermod -aG docker $USER
# 登出再登录,或执行
newgrp docker
以上步骤确保你具备 Docker 环境 与 Docker Compose 工具,为后续的 Laravel 容器化部署打下基础。
2. 项目结构与实现方案
2.1 Docker 化的总体方案
采用典型的三大核心组件组合来实现 Laravel 的 Docker 部署:一个 PHP-FPM 应用容器、Nginx 反向代理容器,以及一个关系型数据库容器(如 MySQL 8.x)。数据库与 应用代码分离,便于数据持久化与版本解耦;Nginx 作为前端入口,提供静态资源的高效服务与 路由转发 给 PHP-FPM。另可在需要时添加 Redis、队列处理、缓存等服务,以提升性能。
在部署时,我们将把 Laravel 项目根目录挂载到应用容器,确保代码变更能即时生效;同时将 storage 与 bootstrap/cache 等目录映射到宿主机或通过卷持久化,以避免写入权限问题影响运行。
3. 搭建 Dockerfile 与 Nginx 配置
3.1 Dockerfile 实战
以下 Dockerfile 采用 PHP 8.2-FPM 作为应用运行时,并安装 Laravel 所需的扩展与工具。你可以将其放在项目根目录的 Dockerfile 文件中,以便通过 docker-compose 构建镜像。
FROM php:8.2-fpm# 安装系统依赖与 PHP 扩展
RUN apt-get update && apt-get install -y \libzip-dev unzip git \libpng-dev libonig-dev libxml2-dev && \docker-php-ext-configure zip && \docker-php-ext-install zip pdo_mysql# 目录工作空间
WORKDIR /var/www# 复制 composer.json 并安装依赖
COPY composer.json composer.lock ./
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \composer install --no-autoloader# 拷贝项目代码
COPY . .# 设置权限
RUN chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache
RUN chmod -R 755 /var/www/storage# 使用 www-data 用户运行
USER www-data
该 Dockerfile 的要点在于:PHP-FPM 环境、pdo_mysql 连接数据库、以及通过 composer 安装依赖,确保 Laravel 能正常运行。为了生产环境,通常还会加入多阶段构建以减小镜像体积,或在构建阶段静态资源打包后再进入生产阶段。
3.2 Nginx 配置与反向代理
Nginx 负责对外提供服务并将 PHP 请求转发给 PHP-FPM。下面的配置适用于 Nginx 1.21+ 的 Alpine 镜像,请将其保存为 nginx/default.conf,并在 docker-compose 的 web 服务中挂载到 /etc/nginx/conf.d/default.conf。
server {listen 80;server_name example.local;root /var/www/public;index index.php index.html;access_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log warn;location / {try_files $uri $uri/ /index.php?$query_string;}location ~ \\.php$ {fastcgi_pass app:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}location ~ /\\.ht {deny all;}
}
关键点总结:根目录指向 public、fastcgi_pass 指向应用容器名与端口(这里为 app:9000)以实现 PHP-FPM 交互、并开启对 PHP 文件的正确处理。通过这样的配置,访问 http://your-domain 将被 Nginx 直接处理,PHP 代码由 PHP-FPM 运行。
4. Docker Compose 编排
4.1 服务定义与网络
为了让 Laravel 应用、Nginx、以及数据库高效协同工作,我们使用 docker-compose 将三个核心服务编排在一个应用栈内。下面给出一个简化的 docker-compose.yml 示例,请放在项目根目录。
version: '3.8'services:app:build:context: .dockerfile: Dockerfileworking_dir: /var/wwwvolumes:- ./:/var/wwwexpose:- "9000"environment:- APP_ENV=production- APP_DEBUG=falsenetworks:- app-networkweb:image: nginx:stable-alpinecontainer_name: nginxports:- "8080:80"volumes:- ./nginx/default.conf:/etc/nginx/conf.d/default.conf- ./:/var/wwwdepends_on:- appnetworks:- app-networkdb:image: mysql:8.0container_name: mysqlrestart: alwaysenvironment:MYSQL_DATABASE: laravelMYSQL_ROOT_PASSWORD: rootpasswordMYSQL_USER: laravelMYSQL_PASSWORD: laravelpasswordports:- "3306:3306"volumes:- dbdata:/var/lib/mysqlnetworks:- app-networknetworks:app-network:driver: bridgevolumes:dbdata:
说明与要点:app 服务构建自本项目的 Dockerfile,并通过 expose 暴露 9000 端口供 Nginx 访问;web 服务使用 nginx:stable-alpine 镜像,外部通过 8080 端口访问;db 服务提供 MySQL 8.x 实例,数据库初始化参数在 MYSQL_* 环境变量中配置,数据库数据通过本地卷持久化。请确保将 Laravel 的 .env 中的数据库连接参数指向 db 服务。
5. 数据库与环境变量
5.1 Laravel 环境变量配置
在生产环境中,Laravel 的关键配置都来自 .env。为了兼容 Docker 部署,需要将数据库连接指向容器网络内的数据库服务名,并禁用调试输出。一个简化版本如下:APP_ENV=production、APP_DEBUG=false、DB_HOST=db、DB_DATABASE=laravel、DB_USERNAME=laravel、DB_PASSWORD=laravelpassword。另外为了缓存和会话的稳定性,建议使用 Redis 作为缓存与队列后端。
# 在容器内生成应用密钥
docker-compose exec app php artisan key:generate
并确保将生成的 APP_KEY 写入 .env,或通过容器环境变量注入以实现自动化初始化。
5.2 数据库初始化与导入脚本
上线前可能需要初始化数据库结构或导入初始数据。你可以在本地执行一次 php artisan migrate,再将已有数据脚本保存为 SQL 文件并在容器内执行。下面给出常用命令示例:migrate、seed、以及导入 SQL 的方式。
# 进入 mysql 容器执行结构迁移
docker-compose exec db mysql -u root -p
# 在 MySQL 客户端内执行迁移脚本# 或者使用 Laravel 自带命令在应用容器内执行
docker-compose exec app php artisan migrate --force
6. 本地测试与上线前准备
6.1 本地启动与快速验证
在完成上述配置后,通过 docker-compose up -d 启动应用栈,随后在浏览器中访问 http://localhost:8080 就能看到 Laravel 的欢迎页或你自定义的首页。日志是诊断问题的第一手资料,使用 docker-compose logs -f 查看应用、数据库及 Nginx 的输出。
在本地测试阶段,请特别关注 文件权限、Laravel 存储目录 的写入权限,以及 缓存/会话 相关配置是否正确,否则容易在上线后挂起或报错。
6.2 生产上线前的准备
上线前应完成以下关键步骤:构建优化、镜像命名与版本控制、生产级别配置(如 APP_ENV、APP_DEBUG、LOG_CHANNEL 等),以及确保 数据库备份 与 域名解析 指向正确的服务器。若引入 TLS,需要计划证书获取与自动续期流程。
# 便捷地在服务器上启动生产环境
docker-compose -f docker-compose.yml up -d --build
7. 上线部署流程
7.1 生产环境上线步骤
生产环境部署的核心理念是最小化镜像体积、稳定的服务分离、以及可预测的更新流程。常见的上线步骤如下:上传代码、构建镜像、更新服务、以及 健康检查。下面给出一个简单的上线流程示例,便于你直接执行或按需改造。请确保在生产环境中使用受信任的镜像源与私有仓库,以提升安全性。

# 1) 将代码推送到服务器(或通过 CI/CD 拉取产物)
# 2) 在生产服务器上执行构建与更新
docker-compose -f docker-compose.yml build
docker-compose -f docker-compose.yml up -d --remove-orphans# 3) 检查服务状态
docker-compose ps
docker-compose logs -f
上线后,建议建立 健康检查 与 回滚机制,以便遇到异常时快速恢复到上一版本。生产环境中常用的做法还包括使用 TLS 加密、域名路由分发,以及通过证书管理工具(如 Certbot)实现自动化证书续期。
7.2 TLS、域名与反向代理的生产配置
在正式上线时,通常会引入单独的域名、并通过 Nginx 反向代理 + Let's Encrypt 实现 HTTPS。你可以在生产环境中采用以下核心策略:域名解析到服务器、Nginx 配置重定向至 HTTPS、以及通过 certbot 自动续期。下面给出一个简要的部署思路:
# 安装 certbot(以 Debian/Ubuntu 为例)
sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx# 通过 certbot 申请证书并自动配置 Nginx
sudo certbot --nginx -d your-domain.com -d www.your-domain.com# 自动续期测试
sudo certbot renew --dry-run
完成上述步骤后,生产环境将具备 HTTPS 加密传输、域名访问、以及稳定的反向代理能力,使 Laravel 应用在上线后具有更好的可用性与安全性。
以上内容围绕“Docker 部署 Laravel 项目的完整实战教程:从环境搭建到上线”这一主题展开,覆盖从环境准备、镜像与容器化实现、到上线部署的完整流程与关键配置。你可以直接将本文中给出的示例代码与配置粘贴到你的项目中,按需调整域名、数据库参数与镜像版本,以实现高效、可靠的 Laravel 容器化上线。

