docker_logo.png

Изначально использовал обычный образ 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-теги не обрабатываются и показываются как обычный текст
  .d888888   d88   dP   dP   dP  dP     dP  dP   dP 
d8' 88 88 88 88 88 88 88 88 88
88aaaaa88a 88 88 .8P .8P 88 88 88aaa88
88 88 88 88 d8' d8' 88 88 88
88 88 88 88.d8P8.d8P Y8. .8P 88
88 88 d88P 8888' Y88' `Y88888P' dP

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