Docker 和 PHP:应用容器化完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Docker 和 PHP:从零到一的应用程序容器化



使用 Docker 对 PHP 应用程序进行容器化已成为现代 Web 开发的标准。无论您是在创建简单的落地页还是复杂的企业级应用程序,Docker 都能确保从本地开发到生产环境的所有阶段环境一致性。在本文中,我们将详细讲解为 PHP 应用程序创建 Docker 基础设施的所有步骤——从基本的 Dockerfile 到包含 Nginx 和 MySQL 的完整技术栈。



为什么 Docker 对 PHP 开发者很重要



传统的 PHP 开发经常遇到“在我机器上能运行”的问题。不同版本的 PHP、扩展、服务器配置——所有这些都会导致冲突。Docker 一劳永逸地解决了这个问题:



  • 环境隔离 — 每个应用程序都有自己的一套依赖项
  • 可复现性 — 在所有机器上环境一致
  • 可扩展性 — 轻松添加新服务(Redis、Elasticsearch)
  • CI/CD 集成 — 容器非常适合流水线


让我们从理论转向实践,为 PHP 应用程序创建一个完整的 Docker 环境。



为 PHP 创建基础 Dockerfile



我们从最重要的部分开始——Dockerfile。这是构建 PHP 应用程序镜像的指令。以下是适用于生产就绪应用程序的最佳配置:



# 使用官方 PHP FPM 镜像FROM php:8.2-fpm-alpine

# 安装系统依赖RUN apk add --no-cache \ git \ unzip \ libpq-dev \ libzip-dev \ && docker-php-ext-install \ pdo_mysql \ zip \ opcache

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

# 为生产环境配置 OPcacheRUN { \ echo 'opcache.memory_consumption=128'; \ echo 'opcache.interned_strings_buffer=8'; \ echo 'opcache.max_accelerated_files=4000'; \ echo 'opcache.revalidate_freq=2'; \ echo 'opcache.fast_shutdown=1'; \ echo 'opcache.enable_cli=1'; \} > /usr/local/etc/php/conf.d/opcache.ini

# 复制应用程序文件WORKDIR /var/www/htmlCOPY . .

# 设置权限RUN chown -R www-data:www-data /var/www/html \ && chmod -R 755 storage bootstrap/cache

# 启动 PHP-FPMCMD ["php-fpm"]

EXPOSE 9000


这个 Dockerfile 使用了 Alpine Linux——一个最小化的镜像,能显著减小最终容器的大小。我们只安装了必要的扩展:用于数据库操作的 pdo_mysql 和用于 Composer 的 zip。



构建并运行容器



# 构建镜像docker build -t my-php-app .

# 运行容器docker run -d -p 9000:9000 --name php-app my-php-app


通过 docker-compose 使用 Nginx 和 MySQL 的完整技术栈



真实的应用程序很少只由一个 PHP 容器组成。我们需要一个 Web 服务器和一个数据库。这时 docker-compose 就派上了用场——它是一个用于编排多个容器的工具。



让我们创建 docker-compose.yml 文件:



version: '3.8'

services: # PHP-FPM 服务 app: build: context: . dockerfile: Dockerfile container_name: php-app volumes: - ./:/var/www/html networks: - app-network

# Nginx Web 服务器 nginx: image: nginx:alpine container_name: php-nginx ports: - "8080:80" volumes: - ./:/var/www/html - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - app networks: - app-network

# MySQL 数据库 db: image: mysql:8.0 container_name: php-mysql ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: app_database MYSQL_USER: app_user MYSQL_

博客

书籍推荐