本文目录导读:

在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开发环境,同时保持生产和开发环境的一致性,根据具体项目需求,可以灵活调整配置。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播