本文目录导读:

- 第一步:准备项目结构和基础文件
- 第二步:编写
.dockerignore文件 - 第三步:编写
Dockerfile - 第四步:编写
docker-compose.yml(推荐) - 第五步:创建 Nginx 配置文件
- 第六步:构建并运行
- 常见问题与优化
将PHP项目容器化运行,核心是使用 Docker 来构建镜像并运行容器,以下是详细的步骤,适用于大多数常见的 PHP 项目(如 Laravel、Symfony、ThinkPHP 或原生 PHP)。
第一步:准备项目结构和基础文件
在项目根目录下,你需要创建几个关键文件:
your-php-project/ ├── docker-compose.yml # (推荐) 用于编排多个容器 ├── Dockerfile # (核心) 定义 PHP 环境的镜像 ├── .dockerignore # (可选) 忽略不需要的文件 └── ... (你的PHP项目文件)
第二步:编写 .dockerignore 文件
排除不需要进入镜像的文件,减少镜像体积和构建时间。
.git .gitignore node_modules vendor .env *.log *.md docker-compose.yml
第三步:编写 Dockerfile
这是最关键的一步,它定义了你的应用运行环境。
基础镜像选择
- 生产环境:建议使用生产级优化的镜像,如
php:8.2-fpm-alpine(超小体积)。 - 开发环境:可以使用更完整的镜像如
php:8.2-fpm。
示例 Dockerfile(适用于 Laravel / ThinkPHP 等)
# 使用 PHP-FPM 基础镜像
FROM php:8.2-fpm-alpine
# 设置工作目录
WORKDIR /var/www/html
# 安装系统依赖
RUN apk add --no-cache \
libzip-dev \
libpng-dev \
libjpeg-turbo-dev \
freetype-dev \
bash \
unzip \
# 如果你需要 Redis、MySQL 等扩展,可以继续添加
&& docker-php-ext-install pdo_mysql zip gd bcmath
# 安装 Composer(从官方镜像复制)
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# 复制项目文件到容器(注意:生产环境通常用 volume 挂载)
COPY . /var/www/html
# 设置目录权限(非根用户运行更安全)
RUN chown -R www-data:www-data /var/www/html \
&& chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache
# 安装 PHP 依赖(如果项目在构建时就需要 vendor)
RUN composer install --no-dev --optimize-autoloader --no-interaction
# 暴露端口(php-fpm 默认 9000,但通常通过 Nginx 反向代理)
EXPOSE 9000
# 启动 PHP-FPM
CMD ["php-fpm"]
注意:如果你的项目不需要
composer install在镜像构建时运行(而是运行时挂载),可以去掉COPY和RUN composer install这两行,改用docker-compose volumes挂载项目目录。
第四步:编写 docker-compose.yml(推荐)
大部分 PHP 项目需要 PHP + Nginx + 数据库 三个服务,使用 docker-compose 可以一键启动所有服务。
version: '3.8'
services:
# 1. PHP 服务(使用我们构建的镜像)
php:
build:
context: .
dockerfile: Dockerfile
container_name: my-php-app
volumes:
- ./:/var/www/html # 挂载项目代码(开发环境热更新)
# - ./public:/var/www/html/public # 如果需要分离公开目录
restart: unless-stopped
networks:
- app-network
# 2. Nginx 服务(作为 Web 服务器)
nginx:
image: nginx:alpine
container_name: my-nginx
ports:
- "8080:80" # 将宿主机 8080 映射到容器 80
volumes:
- ./:/var/www/html
- ./docker/nginx.conf:/etc/nginx/conf.d/default.conf # 自定义 Nginx 配置
depends_on:
- php
restart: unless-stopped
networks:
- app-network
# 3. 数据库(可选,根据项目需要)
mysql:
image: mysql:8.0
container_name: my-mysql
environment:
MYSQL_DATABASE: your_database
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: root_password
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
restart: unless-stopped
networks:
- app-network
# 网络和卷定义
networks:
app-network:
driver: bridge
volumes:
mysql_data:
第五步:创建 Nginx 配置文件
在项目根目录下创建 docker/nginx.conf 文件:
server {
listen 80;
server_name localhost;
root /var/www/html/public; # 根据你的项目入口调整(Laravel 是 public)
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000; # 这里的 "php" 对应 docker-compose 中的服务名
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
第六步:构建并运行
在项目根目录下执行:
# 构建镜像并启动所有服务(后台运行) docker-compose up -d # 查看运行状态 docker-compose ps # 查看日志 docker-compose logs -f php docker-compose logs -f nginx
访问 http://localhost:8080 即可看到你的 PHP 项目。
常见问题与优化
生产环境注意事项
- 不要将
.env文件放入镜像,使用 Docker 环境变量或.env挂载。 - 使用
docker-compose的env_file或environment传递敏感信息。 - 将 Nginx 的
error.log和access.log挂载到宿主机持久化。
性能优化
- PHP 镜像选择
-alpine版本(体积小)。 - 使用
--no-dev安装 Composer 依赖。 - 添加 OpCache 扩展并开启 JIT:
RUN docker-php-ext-install opcache \
&& echo "opcache.enable=1" >> /usr/local/etc/php/conf.d/opcache.ini \
&& echo "opcache.jit=1235" >> /usr/local/etc/php/conf.d/opcache.ini
调试技巧
- 如果想看 PHP 错误日志:
docker exec -it my-php-app tail -f /var/log/php_error.log - 进入容器执行命令:
docker exec -it my-php-app /bin/bash - 查看容器 IP:
docker inspect my-php-app | grep IPAddress
- 准备 Dockerfile → 定义 PHP 环境。
- 准备 docker-compose.yml → 定义服务(PHP + Nginx + 数据库)。
- 准备 Nginx 配置 → 让 Nginx 能转译 PHP 请求到
php:9000。 - 运行
docker-compose up -d→ 一键启动。 - 访问
http://localhost:8080→ 查看项目。
如果需要更具体的示例(比如针对某个框架),请告诉我框架名称(如 Laravel 11、ThinkPHP 8 等),我可以提供对应的优化配置。