【发布时间】:2020-03-21 06:44:39
【问题描述】:
我最近从 Wamp(wampserver)迁移到 Docker(Windows 主机)。在使用 wamp 时,我能够拥有多个项目,例如以下文件结构
- wamp64
- www/
- project1/
- project2/
- ....
在 wamp 的 Apache 上,我定义了几个虚拟主机,所有项目都使用 wamp 的数据库,每个都有自己的架构。
因此,在必要时从project1、project2 到project3 等切换上下文是很常见的。
通过访问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 persistent data MySQL
【问题讨论】:
-
您是否为每次代码更改重新构建 Docker 映像?如果是这样,您可以使用开发中的卷来缓解这种情况。
-
为什么必须停止一个 Docker 项目并启动另一个单端口冲突?
-
您希望从使用 Docker 中获得哪些具体好处?您能否将工作中的非 Docker 设置用于日常开发,而仅将 Docker 设置用于生产部署?
-
@DavidMaze 我最初从 Wamp 迁移到 Docker,因为我遇到了关于 memcache 扩展和 PHP 7.3 的不兼容问题。由于我的生产环境使用 LAMP 环境,我认为将本地设置与生产设置尽可能接近更合适
-
@halfer 似乎为单个项目了解 Docker 不同于在不同项目中使用它。我显然做错了什么,这就是我开始这个线程的原因,因为有一些可行的方法可以改进我使用 Docker 的方式。
标签: php docker docker-compose lamp