首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Docker 搭建 PHP 开发环境全攻略:单容器 Symfony 实战

     編輯:PHP 綜合知識

传统 Vagrant 虚拟机资源占用高、启动慢。Docker 容器技术以轻量、秒级启动、易迭代优势成为新标准。本文详细记录基于 Docker 单容器运行 Nginx + PHP-FPM + MySQL 的 Symfony 开发环境搭建全过程,含 Dockerfile 解析、多服务编排、卷挂载、环境变量注入等核心技巧。

为什么选择 Docker?

  • 随意销毁重建:环境即代码,随时 docker rm -f 重来。
  • 秒级启动:无虚拟化开销,docker run 即用。
  • 易于更新:修改 Dockerfile 重新 build 即可滚动升级 PHP、Nginx 版本。

单容器 vs 多容器

本文采用单容器模式:Nginx、PHP-FPM、MySQL、Supervisor 同跑一容器。优点:分发简单、镜像自包含;缺点:升级某组件需重建整镜像。生产环境推荐多容器编排(Docker Compose/K8s)。

核心文件结构

docker-symfony/
├── Dockerfile
├── vhost.conf          # Nginx 虚拟主机配置
├── supervisor.conf     # Supervisor 进程管理配置
├── init.sh             # 容器启动初始化脚本

Dockerfile 关键解析

FROM debian:wheezy
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update -y && apt-get install -y \
    nginx php5-fpm php5-mysqlnd php5-cli mysql-server supervisor
# 前台运行配置
RUN sed -i 's/;daemonize = yes/daemonize = no/' /etc/php5/fpm/php-fpm.conf
RUN sed -i 's/;listen\.owner/listen.owner/' /etc/php5/fpm/pool.d/www.conf
RUN sed -i 's/;listen\.group/listen.group/' /etc/php5/fpm/pool.d/www.conf
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
ADD vhost.conf /etc/nginx/sites-available/default
ADD supervisor.conf /etc/supervisor/conf.d/supervisor.conf
ADD init.sh /init.sh
EXPOSE 80 3306
VOLUME ["/srv"]
WORKDIR /srv
CMD ["/usr/bin/supervisord"]

关键配置片段

Nginx 虚拟主机

server {
    listen 80;
    server_name _;
    root /srv/web;
    index app_dev.php;
    location / { try_files $uri $uri/ /app_dev.php?$query_string; }
    location ~ [^/]\.php(/|$) {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        include fastcgi_params;
    }
}

Supervisor 管理多进程

[supervisord]
nodaemon=true
[program:nginx]
command=/usr/sbin/nginx
[program:php5-fpm]
command=/usr/sbin/php5-fpm
[program:mysql]
command=/usr/bin/mysqld_safe
[program:init]
command=/init.sh
autorestart=false
redirect_stderr=true
redirect_stdout=/srv/app/logs/init.log

启动初始化脚本

#!/bin/bash
RET=1
while [[ RET -ne 0 ]]; do
    sleep 1
    mysql -e 'exit' > /dev/null 2>&1
    RET=$?
done
DB_NAME=${DB_NAME:-symfony}
mysqladmin -u root create $DB_NAME
if [ -n "$INIT" ]; then
    /srv/$INIT
fi

构建与运行

# 构建镜像
cd docker-symfony
docker build -t symfony .

# 运行容器(挂载当前项目目录)
cd SomeProject
docker run -i -t -P -v $PWD:/srv symfony

# 自定义数据库名与初始化脚本
docker run -i -t -P -v $PWD:/srv \
  -e DB_NAME=some_project_dev \
  -e INIT=bin/setup \
  symfony

验证与调试

  • docker port <container_id> 80 查看宿主机映射端口。
  • curl https://localhost:<mapped_port> 测试响应。
  • Symfony 默认限制非本地访问 app_dev.php,需注释安全检查代码或配置 HTTP_X_FORWARDED_FOR。

此方案在 Linux 原生 Docker 下体验最佳;macOS/Windows 需注意卷挂载性能与路径映射细节(可参考后续专文)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved