Docker 和 PHP:应用容器化完全指南
现代 Web 开发离不开容器化。Docker 已成为打包、交付和运行应用的事实标准。对于 PHP 开发者来说,使用 Docker 可以解决许多问题:从 PHP 版本不兼容到不同机器上环境配置的复杂性。在本文中,我们将从头开始讲解如何使用 Docker 和 docker-compose 容器化 PHP 应用。
1. PHP 开发者的 Docker 基础
Docker 是一个用于在隔离环境(容器)中开发、交付和运行应用的平台。每个容器包含运行所需的一切:代码、库、系统工具和配置。这对 PHP 尤其重要,因为应用通常依赖于特定版本的解释器、扩展(例如 pdo_mysql、redis、gd)和 Web 服务器(Apache 或 Nginx)。
Docker 的主要组件:
- Dockerfile — 包含构建镜像指令的文本文件。
- 镜像 (Image) — 用于创建容器的不可变模板。
- 容器 (Container) — 镜像的运行实例。
- docker-compose — 用于定义和运行多容器应用的工具。
2. 为 PHP 应用创建 Dockerfile
从一个简单的例子开始。假设我们有一个基于 Laravel 或 Symfony 框架的 PHP 应用。在项目根目录创建 Dockerfile 文件:
# 使用官方 PHP 8.2 镜像与 FPMFROM php:8.2-fpm-alpine
# 设置工作目录WORKDIR /var/www/html
# 安装系统依赖和 PHP 扩展RUN apk add --no-cache \ git \ unzip \ libpng-dev \ libjpeg-turbo-dev \ freetype-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) \ pdo_mysql \ mbstring \ exif \ pcntl \ bcmath \ gd
# 安装 ComposerCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# 复制项目文件COPY . .
# 设置权限(针对 Laravel/Symfony)RUN chown -R www-data:www-data /var/www/html \ && chmod -R 755 storage bootstrap/cache
# 开放端口 9000(PHP-FPM)EXPOSE 9000
# 启动命令CMD ["php-fpm"]这个 Dockerfile 执行以下操作:
- 使用轻量级镜像
php:8.2-fpm-alpine。 - 安装必要的扩展:
pdo_mysql、gd、mbstring等。 - 从官方镜像复制 Composer。
- 传输应用代码。
- 为缓存和日志配置访问权限。
3. 配置 docker-compose:PHP + Nginx + MySQL
对于实际项目,我们需要 Web 服务器和数据库。创建 docker-compose.yml 文件:
version: '3.8'
services: # PHP-FPM 服务 php: build: context: . dockerfile: Dockerfile container_name: app_php volumes: - .:/var/www/html networks: - app-network
# Nginx Web 服务器 nginx: image: nginx:alpine container_name: app_nginx ports: - "8080:80" volumes: - .:/var/www/html - ./nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - php networks: - app-network
# MySQL 数据库 mysql: image: mysql:8.0 container_name: app_mysql environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: app_db MYSQL_USER: app_user MYSQL_PASSWORD: app_password ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql networks: -
```