![docker_logo.png](/sites/default/files/styles/thumbnail/public/image_preview/docker_logo.png?itok=6rJdcD5G)
Изначально использовал обычный образ nginx, который биндил на 80 (или любой другой) порт и смотрел сайт из браузера по урлу http://127.0.0.1[:8080]. Потом прочитал о прокси и стал использовать Traefik но только для контейнеров которые запускались из одного docker-compose.yml файла и только в одной виртуальной сети. И уже с красивыми урлами, типа http://mywebsite.in-docker.localhost/.
Внезапно возникла задача, чтоб два сайта на локалке крутились и могли между собой общаться, запросы посылать и узнавать как дела. Идея клонирования контейнеров в docker-compose мне не нравится. Можно было бы запустить nginx-1 + php-1, nginx-2 + php-2, дать им урлы разные. И так как они в одной вирутальной сети (default) то и видели бы друг друга. Но что если надо добавить еще несколько сайтов? Уже некрасиво получается… php-1, php-2,php-3, php-4…
Решением данной проблемы является создание одной общей виртуальной сети и общего Traefik для всех сайтов.
Создаем файл docker-compose.traefik.yml
version: "3"
services:
traefik:
image: traefik
container_name: "my-traefik"
ports:
- "80:80"
- "8080:8080"
volumes:
- ./traefik.toml:/etc/traefik/traefik.toml:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
default:
external:
name: common-traefik
80 порт для всех сайтов, 8080 для дашбоарда самого траефика.
Важно!! файл /images-traefik/traefik.toml в нем даем команду отображать дашборду и какую сеть мониторить под докером.
[api] dashboard = true insecure = true [providers.docker] watch = true network = "common-traefik"
Далее создаем докер композ для наших сайтов клонов. docker-compose.drupal8.yml
version: '3' services: php-fpm: image: php:7.4-fpm-alpine container_name: "${PROJECT_NAME}-php-fpm" volumes: - ../${PROJECT_NAME}:/drupal links: - mariadb labels: - "traefik.enable=false" networks: - default - project-network web: image: nginx:alpine container_name: "${PROJECT_NAME}-web" expose: - '80' volumes: - ../${PROJECT_NAME}:/drupal environment: - SERVER_NAME=${PROJECT_NAME}.my-docker.localhost links: - php-fpm labels: - traefik.http.routers.${PROJECT_NAME}.rule=Host(`${PROJECT_NAME}.my-docker.localhost`) depends_on: - php-fpm networks: - default - project-network mariadb: image: mariadb:10.3 container_name: "${PROJECT_NAME}-sql" environment: MYSQL_ROOT_PASSWORD: 'password' MYSQL_DATABASE: 'drupal8' MYSQL_USER: 'drupal8' MYSQL_PASSWORD: 'drupal8' command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--default-authentication-plugin=mysql_native_password'] labels: - "traefik.enable=false" cap_add: - SYS_NICE volumes: - db:/var/lib/mysql networks: - project-network volumes: db: networks: default: external: name: common-traefik project-network: name: ${PROJECT_NAME}-network internal: true
Он упрощенный насколько можно, у вас будет сложнее. Внимание нужно обратить на описание виртуальных сетей внизу файла. А именно внешняя сеть common-traefik.
В файле можно заметить ${PROJECT_NAME} – для каждого сайта будут свои значение.
Как использовать разные env файлы для инстансов я опишу в следующей статье.
Обратите внимание на лейбы – прописываются правила для траефика, и под какими урлами контейнер (сайт) будет доступен из браузера на локалке.
- traefik.http.routers.${PROJECT_NAME}.rule=Host(`${PROJECT_NAME}.my-docker.localhost`)
Перед запуском траефика необходимо создать сеть
$ docker network create \ --driver=bridge \ --attachable \ --internal=false \ common-traefik
Проверяем что сеть создана комнадой. В списке должна быть сеть common-traefik
$ docker network ls
В общем, запускаем сначала наш докер с траефиком
$ docker-compose --project-name my-traefik --file ./docker-compose.traefik.yml up -d –build
и после того как все скачалось и запустилось, можно проверить список запущенных контейнеров.
$ docker ps
Запускаем вебсайты
$ export PROJECT_NAME=website1;docker-compose --project-name ${PROJECT_NAME}--file ./docker-compose.drupal8.yml up -d –build
$ export PROJECT_NAME=website2;docker-compose --project-name ${PROJECT_NAME}--file ./docker-compose.drupal8.yml up -d –build
отлично. Что дальше?
Проверить что дашборда траефика работает
http://127.0.0.1:8080/dashboard
Зайти в роуты и посмотреть на обнаруженные инстансы
http://127.0.0.1:8080/dashboard#/http/routers
и зайти по урлам сайта проверить что все работает
http://website1.my-docker.localhost/
http://website2.my-docker.localhost/
выключить контейнеры
$ export PROJECT_NAME=website1;docker-compose --project-name ${PROJECT_NAME} --file ./docker-compose.drupal8.yml down $ export PROJECT_NAME=website2;docker-compose --project-name ${PROJECT_NAME} --file ./docker-compose.drupal8.yml down $ docker-compose --project-name my-traefik --file ./docker-compose.traefik.yml down
Конечно, писать это все в консоли или копировать-вставить не удобно. В другой статье покажу Makefile.
Таким образом, у нас получилось запустить два сайта, которые используют одинаковые по контенту и настройке контейнеры, из одного docker-compose файла! Данный пример используется только для локальной разработке, тк на сервере в продакшне нужны допольнительные настройки безопасности.
исходники можно скачать тут: https://github.com/onesixromcom/docker_traefik_multiple
Добавить комментарий