Люди не понимают потрясающих возможностей разумного использования технологий.
Жак Фреско
Это продолжение статьи Docker для ленивых: Локальная разработка сайтов. Часть 1 и в ней мы разберемся как запустить несколько сайтов параллельно используя для каждого свой docker-compose.yml
Что мы будем делать?
Мы выведем Traefik и Portainer в отдельный проект (для этого создадим папку traefik) и файл docker-compose.yml, так как все новые и старые проекты будут при запуске присоединены к ним, таким образом мы сразу получаем контроль над всеми запущенными нами проектами!
Для этого перед стартом нам нужно будет создать свою виртуальную сеть “gateway” (название можете выбрать сами) следующей командой в терминале или командной строке:
docker network create --driver=bridge --attachable --internal=false gateway
После этого запишем в docker-compose.yml следующие инструкции:
version: "3.3"
services:
# Настройки для Traefik
traefik:
image: traefik
container_name: global_traefik
restart: "always"
ports:
- "80:80"
- "443:443"
- "8080:8080"
command: --api.insecure=true --providers.docker
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# Указываем что Traefik будет работать с нашей виртуальной сетью
networks:
- default
# Настройки для Portainer
portainer:
image: portainer/portainer
container_name: "global_portainer"
command: --no-auth -H unix:///var/run/docker.sock
volumes:
- /var/run/docker.sock:/var/run/docker.sock
labels:
- "traefik.http.routers.global_portainer.rule=Host(`portainer.localhost`)"
# Указываем что Portainer будет работать с нашей виртуальной сетью
networks:
- default
# Объявляем Docker'у как default ранее созданную нами виртуальную сеть с именем "gateway"
networks:
default:
external:
name: gateway
# Перед запуском этого файлане забываем создать виртуальную сеть с именем "gateway" следующей командой:
# docker network create --driver=bridge --attachable --internal=false gateway
Сохраняем файл.
Теперь добавляем к файлу HOSTS следующие домены:
127.0.0.1 localhost
127.0.0.1 portainer.localhost
И запускаем файл traefik/docker-compose.yml командой:
docker-compose up -d
Теперь у нас есть доступ к двум доменам:
http://localhost:8080/dashboard/#/ - графический контроль над прокси сервером Traefik
http://portainer.localhost/#/home - графический контроль над Portainer’ом
Как теперь присоединить новый или ранее созданный сайт к нашей виртуальной сети?
Это можно сделать немного изменив файл docker-compose.yml в созданном нами ранее проекте my-project, это было описано в предыдущей статье Docker для ленивых: Локальная разработка сайтов. Часть 1.
Заходим в папку my-project и открываем docker-compose.yml и заменяем его содержимое следующими инструкциями:
version: "3.3"
services:
# Настроавиваем контейнер для PHP
php:
# Выбираем образ wodby/drupal-php так как в нем уже все настроено и установлены компоненты для PHP Вот документация https://github.com/wodby/drupal-php
# Если вы будете работать не с Drupal то моищите на https://hub.docker.com/ подходящий образ для Вашей CMS.
image: wodby/drupal-php:$PHP_TAG
# Задаем понятное нам имя для контейнера используя переменную которую мы объявили в ранее созданном файле .env
container_name: "${PROJECT_NAME}_php"
# Теперь задаем настройки для самого PHP
environment:
PHP_SENDMAIL_PATH: /usr/sbin/sendmail -t -i -S opensmtpd:25
DB_HOST: $DB_HOST
DB_PORT: $DB_PORT
DB_USER: $DB_USER
DB_PASSWORD: $DB_PASSWORD
DB_NAME: $DB_NAME
DB_DRIVER: $DB_DRIVER
PHP_FPM_USER: wodby
PHP_FPM_GROUP: wodby
# Даем доступ PHP к нашей папки WWW где будет размещен сайт
volumes:
- ./www:/var/www/html:cached
# Добавляем к контейнеру внутреннюю виртуальную сеть, объединяющие наши контейнеры
networks:
- network
# Настроавиваем контейнер для MySQL
mysql:
# здесь все так же как и в PHP, указываем нужный нам образ, задаем версию MySQL, имя для контейнера и настройки
image: mysql:$MYSQL_TAG
container_name: "${PROJECT_NAME}_mysql"
environment:
MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
MYSQL_PASSWORD: $DB_PASSWORD
MYSQL_USER: $DB_USER
MYSQL_DATABASE: $DB_NAME
# Позволяем MySQL хранить Базу данных test в папке db которая автоматически будет создана в папке нашего проекта my-project
volumes:
- ./db:/var/lib/mysql
# Добавляем к контейнеру внутреннюю виртуальную сеть, объединяющие наши контейнеры
networks:
- network
# Настроавиваем контейнер для PHPMySQLAdmin
pma:
image: phpmyadmin/phpmyadmin
container_name: "${PROJECT_NAME}_pma"
environment:
PMA_HOST: $DB_HOST
PMA_USER: $DB_USER
PMA_PASSWORD: $DB_PASSWORD
UPLOAD_LIMIT: 1G
PMA_PORT: $DB_PORT
# А вот тут мы задаем поддомен для PHPMySQLAdmin в виде http://pma.my-project.local используя Traefik
labels:
- "traefik.http.routers.${PROJECT_NAME}_pma.rule=Host(`pma.${PROJECT_BASE_URL}`)"
# Объясняем Docker что PHPMySQLAdmin не можетработать без MySQL
depends_on:
- mysql
# Так как наш контейнер с PHPMySQLAdmin должен иметь возможность отдавать данные нам в браузер, то мы должны его присоединить не только в внутренней сети нашего проекта, но и к ранее созданной сети "gateway"!
networks:
- default
- network
# Настроавиваем контейнер для Apache, здесь мы будем использовать образ wodby/apache, так как он уже настроен под Drupal. Вот документация https://github.com/wodby/apache
apache:
image: wodby/apache:$APACHE_TAG
container_name: "${PROJECT_NAME}_apache"
# Объявляем необходимость контейнера с PHP
depends_on:
- php
environment:
APACHE_LOG_LEVEL: debug
APACHE_BACKEND_HOST: php
APACHE_VHOST_PRESET: php
APACHE_DOCUMENT_ROOT: /var/www/html
# Указываем Apache что наш проект будет лежать в папке my-project/www
volumes:
- ./www:/var/www/html
# Инструкция для Traefik чтобы сайт открывался по адресу http://my-project.local который мы задали в .env
labels:
- "traefik.http.routers.${PROJECT_NAME}_apache.rule=Host(`${PROJECT_BASE_URL}`)"
# Так как наш контейнер с Apache должен иметь возможность отдавать данные нам в браузер, то мы должны его присоединить не только в внутренней сети нашего проекта, но и к ранее созданной сети "gateway"!
networks:
- default
- network
# Объявляем сети, как ранее созданную сеть "gateway" так и частную виртуальную сеть для нашего проекта
networks:
default:
external:
name: gateway
network:
internal: true
Как видите по сравнению с ранее использованными инструкциями мы добавили сети и убрали Traefik и Portainer, так как они у нас уже запущены и работают!
Теперь давайте поправим наш HOSTS файл убрав из него вот эту строку (отмечена перечеркиванием), так как Portainer теперь у нас работает по адресу http://portainer.localhost:
127.0.0.1 my-project.local
127.0.0.1 pma.my-project.local
127.0.0.1 portainer.my-project.local
Отлично! Давайте запустим наш проект уже ставшей привычной нам командой:
docker-compose up -d
В результате мы получим доступ к двум доменам:
http://my-project.local
http://pma.my-project.local
А перейдя на страницу Portainer’а http://portainer.localhost Вы сможете увидеть все созданные нами сети, контейнеры, образы, виртуальные папки и управлять ими прямо из графического интерфейса:
На главной странице Portainer’а Вы увидите краткую сводку, а в левом меню сможете просмотреть всю детальную информацию о том что запущено и используется Docker’ом в режиме реального времени.
И в качестве самостоятельного задания попробуйте сами отредактировать docker-compose.yml в нашем втором проекте my-site, который мы создавали в прошлой статье! Так же добавляйте сети к контейнерам, убирайте trafick и portainer и запускайте!
Результат вы увидите на странице Portainer’а.
Комментарии