本文目录导读:

在PHP项目中使用Docker可以大大简化开发、测试和部署流程,下面是一个从零开始的完整指南。
核心文件结构
典型的PHP+Docker项目结构:
my-php-project/
├── app/ # PHP代码目录
│ └── index.php
├── docker/
│ ├── php/
│ │ └── Dockerfile
│ └── nginx/
│ ├── Dockerfile
│ └── default.conf
├── docker-compose.yml
├── .dockerignore
└── README.md
创建Dockerfile
PHP-FPM Dockerfile
# docker/php/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/html
# 复制应用代码
COPY . /var/www/html
# 设置权限
RUN chown -R www-data:www-data /var/www/html \
&& chmod -R 755 /var/www/html/storage
EXPOSE 9000
CMD ["php-fpm"]
Nginx Dockerfile(可选)
# docker/nginx/Dockerfile FROM nginx:alpine # 复制配置文件 COPY docker/nginx/default.conf /etc/nginx/conf.d/default.conf WORKDIR /var/www/html COPY . /var/www/html
Nginx配置
# docker/nginx/default.conf
server {
listen 80;
server_name localhost;
root /var/www/html/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
Docker Compose配置
# docker-compose.yml
version: '3.8'
services:
# PHP服务
php:
build:
context: .
dockerfile: docker/php/Dockerfile
container_name: php_app
volumes:
- .:/var/www/html
ports:
- "9000:9000"
networks:
- app-network
depends_on:
- mysql
- redis
# Nginx服务
nginx:
build:
context: .
dockerfile: docker/nginx/Dockerfile
container_name: nginx_app
ports:
- "80:80"
- "443:443"
volumes:
- .:/var/www/html
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
networks:
- app-network
depends_on:
- php
# MySQL数据库
mysql:
image: mysql:8.0
container_name: mysql_db
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: myapp
MYSQL_USER: user
MYSQL_PASSWORD: user_password
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
networks:
- app-network
# Redis缓存
redis:
image: redis:alpine
container_name: redis_cache
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- app-network
# phpMyAdmin(可选)
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
environment:
PMA_HOST: mysql
PMA_PORT: 3306
ports:
- "8080:80"
networks:
- app-network
depends_on:
- mysql
volumes:
mysql_data:
redis_data:
networks:
app-network:
driver: bridge
.dockerignore文件
.git .gitignore .env .docker docker-compose.yml README.md .vscode node_modules vendor storage/framework/cache/data/* storage/logs/* !storage/logs/.gitkeep
使用步骤
启动项目
# 构建并启动所有服务 docker-compose up -d # 查看运行状态 docker-compose ps # 查看日志 docker-compose logs -f # 进入PHP容器 docker-compose exec php bash # 安装Composer依赖 docker-compose exec php composer install # 运行Artisan命令(Laravel) docker-compose exec php php artisan migrate docker-compose exec php php artisan key:generate
常用命令
# 停止所有服务 docker-compose down # 停止并删除数据卷 docker-compose down -v # 重新构建 docker-compose up -d --build # 查看资源使用情况 docker stats
针对不同框架的优化
Laravel优化配置
# docker-compose.yml 中的php服务添加
php:
environment:
- APP_ENV=local
- APP_DEBUG=true
- DB_CONNECTION=mysql
- DB_HOST=mysql
- DB_PORT=3306
- DB_DATABASE=myapp
- DB_USERNAME=user
- DB_PASSWORD=user_password
- REDIS_HOST=redis
- REDIS_PASSWORD=null
- REDIS_PORT=6379
Symfony优化配置
php:
environment:
- APP_ENV=dev
- APP_DEBUG=1
- DATABASE_URL=mysql://user:user_password@mysql:3306/myapp
最佳实践
- 多阶段构建:减少最终镜像大小
- 使用非root用户:提高安全性
- 合理使用缓存:加速构建过程
- 环境变量管理:使用
.env文件 - 日志管理:将日志输出到stdout/stderr
生产环境注意事项
# 生产环境docker-compose.prod.yml
version: '3.8'
services:
php:
build:
context: .
dockerfile: docker/php/Dockerfile.prod
environment:
- APP_ENV=production
- APP_DEBUG=false
nginx:
ports:
- "80:80"
- "443:443"
# 使用更轻量的镜像
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
- MYSQL_DATABASE=${DB_DATABASE}
# 启动生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
这个配置可以让你快速搭建PHP开发环境,同时保持生产和开发环境的一致性,根据具体项目需求,可以灵活调整配置。