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

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

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

开始课程
```html

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 执行以下操作:

  1. 使用轻量级镜像 php:8.2-fpm-alpine。
  2. 安装必要的扩展:pdo_mysql、gd、mbstring 等。
  3. 从官方镜像复制 Composer。
  4. 传输应用代码。
  5. 为缓存和日志配置访问权限。


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: - ```

博客

书籍推荐