如何将PHP项目容器化运行?

wen PHP项目 2

本文目录导读:

如何将PHP项目容器化运行?

  1. 第一步:准备项目结构和基础文件
  2. 第二步:编写 .dockerignore 文件
  3. 第三步:编写 Dockerfile
  4. 第四步:编写 docker-compose.yml(推荐)
  5. 第五步:创建 Nginx 配置文件
  6. 第六步:构建并运行
  7. 常见问题与优化

将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 在镜像构建时运行(而是运行时挂载),可以去掉 COPYRUN 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-composeenv_fileenvironment 传递敏感信息。
  • 将 Nginx 的 error.logaccess.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

  1. 准备 Dockerfile → 定义 PHP 环境。
  2. 准备 docker-compose.yml → 定义服务(PHP + Nginx + 数据库)。
  3. 准备 Nginx 配置 → 让 Nginx 能转译 PHP 请求到 php:9000
  4. 运行 docker-compose up -d → 一键启动。
  5. 访问 http://localhost:8080 → 查看项目。

如果需要更具体的示例(比如针对某个框架),请告诉我框架名称(如 Laravel 11、ThinkPHP 8 等),我可以提供对应的优化配置。

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