Docker состоит из нескольких подсайтов

Я использую Docker compose для запуска среды nginx+php+mysql, OS - centos 7.2, вопрос касается множественного субсайта на одном хосте:

Например:
На этом хосте будет работать один хост, два проекта,
с именем project-a и project-b,
два разных docker-compose.yml exsist в проекте-a и project-b.

Вопрос:

При выполнении docker-compose up в project-a и project-b выполняется ли среда nginx+php+mysql с двумя или двумя? Если два, занято много места, как решить эту проблему?

Добавить: docker-compose.yml
version: '2'

services:

    nginx:
      container_name: nginx
      image: nginx
      ports:
        - 80:80
        - 443:443
      links:
        - php
      env_file:
        - ./.env
      working_dir: /usr/share/nginx/html   # should be `/usr/share/nginx/html/project-a` and `/usr/share/nginx/html/project-b` here?
      volumes:
        - ~/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
        - ~/docker/nginx/nginx.conf:/etc/nginx/nginx.conf
        - ~/docker/www:/usr/share/nginx/html

    php:
      container_name: php
      image: fpm
      links:
        - mariadb
        - redis
      env_file:
        - ./.env
      volumes:
        - ~/docker/www:/usr/share/nginx/html

    mariadb:
      container_name: mariadb
      image: mariadb
      env_file:
        - ./.env
      volumes:
        - ~/opt/data/mysql:/var/lib/mysql

    redis:
      container_name: redis
      image: redis

.env:
project-a и project-b имеют разные DB_DATABASE и APP_KEY, другие элементы одинаковы.

APP_ENV=local
APP_DEBUG=true
APP_KEY=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   # Here different.

DB_HOST=laravel.dev
DB_DATABASE=project-a   # Here different.
DB_USERNAME=root
DB_PASSWORD=

CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=laravel.dev
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

Файлы проекта:
project-a и project-b имеют один и тот же каталог. введите описание изображения здесь

URLs:
project-a: aaa.xxxxxx.com
project-b: bbb.xxxxxx.com

Папки проекта:
project-a: ~/грузчик/WWW/проект-а
project-b: ~/docker/www/project-b

Вспомогательный вопрос:

1, должен ли working_dir быть /usr/share/nginx/html/project-name или /usr/share/nginx/html в файле docker-compose.yml?

2, Если working_dir есть /usr/share/nginx/html, я думаю, что файлы docker-compose.yml имеют одинаковый контент в project-a и project-b, правильно? Есть ли какие-либо другие элементы, которые нужно изменить?

3, Как объединить файл компоновки в один?

add2:

project-common: docker-compose.yml

version: '2'

services:

    nginx:
      container_name: nginx
      image: nginx

    php:
      container_name: php
      image: fpm

    mariadb:
      container_name: mariadb
      image: mariadb

    redis:
      container_name: redis
      image: redis

project-a: docker-compose.yml, а project-b - это то же самое, кроме имени проекта.

version: '2'

services:

    nginx:
      external_links:
        - project-common:nginx
      ports:
        - 80:80
        - 443:443
      links:
        - php
      env_file:
        - ./.env
      working_dir: /usr/share/nginx/html/project-a
      volumes:
        - ~/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
        - ~/docker/nginx/nginx.conf:/etc/nginx/nginx.conf
        - ~/docker/www/project-a:/usr/share/nginx/html/project-a


    php:
      external_links:
        - project-common:php
      links:
        - mariadb
        - redis
      env_file:
        - ./.env
      volumes:
        - ~/docker/www:/usr/share/nginx/html/project-a


    mariadb:
      external_links:
        - project-common:mariadb
      env_file:
        - ./.env
      volumes:
        - ~/opt/data/mysql:/var/lib/mysql


    redis:
      external_links:
        - project-common:redis

Ответ 1

Вам не нужно запускать nginx и php-fpm в разных контейнерах. (если ваши проекты имеют одну версию php)

Вы запускаете fpm в качестве службы и в том же контейнере запускаете nginx в режиме daemon-off.

Затем вы переходите к конфигурации nginx и настраиваете несколько поддоменов.

Затем настройте тома данных/общие папки в соответствии с настройкой вашего поддомена.

Итак, у вас есть единственный экземпляр nginx/fpm, который обслуживает многопользовательские проекты, а также некоторые другие контейнеры базы данных/сервисов

Ответ 2

Я согласен с странным, вам нужен только один контейнер, на котором вы можете установить 2 тома.

Если 2 проекта используют одну и ту же версию PHP и MariaDB, просто настройте их правильно, чтобы использовать разные базы данных, но в том же контейнере

Ответ 3

В общем, я согласен с как странным, так и с intuix.

Однако, если вам требуется изолировать сайты, было бы лучше настроить отдельные пулы php-fpm и отдельных пользователей для каждого сайта, имея отдельные определения в /etc/php5/fpm/pool.d/ с различными сокетами unix.

Каждое определение сайта в nginx должно использовать соответствующий сокет пула php-fpm.

Это дает хорошее объяснение тому, как это сделать: https://www.digitalocean.com/community/tutorials/how-to-host-multiple-websites-securely-with-nginx-and-php-fpm-on-ubuntu-14-04