本文目录导读:

我来为您提供 PHP 项目的 Dockerfile 编写方案,包含不同场景的配置。
基础 PHP 环境 Dockerfile
基础版(适合简单项目)
# 基础镜像
FROM php:8.2-fpm
# 设置工作目录
WORKDIR /var/www/html
# 安装系统依赖
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# 安装 PHP 扩展
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# 安装 Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# 复制项目文件
COPY . .
# 设置权限(如果使用 Laravel 等框架)
RUN chown -R www-data:www-data /var/www/html \
&& chmod -R 755 /var/www/html/storage \
&& chmod -R 755 /var/www/html/bootstrap/cache
# 暴露端口
EXPOSE 9000
# 启动命令
CMD ["php-fpm"]
生产优化版
FROM php:8.2-fpm-alpine
# 设置工作目录
WORKDIR /var/www/html
# 安装系统依赖(Alpine 版本)
RUN apk add --no-cache \
git \
curl \
libpng-dev \
libxml2-dev \
zip \
unzip \
&& docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# 安装 Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# 复制项目文件
COPY . .
# 生产环境优化
RUN composer install --optimize-autoloader --no-dev \
&& php artisan optimize \
&& php artisan view:cache \
&& php artisan route:cache
# 设置权限
RUN chown -R www-data:www-data /var/www/html \
&& chmod -R 755 /var/www/html/storage \
&& chmod -R 755 /var/www/html/bootstrap/cache
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD php-fpm -t || exit 1
EXPOSE 9000
USER www-data
CMD ["php-fpm"]
多阶段构建版
# 第一阶段:构建阶段
FROM composer:2 AS composer
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-scripts --no-autoloader
COPY . .
RUN composer install --optimize-autoloader
# 第二阶段:运行阶段
FROM php:8.2-fpm-alpine
WORKDIR /var/www/html
RUN apk add --no-cache \
libpng-dev \
libxml2-dev \
&& docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# 从构建阶段复制
COPY --from=composer /app /var/www/html
RUN chown -R www-data:www-data /var/www/html \
&& chmod -R 755 /var/www/html/storage \
&& chmod -R 755 /var/www/html/bootstrap/cache
EXPOSE 9000
CMD ["php-fpm"]
开发环境版(含 Xdebug)
FROM php:8.2-fpm
WORKDIR /var/www/html
# 安装系统依赖
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip \
nodejs \
npm \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# 安装 PHP 扩展
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# 安装 Xdebug
RUN pecl install xdebug \
&& docker-php-ext-enable xdebug
# Xdebug 配置
RUN echo "xdebug.mode=debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo "xdebug.client_host=host.docker.internal" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo "xdebug.client_port=9003" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo "xdebug.idekey=PHPSTORM" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
# 安装 Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# 复制项目文件
COPY . .
# 设置权限
RUN chown -R www-data:www-data /var/www/html
EXPOSE 9000
CMD ["php-fpm"]
配套的 docker-compose.yml
version: '3.8'
services:
php:
build:
context: .
dockerfile: Dockerfile
container_name: php-app
volumes:
- ./:/var/www/html
ports:
- "9000:9000"
depends_on:
- mysql
networks:
- app-network
nginx:
image: nginx:alpine
container_name: nginx-server
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www/html
- ./nginx/conf.d:/etc/nginx/conf.d
depends_on:
- php
networks:
- app-network
mysql:
image: mysql:8.0
container_name: mysql-db
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-network
redis:
image: redis:alpine
container_name: redis-cache
ports:
- "6379:6379"
networks:
- app-network
volumes:
mysql-data:
networks:
app-network:
driver: bridge
Nginx 配置示例
# nginx/conf.d/app.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 up -d # 构建特定环境的镜像 docker build -t my-php-app:latest . # 运行容器 docker run -d -p 9000:9000 my-php-app
常见 PHP 扩展安装
# 常用扩展安装命令
RUN docker-php-ext-install \
pdo_mysql \ # MySQL 扩展
mbstring \ # 多字节字符串
bcmath \ # 数学计算
gd \ # 图像处理
exif \ # EXIF 信息
pcntl \ # 进程控制
opcache # OPcache
性能优化建议
-
选择合适的基础镜像:
- 开发环境:
php:8.2-fpm(包含完整工具) - 生产环境:
php:8.2-fpm-alpine(最小体积)
- 开发环境:
-
多阶段构建:分离构建和运行环境
-
镜像层优化:合并 RUN 命令,减少层数
-
缓存优化:利用 Docker 层缓存机制
-
安全设置:使用非 root 用户运行
这样配置的 Dockerfile 能适应大多数 PHP 项目的需求,您可以根据具体项目特点进行调整。