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