使用 Docker、PHP 8.4、Composer、Nginx 和 MariaDB 创建简单环境
Source: Dev.to
First article on this platform – keeping things simple, practical, and easy to follow.
如果你曾经为安装 PHP 扩展、配置 Nginx 或搭建本地数据库而苦恼,Docker 可以让你的工作轻松许多。
在本指南中,我们将构建一个现代、简约的开发环境,只需一条命令即可运行。
技术栈
- PHP 8.4 (FPM)
- Composer
- Nginx
- MariaDB
- Docker & Docker Compose
所有服务可通过一个命令一起启动。
文件夹结构
root-folder/
├── docker/
│ ├── nginx/
│ │ └── default.conf
│ └── php/
│ └── Dockerfile
├── src/
│ └── index.php
├── docker-compose.yml
└── composer.json
| 文件夹 | 责任 |
|---|---|
docker/php | 自定义 PHP 镜像及扩展 |
docker/nginx | Nginx 配置 |
src | 应用源代码 |
1. PHP Dockerfile
创建 docker/php/Dockerfile:
# Base image with PHP 8.4 and FPM
FROM php:8.4-fpm
# Install system dependencies and PHP extensions
RUN apt-get update && apt-get install -y \
git \
unzip \
libzip-dev \
&& docker-php-ext-install pdo pdo_mysql zip
# Install Composer from the official image
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# Set the working directory
WORKDIR /var/www/html
What it does
- 使用 PHP 8.4‑FPM(适用于 Nginx)。
- 安装常用工具(
git、unzip)。 - 启用必要的扩展(
pdo、pdo_mysql、zip)。 - 添加 Composer,无需手动下载。
2. Nginx 配置
Create docker/nginx/default.conf:
server {
listen 80;
index index.php index.html;
root /var/www/html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
关键点
- 监听 80 端口。
- 从
/var/www/html提供文件。 - 通过 FastCGI 将
.php请求转发到 PHP 容器。
3. Docker‑Compose 文件
Create docker-compose.yml in the project root:
version: '3.9'
services:
php:
build: ./docker/php
container_name: php84
volumes:
- ./src:/var/www/html
depends_on:
- mariadb
nginx:
image: nginx:latest
container_name: nginx
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
mariadb:
image: mariadb:11
container_name: mariadb
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: app
MYSQL_USER: app
MYSQL_PASSWORD: app
ports:
- "3306:3306"
volumes:
- mariadb_data:/var/lib/mysql
volumes:
mariadb_data:
说明
| 服务 | 目的 |
|---|---|
php | 构建自定义 PHP 8.4 镜像,挂载 src/ 以便更改即时生效,并等待 MariaDB 启动。 |
nginx | 使用官方 Nginx 镜像,将主机端口 8080 映射到容器端口 80,共享相同的代码卷,并加载自定义配置。 |
mariadb | 运行 MariaDB 11,启动时创建数据库和用户,暴露端口 3306(可选),并将数据存储在命名卷 (mariadb_data) 中。 |
volumes | mariadb_data 在容器重启之间持久化数据库。 |
4. 示例 PHP 应用
Create src/index.php:
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]
);
echo "PHP is running and connected to MariaDB successfully!";
} catch (PDOException $e) {
echo "Database connection failed: {$e->getMessage()}";
}
- 使用 PDO(在 PHP 中推荐的数据库访问方式)。
- 通过服务名
mariadb连接 MariaDB。 - 在连接成功时打印成功信息,否则显示错误。
5. Composer 配置
创建 composer.json:
{
"name": "example/docker-php",
"require": {}
}
在容器内运行 Composer
docker compose run --rm php composer install
这使用了 Docker 中定义的相同 PHP 环境,避免了本地 PHP 版本的问题。
6. 完整启动
在项目根目录下:
docker compose up -d --build
打开浏览器并访问:
http://localhost:8080
你应该看到:
PHP is running and connected to MariaDB successfully!
如果出现此信息,说明 PHP、Nginx 和 MariaDB 正常通信。 🎉
您将获得
- PHP 8.4 可直接用于开发
- Composer 完全集成
- Nginx 作为轻量级网页服务器
- MariaDB 带持久化数据
- 干净且隔离的开发环境
这是一个适用于纯 PHP 项目和 API 的坚实起点。
今天的内容就到这里,朋友们!