PHP项目Dockerfile怎么写

wen PHP项目 1

本文目录导读:

PHP项目Dockerfile怎么写

  1. 基础版本(适用于常见PHP项目)
  2. 完整生产版本(包含更多优化)
  3. .dockerignore文件(重要!)
  4. 多阶段构建版本(更高效)
  5. 使用示例
  6. 常用优化技巧
  7. 注意事项

我来提供一个完整的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

常用优化技巧

  1. 使用缓存层:先复制composer.json,然后执行composer install,再复制其他文件
  2. 多阶段构建:减少最终镜像大小
  3. 设置非root用户:提高安全性
  4. 使用.dockerignore:避免不必要的文件复制
  5. 合理配置缓存:利用Docker层缓存

注意事项

  • 根据实际PHP版本需求调整基础镜像
  • 根据项目需要安装必要的扩展
  • 确保storage和bootstrap/cache目录可写
  • 生产环境建议使用多阶段构建
  • 定期更新基础镜像获取安全补丁

需要根据你的具体项目需求(如框架、依赖等)调整此Dockerfile。

抱歉,评论功能暂时关闭!