插件窝 干货文章 docker 怎么部署 php 应用

docker 怎么部署 php 应用

dockerfile PHP Docker Composer 652    来源:    2025-05-02

Docker 部署 PHP 应用指南

基本部署方式

1. 使用官方 PHP 镜像

# 使用官方PHP镜像作为基础
FROM php:8.2-apache

# 将本地文件复制到容器中的/var/www/html目录
COPY . /var/www/html/

# 暴露80端口
EXPOSE 80

构建并运行:

docker build -t my-php-app .
docker run -d -p 8080:80 --name my-running-app my-php-app

2. 使用 Nginx + PHP-FPM

# PHP-FPM 容器
FROM php:8.2-fpm
COPY . /var/www/html
# Nginx 容器
FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf

使用 docker-compose.yml 组合:

version: '3'
services:
  php:
    build:
      context: .
      dockerfile: Dockerfile.php
    volumes:
      - ./:/var/www/html
  nginx:
    build:
      context: .
      dockerfile: Dockerfile.nginx
    ports:
      - "8080:80"
    depends_on:
      - php

高级配置

1. 安装扩展

FROM php:8.2-apache

# 安装常用扩展
RUN docker-php-ext-install pdo pdo_mysql mysqli

# 安装GD库
RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd

2. 配置 Composer

# 安装Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# 安装依赖
RUN composer install --no-dev --optimize-autoloader

3. 环境变量配置

ENV APP_ENV=production
ENV APP_DEBUG=false

最佳实践

  1. 使用多阶段构建减少镜像大小
  2. 分离静态文件和代码,便于更新
  3. 使用.dockerignore排除不必要的文件
  4. 配置适当的权限,避免安全问题
  5. 使用健康检查确保应用正常运行

示例完整配置

# 第一阶段:构建阶段
FROM composer:latest as builder
WORKDIR /app
COPY . .
RUN composer install --no-dev --optimize-autoloader

# 第二阶段:生产阶段
FROM php:8.2-fpm-alpine
WORKDIR /var/www/html

# 从构建阶段复制文件
COPY --from=builder /app .

# 安装必要的PHP扩展
RUN docker-php-ext-install pdo pdo_mysql

# 配置权限
RUN chown -R www-data:www-data /var/www/html

EXPOSE 9000
CMD ["php-fpm"]

常见问题解决

  1. 文件权限问题

    docker exec -it container_name chown -R www-data:www-data /var/www/html
    
  2. 调试模式

    • 在开发环境中设置 APP_DEBUG=true
    • 确保安装了 Xdebug 扩展
  3. 性能优化

    • 使用 OPCache
    • 配置适当的 PHP-FPM 进程管理
  4. 日志查看

    docker logs container_name
    

希望这个指南能帮助你顺利部署PHP应用!如果有任何具体问题,可以进一步讨论。