将 Docker 用于多个 php 应用程序

nik*_*las 5 php lamp docker docker-compose

我最近从 Wamp(wampserver)搬到了 Docker(Windows 主机)。使用 wamp 时,我能够拥有多个项目,例如以下文件结构

- wamp64
  - www/
    - project1/ 
    - project2/
    - ....
Run Code Online (Sandbox Code Playgroud)

在 wamp 的 Apache 上,我定义了几个虚拟主机,所有项目都使用 wamp 的数据库,每个都有自己的架构。

因此,在必要时通过访问类似 url或相应的虚拟主机来切换上下文从project1project2project3等是很常见的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
Run Code Online (Sandbox Code Playgroud)

我认为,与我习惯使用 wamp 的相比,这似乎不太有效,因为每次我想更改上下文时,我都必须使用docker-compose stop我当前正在工作docker-compose up的项目和我想切换到的项目,反之亦然.

我尝试了另一种方法,在单个 apache-php 容器(整个 www 文件夹)中运行所有项目

- www/
    dockerfile & docker-compose
    - project1/
    - project2/
Run Code Online (Sandbox Code Playgroud)

这可以让我同时拥有所有项目,但是使用这种方法,我面临两个严重的问题。

  1. docker build 花费的时间太长,可能是因为文件数量增加,而不是单个项目的数量较少
  2. 我无法在 mysql 中初始化多个 db 模式,因此即使我设法运行了 2 或 3 个项目,也只有 1 个能够与相应的 db 进行通信。

第一种方法中的 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
Run Code Online (Sandbox Code Playgroud)

而我在第二种方法中的 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
Run Code Online (Sandbox Code Playgroud)

参考 mysql 数据持久化Docker-Compose 持久化数据 MySQL

Kyl*_*ure 7

我认为对您来说最好的解决方案是在它自己的容器中运行每个项目。由于容器(应该)是轻量级的并且易于上下移动,因此这样做的开销应该是最小的。

\n\n

我将展示的内容与第一种方法的区别在于 docker-compose 文件将为您编排容器。因此,它应该允许所有容器(项目)同时与数据库进行通信。(鉴于您的项目不会不断地相互覆盖,并导致死锁)

\n\n

文件夹结构:

\n\n
- www/\n    docker-compose.yml\n    - project1/\n      Dockerfile\n    - project2/\n      Dockerfile\n
Run Code Online (Sandbox Code Playgroud)\n\n

Docker 组合

\n\n
version: '3'\nservices:\n  project1:\n    build:\n      context: /project1 #automatically finds Dockerfile\n    container_name: project1\n    ports:\n      \xe2\x80\x93 8081:80\n    volumes:\n      \xe2\x80\x93 .:/app/project\n   links:\n      \xe2\x80\x93 mysql\n  project2:\n    build:\n      context: /project2 #automatically finds Dockerfile\n    container_name: project2\n    ports:\n      \xe2\x80\x93 8082:80\n    volumes:\n      \xe2\x80\x93 .:/app/project\n   links:\n      \xe2\x80\x93 mysql\n  ...\n  mysql:\n    image: mysql:5.7\n    ports:\n      \xe2\x80\x93 13306:3306\n    volumes:\n      - /data:var/lib/mysql\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,当您运行时,docker-compose up它将在同一网络中启动两个项目容器和一个数据库容器。请注意,每个项目都在其自己的端口上运行。因此,您需要记住哪个端口链接到哪个容器。

\n