我最近从Wamp(wampserver)转移到Docker(Windows主机)。当使用Wamp时,我能够有多个项目,如以下文件结构
- wamp64
- www/
- project1/
- project2/
- ....
在wamp的Apache上,我定义了几个虚拟主机,所有的项目都使用wamp的数据库,每个项目都有自己的模式。
因此,在一天之内,通过访问像http://localhost/projectX
这样的url或相应的虚拟主机,在必要时从project1
到project2
再到project3
等切换上下文是很常见的。
这在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构建花费的时间太长,可能是因为文件数量增加,而不是单个项目上的较小数量
1.我不能在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 persistent data MySQL
3条答案
按热度按时间j2qf4p5b1#
我认为对你来说最好的解决方案是在它自己的容器中运行每个项目。因为容器是轻量级的,容易启动和关闭,这样做的开销应该是最小的。
与第一种方法不同的是,docker-compose文件将为您编排容器。因此,它应该允许所有容器(项目)同时与数据库通信。(假设您的项目不会不断地相互覆盖,从而导致死锁)
文件夹结构:
Docker撰写
然后当你运行
docker-compose up
时,它会在同一个网络中打开两个项目容器和一个数据库容器。注意,每个项目都在它自己的端口上运行。所以你需要记住哪个端口链接到哪个容器。ma8fv8wu2#
创建顶级文件夹并将此Dockerfile放入其中
在顶层文件夹中运行以下命令:
Docker编译-t myphpdev:最新的. -f Docker文件
现在,在同一顶层文件夹中创建一个docker-compose.yml,并将以下内容放入其中:
在同一个顶层文件夹中,为数据库持久性创建一个名为data的文件夹,并为每个站点创建一个文件夹。
根据需要调整/添加任何PHP_ env变量,当出现env变量时,映像将基于该变量更新php.ini。
当以这种方式运行时,每个站点都必须使用相对链接而不是绝对链接进行设置,并且它们都将共享同一个数据库示例。
最不占用资源的配置是让每个站点共享同一个数据库示例,并让每个站点在示例上拥有自己的数据库。如果由于某种原因,所有站点都必须使用同一个数据库名称,则还可以使用表前缀。
如果你不介意额外的资源使用,你可以复制mysql块,确保你有一个唯一的端口号和每个数据文件夹,并为每个站点提供一个完全独立的数据库服务器。
在容器中装载主机将允许您从主机端编辑站点文件夹的内容,并使用xdebug进行实时调试,而不必在每次迭代或上下文切换时重新构建docker环境。
如果您不想在站点中使用相对链接,也可以通过添加一些Apache配置来设置虚拟主机,方法是将配置挂载到/opt/docker/etc/httpd/vhost.common.d/
查看Dockerfile中引用的图片的文档。它们在php版本的web服务器和基本操作系统以及开发和生产设置方面有大量的变化。我在下面提供了一个链接到它们的文档。
WebDevOps ApachePHP Docker Docs
icnyk63a3#
我会超级小心凯尔的答案..考虑这个例子
通过使用他的建议,您将无法在
./project1/Dockerfile
或./project2/Dockerfile
中使用shared.php所以与其
只管做
这告诉系统可能包含共享文件的context文件夹与Dockerfile所在的文件夹不同,这是一个非常有用的分离。
有关上下文的更多详细信息,请单击此处https://stackoverflow.com/a/53298876/1907888