Profile picture for Admin

Изначально использовал обычный образ 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

 

Добавить комментарий

Содержимое данного поля является приватным и не предназначено для показа.
  • HTML-теги не обрабатываются и показываются как обычный текст
  a88888b.  dP    dP  888888ba    88888888b   88888888b 
d8' `88 Y8. .8P 88 `8b 88 88
88 Y8aa8P 88 88 a88aaaa a88aaaa
88 d8' `8b 88 88 88 88
Y8. .88 88 88 88 88 88 88
Y88888P' dP dP dP dP dP 88888888P

Введите код, изображенный в стиле ASCII-арт.