传统 Vagrant 虚拟机资源占用高、启动慢。Docker 容器技术以轻量、秒级启动、易迭代优势成为新标准。本文详细记录基于 Docker 单容器运行 Nginx + PHP-FPM + MySQL 的 Symfony 开发环境搭建全过程,含 Dockerfile 解析、多服务编排、卷挂载、环境变量注入等核心技巧。
docker rm -f 重来。docker run 即用。build 即可滚动升级 PHP、Nginx 版本。本文采用单容器模式:Nginx、PHP-FPM、MySQL、Supervisor 同跑一容器。优点:分发简单、镜像自包含;缺点:升级某组件需重建整镜像。生产环境推荐多容器编排(Docker Compose/K8s)。
docker-symfony/ ├── Dockerfile ├── vhost.conf # Nginx 虚拟主机配置 ├── supervisor.conf # Supervisor 进程管理配置 ├── init.sh # 容器启动初始化脚本
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"]
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;
}
}
[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> 测试响应。app_dev.php,需注释安全检查代码或配置 HTTP_X_FORWARDED_FOR。此方案在 Linux 原生 Docker 下体验最佳;macOS/Windows 需注意卷挂载性能与路径映射细节(可参考后续专文)。