本文目录导读:

我来提供一个完整的PHP项目Dockerfile示例,包含常用的配置和最佳实践:
基础版本(适用于常见PHP项目)
# 使用官方PHP 8.2版本作为基础镜像
FROM php:8.2-fpm
# 安装系统依赖和PHP扩展
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip \
&& 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 . .
# 复制自定义配置(可选)
# COPY php.ini /usr/local/etc/php/
# 设置权限(根据需要调整)
RUN chown -R www-data:www-data /var/www/html \
&& chmod -R 755 /var/www/html/storage
# 暴露端口
EXPOSE 9000
# 启动命令
CMD ["php-fpm"]
完整生产版本(包含更多优化)
# 构建阶段
FROM php:8.2-fpm AS builder
# 系统依赖
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip \
libzip-dev \
libicu-dev \
libpq-dev \
--no-install-recommends
# PHP扩展
RUN docker-php-ext-install \
pdo_mysql \
mbstring \
exif \
pcntl \
bcmath \
gd \
intl \
zip \
opcache
# 安装Redis扩展(可选)
RUN pecl install redis && docker-php-ext-enable redis
# 安装Composer
COPY --from=composer:2.6 /usr/bin/composer /usr/bin/composer
# Node.js(如果前端需要构建)
# FROM node:18-alpine AS node-build
# COPY package*.json ./
# RUN npm ci && npm run build
# 正式运行阶段
FROM php:8.2-fpm
# 基础依赖
RUN apt-get update && apt-get install -y \
curl \
git \
unzip \
libzip-dev \
libicu-dev \
libpq-dev \
--no-install-recommends \
&& docker-php-ext-install \
pdo_mysql \
mbstring \
exif \
pcntl \
bcmath \
gd \
intl \
zip \
opcache
# 配置优化
COPY ./docker/php.ini /usr/local/etc/php/conf.d/php.ini
COPY ./docker/php-fpm.conf /usr/local/etc/php-fpm.d/www.conf
# 设置工作目录
WORKDIR /var/www/html
# 复制项目文件(排除不需要的文件)
COPY --chown=www-data:www-data . .
# 设置目录权限
RUN mkdir -p storage bootstrap/cache \
&& chown -R www-data:www-data storage bootstrap/cache \
&& chown -R www-data:www-data /var/www/html
# 切换到非root用户
USER www-data
# 暴露端口
EXPOSE 9000
# 健康检查(可选)
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:9000/ || exit 1
CMD ["php-fpm"]
.dockerignore文件(重要!)
.vscode .idea .git .gitignore .gitlab-ci.yml docker-compose.yml docker-compose.prod.yml Dockerfile .dockerignore application/logs/*.log runtime/*.log storage/*.log vendor node_modules public/storage public/assets/uploads build .env *.md
多阶段构建版本(更高效)
# 阶段1:安装依赖
FROM composer:2.6 AS composer
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader --no-scripts
# 阶段2:最终镜像
FROM php:8.2-fpm
# 安装依赖和扩展
RUN apt-get update && apt-get install -y \
libpq-dev \
libzip-dev \
libicu-dev \
&& docker-php-ext-install pdo pdo_mysql zip
COPY --from=composer /app/vendor /var/www/html/vendor
COPY . /var/www/html
WORKDIR /var/www/html
EXPOSE 9000
CMD ["php-fpm"]
使用示例
构建镜像
docker build -t php-app:latest .
运行容器
docker run -d -p 8080:80 -v $(pwd):/var/www/html php-app:latest
docker-compose配置示例
version: '3.8'
services:
php:
build:
context: .
dockerfile: Dockerfile
volumes:
- ./:/var/www/html
ports:
- "9000:9000"
environment:
- DB_HOST=database
- DB_PORT=3306
networks:
- app-network
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./:/var/www/html
- ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
networks:
- app-network
networks:
app-network:
driver: bridge
常用优化技巧
- 使用缓存层:先复制composer.json,然后执行composer install,再复制其他文件
- 多阶段构建:减少最终镜像大小
- 设置非root用户:提高安全性
- 使用.dockerignore:避免不必要的文件复制
- 合理配置缓存:利用Docker层缓存
注意事项
- 根据实际PHP版本需求调整基础镜像
- 根据项目需要安装必要的扩展
- 确保storage和bootstrap/cache目录可写
- 生产环境建议使用多阶段构建
- 定期更新基础镜像获取安全补丁
需要根据你的具体项目需求(如框架、依赖等)调整此Dockerfile。