为多个PHP应用程序使用Docker

z9gpfhce  于 2022-12-03  发布在  Docker
关注(0)|答案(3)|浏览(114)

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

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

在wamp的Apache上,我定义了几个虚拟主机,所有的项目都使用wamp的数据库,每个项目都有自己的模式。
因此,在一天之内,通过访问像http://localhost/projectX这样的url或相应的虚拟主机,在必要时从project1project2再到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/

这将使我可以一次获得所有项目,但使用这种方法,我面临两个严重的问题。

  1. 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

j2qf4p5b

j2qf4p5b1#

我认为对你来说最好的解决方案是在它自己的容器中运行每个项目。因为容器是轻量级的,容易启动和关闭,这样做的开销应该是最小的。
与第一种方法不同的是,docker-compose文件将为您编排容器。因此,它应该允许所有容器(项目)同时与数据库通信。(假设您的项目不会不断地相互覆盖,从而导致死锁)
文件夹结构:

- www/
    docker-compose.yml
    - project1/
      Dockerfile
    - project2/
      Dockerfile

Docker撰写

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时,它会在同一个网络中打开两个项目容器和一个数据库容器。注意,每个项目都在它自己的端口上运行。所以你需要记住哪个端口链接到哪个容器。

ma8fv8wu

ma8fv8wu2#

创建顶级文件夹并将此Dockerfile放入其中

FROM webdevops/php-apache-dev:7.2

# Add microsoft SQL support to PHP

# add microsoft packages to apt sources
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list
# install needed system packages as well as a few nice to have utils
RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
  DEBIAN_FRONTEND=noninteractive apt-get -y upgrade && \
  ACCEPT_EULA=Y apt-get -y install msodbcsql17 unixodbc-dev less joe iputils-ping traceroute telnet && \
  apt-get purge -y --auto-remove && \
  rm -rf /var/lib/apt/lists/*
# install sqlsrv php extensions
RUN pecl install sqlsrv pdo_sqlsrv
# load the pdo extension 
RUN echo extension=pdo_sqlsrv.so >> `php --ini | grep "Scan for additional .ini files" | sed -e "s|.*:\s*||"`/30-pdo_sqlsrv.ini
# load the mssql extension 
RUN echo extension=sqlsrv.so >> `php --ini | grep "Scan for additional .ini files" | sed -e "s|.*:\s*||"`/20-sqlsrv.ini

# our docroot
WORKDIR /app

在顶层文件夹中运行以下命令:

Docker编译-t myphpdev:最新的. -f Docker文件

现在,在同一顶层文件夹中创建一个docker-compose.yml,并将以下内容放入其中:

version: '3'
services:
  web_debug:
    image: myphpdev:latest
    ports:
      - 1080:80
    volumes:
      - .:/app
    environment:
      - PHP_XDEBUG_ENABLED=1
      - PHP_DATE_TIMEZONE="America/Los_Angeles"
      - PHP_MEMORY_LIMIT="512M"
      - PHP_MAX_EXECUTION_TIME="600"
      - PHP_MAX_INPUT_TIME="60"
      - PHP_POST_MAX_SIZE="512M"
      - PHP_UPLOAD_MAX_FILESIZE="512M"
      - PHP_ERROR_REPORTING="E_ALL & ~E_DEPRECATED & ~E_STRICT"
      - PHP_DISPLAY_ERRORS="1"
      - PHP_DISPLAY_STARTUP_ERRORS="1"
      - PHP_DEBUGGER="xdebug"
      - XDEBUG_CONFIG=remote_host=host.docker.internal

  mysql:
    image: mysql:5.7
    ports:
      - 13306:3306
    volumes:
      - ./data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password

# if you get errors about invalid or needing to use absolute paths
# you may need to down your stack then run the next line then up the stack
# SET COMPOSE_CONVERT_WINDOWS_PATHS=1

在同一个顶层文件夹中,为数据库持久性创建一个名为data的文件夹,并为每个站点创建一个文件夹。
根据需要调整/添加任何PHP_ env变量,当出现env变量时,映像将基于该变量更新php.ini。
当以这种方式运行时,每个站点都必须使用相对链接而不是绝对链接进行设置,并且它们都将共享同一个数据库示例。
最不占用资源的配置是让每个站点共享同一个数据库示例,并让每个站点在示例上拥有自己的数据库。如果由于某种原因,所有站点都必须使用同一个数据库名称,则还可以使用表前缀。
如果你不介意额外的资源使用,你可以复制mysql块,确保你有一个唯一的端口号和每个数据文件夹,并为每个站点提供一个完全独立的数据库服务器。
在容器中装载主机将允许您从主机端编辑站点文件夹的内容,并使用xdebug进行实时调试,而不必在每次迭代或上下文切换时重新构建docker环境。
如果您不想在站点中使用相对链接,也可以通过添加一些Apache配置来设置虚拟主机,方法是将配置挂载到/opt/docker/etc/httpd/vhost.common.d/
查看Dockerfile中引用的图片的文档。它们在php版本的web服务器和基本操作系统以及开发和生产设置方面有大量的变化。我在下面提供了一个链接到它们的文档。
WebDevOps ApachePHP Docker Docs

icnyk63a

icnyk63a3#

我会超级小心凯尔的答案..考虑这个例子

./project1/Dockerfile
./project2/Dockerfile
./shared.php

通过使用他的建议,您将无法在./project1/Dockerfile./project2/Dockerfile中使用shared.php
所以与其

build:
  context: /project1 #automatically finds Dockerfile

只管做

build:
  context: .
  dockerfile: ./project1/Dockerfile

这告诉系统可能包含共享文件的context文件夹与Dockerfile所在的文件夹不同,这是一个非常有用的分离。
有关上下文的更多详细信息,请单击此处https://stackoverflow.com/a/53298876/1907888

相关问题