首页 > 解决方案 > 将 Docker 用于多个 php 应用程序

问题描述

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

- wamp64
  - www/
    - project1/ 
    - project2/
    - ....

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

因此,在必要时通过访问类似 url或相应的虚拟主机来在必要时从project1project2toproject3等切换上下文是很常见的。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/

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

  1. docker build 花费的时间太长,可能是因为文件数量增加,而不是单个项目的数量减少
  2. 我不能在 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

标签: phpdockerdocker-composelamp

解决方案


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

我将展示的内容与第一种方法的不同之处在于 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它时,它会在同一个网络中调出两个项目容器和一个数据库容器。请注意,每个项目都在其自己的端口上运行。所以你需要记住哪个端口链接到哪个容器。


推荐阅读