php - 将 Docker 用于多个 php 应用程序
问题描述
我最近从 Wamp (wampserver) 搬到了 Docker (Windows 主机)。在使用 wamp 时,我能够拥有多个项目,例如以下文件结构
- wamp64
- www/
- project1/
- project2/
- ....
在 wamp 的 Apache 上,我定义了几个虚拟主机,所有的项目都使用 wamp 的数据库,每个都有自己的模式。
因此,在必要时通过访问类似 url或相应的虚拟主机来在必要时从project1
、project2
toproject3
等切换上下文是很常见的。http://localhost/projectX
正如我目前所看到的,这在 Docker 上似乎并不那么简单。我的第一种方法是在每个项目上设置一个不同的 Docker
- www/
- project1/
- dockerfile & docker-compose
- project2/
- dockerfile & docker-compose
- projectX/
- dockerfile & docker-compose
- data // this is where mysql data lie
与我习惯使用 wamp 相比,我认为这似乎不太有效,因为每次我想更改上下文时,我都必须使用docker-compose stop
我当前正在工作docker-compose up
的项目和我想要切换到的项目,反之亦然.
我尝试了另一种方法,在单个 apache-php 容器(整个 www 文件夹)中运行所有项目
- www/
dockerfile & docker-compose
- project1/
- project2/
这可以让我同时拥有所有项目,但是通过这种方法,我面临两个严重的问题。
- docker build 花费的时间太长,可能是因为文件数量增加,而不是单个项目的数量减少
- 我不能在 mysql 中初始化一个数据库模式,所以即使我设法让 2 或 3 个项目运行,也只有 1 个能够与相应的数据库通信。
我在第一种方法中的 docker-compose 文件看起来像这样
version: '3'
services:
project1:
build:
context: . // contents of specific project directory
dockerfile: .docker/Dockerfile
image: project1
ports:
– 80:80
volumes:
– .:/app/project1
links:
– mysql
mysql:
image: mysql:5.7
ports:
– 13306:3306
environment:
MYSQL_DATABASE: docker
MYSQL_USER: docker
MYSQL_PASSWORD: docker
MYSQL_ROOT_PASSWORD: docker
volumes:
- ../data:var/lib/mysql
而我在第二种方法中的 docker-compose 文件看起来像这样
version: '3'
services:
web-project:
build:
context: . // contents of www directory
dockerfile: .docker/Dockerfile
image: web-project
ports:
– 80:80
volumes:
– /project1:/app/project1
– /project2:/app/project2
– /projectX:/app/projectX
links:
– mysql
mysql:
image: mysql:5.7
ports:
– 13306:3306
volumes:
- /data:var/lib/mysql
mysql 数据持久化的参考Docker-Compose 持久化数据 MySQL
解决方案
我认为对你来说最好的解决方案是在它自己的容器中运行每个项目。由于容器(应该)是轻量级的并且易于上下移动,因此这样做的开销应该是最小的。
我将展示的内容与第一种方法的不同之处在于 docker-compose 文件将为您编排您的容器。因此,它应该允许您的所有容器(项目)同时与您的数据库进行通信。(鉴于您的项目不会不断地相互覆盖,并导致死锁)
文件夹结构:
- www/
docker-compose.yml
- project1/
Dockerfile
- project2/
Dockerfile
码头工人撰写
version: '3'
services:
project1:
build:
context: /project1 #automatically finds Dockerfile
container_name: project1
ports:
– 8081:80
volumes:
– .:/app/project
links:
– mysql
project2:
build:
context: /project2 #automatically finds Dockerfile
container_name: project2
ports:
– 8082:80
volumes:
– .:/app/project
links:
– mysql
...
mysql:
image: mysql:5.7
ports:
– 13306:3306
volumes:
- /data:var/lib/mysql
然后当你运行docker-compose up
它时,它会在同一个网络中调出两个项目容器和一个数据库容器。请注意,每个项目都在其自己的端口上运行。所以你需要记住哪个端口链接到哪个容器。
推荐阅读
- django - 如何在基于类的视图中有多个发布请求处理方法
- node.js - 带有 ExpressJS 的 NodeJS
- powershell - 在 if 语句中组合多个条件
- extjs - 重新计算模型的字段
- haskell - 使用 Haskell 读取 OBJ 文件
- python - python setup.py 在没有 sudo 的情况下安装在 anaconda 中
- .htaccess - 我如何分离主域和子域使用 mod-rewrite 和 htaccess 文件
- django - Django:跨内联表单将实例传输到模板
- machine-learning - Keras SimpleRNN 的参数数量
- javascript - Json 数据到 javascript 数组中