能否运行多个Laravel等PHP应用容器并接入单一Web服务与数据库容器?
可以实现,这是多PHP项目Docker部署的标准方案之一
这种架构的优势是项目之间完全隔离、依赖不冲突,同时公共服务复用减少资源占用,后期迭代单个项目也不会影响其他在线业务。
核心架构逻辑
- 所有容器加入同一个Docker自定义桥接网络,容器之间可以直接通过容器名互相通信,无需暴露非必要端口到公网,安全性更高
- 统一的Web服务容器(通常用Nginx/Caddy)作为流量入口,为每个PHP应用配置独立的站点规则,匹配对应域名/路径前缀,将PHP请求转发到对应应用容器的9000端口(PHP-FPM默认端口),静态资源直接由Web服务读取返回
- 统一的数据库容器(常用MySQL/MariaDB/PostgreSQL)可以为每个应用创建独立的数据库、独立的访问账号,数据互相隔离,不会出现跨应用读写权限问题
- 每个PHP应用单独打包为独立容器:Laravel、WordPress、原生PHP的依赖、PHP版本要求都可能不同,单独打包完全避免依赖冲突,单个项目重启、更新、回滚都不会影响其他项目
简化版docker-compose配置参考
version: '3.8' # 统一网络,所有服务接入该网络 networks: php-apps-network: driver: bridge # 持久化卷配置 volumes: mysql-data: # 数据库数据持久化,避免容器删除丢失数据 wp-root: # WordPress项目根目录,共享给Nginx读静态资源 laravel-public: # Laravel项目public目录,共享给Nginx读静态资源 native-php-root: # 原生PHP项目根目录,共享给Nginx读静态资源 services: # 统一Web服务 nginx: image: nginx:stable-alpine ports: - "80:80" - "443:443" volumes: - ./nginx/sites:/etc/nginx/conf.d # 本地存放各站点的Nginx配置文件 - wp-root:/var/www/wordpress - laravel-public:/var/www/laravel/public - native-php-root:/var/www/native networks: - php-apps-network depends_on: - wordpress - laravel - native-php # 统一数据库服务 mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 替换为你自己的root密码 volumes: - mysql-data:/var/lib/mysql networks: - php-apps-network # 无需映射3306端口到宿主机,除非有本地工具连接数据库的需求 # WordPress应用容器 wordpress: image: wordpress:php8.2-fpm-alpine environment: WORDPRESS_DB_HOST: mysql:3306 WORDPRESS_DB_NAME: wordpress_db WORDPRESS_DB_USER: wordpress_user WORDPRESS_DB_PASSWORD: 替换为WordPress数据库密码 volumes: - wp-root:/var/www/html networks: - php-apps-network depends_on: - mysql # Laravel应用容器 laravel: build: ./laravel # 替换为你本地Laravel项目的Dockerfile路径 volumes: - laravel-public:/var/www/laravel/public environment: DB_HOST: mysql:3306 DB_DATABASE: laravel_db DB_USERNAME: laravel_user DB_PASSWORD: 替换为Laravel数据库密码 networks: - php-apps-network depends_on: - mysql # 原生PHP应用容器 native-php: build: ./native-php # 替换为你本地原生PHP项目的Dockerfile路径 volumes: - native-php-root:/var/www/native environment: DB_HOST: mysql:3306 DB_DATABASE: native_db DB_USERNAME: native_user DB_PASSWORD: 替换为原生PHP应用数据库密码 networks: - php-apps-network depends_on: - mysql
部署注意事项
- 提前在数据库容器中为每个应用创建对应的数据库和账号,不要直接用root账号连接业务应用
- Nginx的站点配置中,PHP请求的转发地址直接写对应应用的容器名即可,比如WordPress站点配置的
fastcgi_pass参数填wordpress:9000,无需配置IP - 如果不同应用需要不同的PHP版本,直接在对应应用的镜像中安装对应版本的PHP-FPM即可,Web服务侧无需修改配置
- 静态资源必须通过共享卷的方式让Nginx容器可以读取到,否则会出现静态资源404的问题
内容的提问来源于stack exchange,提问作者Web 101
相关产品推荐
相关产品推荐

