Laravel与Docker集成:从开发到部署的无缝解决方案
痛点与解决方案
开发环境配置繁琐、部署流程复杂、不同环境差异导致运行错误,这些问题耗费开发者大量时间。本文将详细介绍如何通过Docker容器化技术,实现Laravel应用的快速部署与环境一致性保障,让开发者专注于业务逻辑开发。
Docker与Laravel集成优势
- 环境一致性:开发、测试、生产环境完全一致,避免"在我电脑上能运行"问题
- 快速部署:几分钟内完成全新环境搭建,无需手动配置依赖
- 资源隔离:应用与系统环境隔离,避免依赖冲突
- 版本控制:容器镜像版本化管理,支持快速回滚
准备工作
系统要求
- Docker Engine 20.10+
- Docker Compose 2.0+
- Git
获取项目代码
git clone https://gitcode.com/GitHub_Trending/la/laravel
cd laravel
实现步骤
1. 创建Docker配置文件
项目结构规划
在项目根目录创建以下Docker相关文件:
Dockerfile:定义Laravel应用容器docker-compose.yml:编排应用服务组合.dockerignore:排除不需要打包的文件
Dockerfile编写
FROM php:8.2-fpm
# 安装系统依赖
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip
# 安装PHP扩展
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# 安装Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# 设置工作目录
WORKDIR /var/www
# 复制项目文件
COPY . .
# 安装依赖
RUN composer install --no-interaction
# 设置权限
RUN chown -R www-data:www-data /var/www/storage
docker-compose.yml配置
version: '3.8'
services:
# Laravel应用服务
app:
build: .
restart: always
volumes:
- ./:/var/www
- ./storage:/var/www/storage
depends_on:
- mysql
- redis
environment:
- DB_CONNECTION=mysql
- DB_HOST=mysql
- DB_PORT=3306
- DB_DATABASE=laravel
- DB_USERNAME=root
- DB_PASSWORD=root
- REDIS_HOST=redis
- REDIS_PORT=6379
# Nginx服务
nginx:
image: nginx:alpine
restart: always
ports:
- "80:80"
volumes:
- ./:/var/www
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app
# MySQL数据库
mysql:
image: mysql:8.0
restart: always
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=laravel
volumes:
- mysql-data:/var/lib/mysql
# Redis缓存
redis:
image: redis:alpine
restart: always
ports:
- "6379:6379"
volumes:
- redis-data:/data
volumes:
mysql-data:
redis-data:
2. 配置Nginx
在项目根目录创建nginx文件夹,添加default.conf配置文件:
server {
listen 80;
server_name localhost;
root /var/www/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
3. 环境变量配置
复制环境变量示例文件并修改:
cp .env.example .env
编辑.env文件,修改数据库连接信息:
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=root
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
4. 启动服务
docker-compose up -d
5. 初始化应用
执行容器内命令完成应用初始化:
# 生成应用密钥
docker-compose exec app php artisan key:generate
# 运行数据库迁移
docker-compose exec app php artisan migrate
# 生成存储链接
docker-compose exec app php artisan storage:link
日常开发命令
| 命令 | 说明 |
|---|---|
docker-compose up -d | 启动所有服务 |
docker-compose down | 停止所有服务 |
docker-compose logs -f | 查看服务日志 |
docker-compose exec app bash | 进入应用容器 |
docker-compose exec app php artisan [command] | 执行Artisan命令 |
docker-compose exec mysql mysql -uroot -proot laravel | 进入数据库 |
部署优化
1. 生产环境配置
创建生产环境专用配置文件docker-compose.prod.yml:
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile.prod
restart: always
volumes:
- ./storage:/var/www/storage
environment:
- APP_ENV=production
- APP_DEBUG=false
# 其他生产环境变量
nginx:
image: nginx:alpine
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/default.prod.conf:/etc/nginx/conf.d/default.conf
- ./nginx/ssl:/etc/nginx/ssl
depends_on:
- app
# 其他服务配置...
2. 性能优化
- 使用多阶段构建减小镜像体积
- 配置PHP OPcache加速
- 设置Nginx缓存静态资源
- 使用Redis缓存应用数据
常见问题解决
权限问题
如果遇到存储目录权限错误,执行:
docker-compose exec app chmod -R 775 storage bootstrap/cache
服务无法启动
查看日志定位问题:
docker-compose logs app
docker-compose logs nginx
数据库连接失败
检查MySQL服务状态:
docker-compose ps mysql
总结
通过Docker容器化方案,我们实现了Laravel应用的环境一致性、快速部署和资源隔离。开发团队可以通过简单的命令快速搭建完整开发环境,运维人员可以一键部署应用到生产服务器,极大提升了开发效率和部署可靠性。
相关文件路径
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



