обратный прокси-контейнер docker двум другим контейнерам docker, как иметь несколько экземпляров на одном компьютере

#apache #docker #docker-compose #reverse-proxy

#apache #docker #docker-compose #обратный прокси

Вопрос:

В этом проекте у меня есть контейнер docker apache (называемый loadbalancer), который указывает на любой из двух контейнеров docker apache. Если указан путь «/support *», то он переходит в контейнер поддержки, в противном случае он переходит в webapp. В настоящее время для достижения этой цели я жестко запрограммировал свою подсеть docker compose networks и ipv4-адрес каждого контейнера. Затем файл apache conf просто указывает на эти жестко закодированные IP-адреса. Это отлично работает для локальных сред разработки.

Однако это не работает для промежуточных серверов, на которых необходимо разместить несколько экземпляров проекта. Я не могу развернуть более одного экземпляра этой сети docker-compose из-за жестко закодированных адресов подсети / ipv4. Как я могу добиться такой настройки балансировщика нагрузки без жесткого кодирования подсети, чтобы у меня могло быть несколько экземпляров. Или есть лучшее решение для достижения желаемого эффекта размещения множества копий на одном сервере, такого как множество vhosts в контейнере apache. Что бы вы предложили? Поскольку я понятия не имею, что было бы наилучшей практикой здесь.

loadbalancer.conf

 <VirtualHost *:80>
    TimeOut -1

    ProxyPass "/support" "http://172.20.0.5/support"
    ProxyPassReverse "/support" "http://172.20.0.5/support"
    ProxyPass "/" "http://172.20.0.2/"
    ProxyPassReverse "/" "http://172.20.0.2/"

    ProxyPreserveHost On
    TimeOut -1
</VirtualHost>
  

docker-compose.yml

 version: '3.7'

networks:
  pi-net:
    ipam:
      config:
      - subnet: 172.20.0.0/24

services:
    cli:
        container_name: cli
        build: ./docker/cli
        networks:
          pi-net:
            ipv4_address: 172.20.0.3
        volumes:
        - type: bind
          source: .
          target: /srv/www
        - type: bind
          source: $HOME/.gitconfig
          target: /home/developer/.gitconfig
        extra_hosts:
        - "pi.docker:172.20.0.2"
        user: developer
        stdin_open: true
        tty: true
        environment:
          GIT_PAGER: cat

    webapp:
        container_name: webapp
        build:
          context: ./docker/web-server
          args:
            - vhostsFileName=webapp.conf
        networks:
          pi-net:
            ipv4_address: 172.20.0.2
        ports:
        - 80
        volumes:
        - type: bind
          source: .
          target: /srv/www
        # depends on cli because cli entrypoint.sh is creating var/ files needed by httpd
        depends_on:
          - "cli"

    support:
        container_name: support
        build:
          context: ./docker/web-server
          args:
            - vhostsFileName=support.conf
        networks:
          pi-net:
            ipv4_address: 172.20.0.5
        ports:
          - 80
        volumes:
          - type: bind
            source: .
            target: /srv/www
        # depends on cli because cli entrypoint.sh is creating var/ files needed by httpd
        depends_on:
          - "cli"

    loadbalancer:
        container_name: loadbalancer
        build:
          context: ./docker/web-server
          args:
            - vhostsFileName=loadbalancer.conf
        networks:
          pi-net:
            ipv4_address: 172.20.0.6
        ports:
          - 80:80

    db:
        container_name: db
        build: ./docker/mysql
        networks:
          pi-net:
            ipv4_address: 172.20.0.4
        ports:
        - 3306:3306
        volumes:
        - db:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_DATABASE: pi
            MYSQL_USER: root
            MYSQL_PASSWORD: root
        restart: always

volumes:
    db:
        driver: local
  

Комментарии:

1. как насчет некоторых аргументов? forums.docker.com/t/environment-variables-in-args/27522

2. Это для обычных контейнеров docker, я не уверен, что вы можете получить аргументы для изменения самого файла yml

Ответ №1:

Docker предоставляет внутреннюю службу DNS для преобразования имен контейнеров в имена хостов, а Docker Compose предоставляет вам сеть. Вы должны внести два изменения:

  1. В вашей конфигурации Apache замените явные IP-адреса на имя соответствующего сервисного блока в docker-compose.yml : http://support/support , например.
  2. Удалите все networks: и container_name: настройки в docker-compose.yml , поскольку они избыточны и ограничивают повторное использование файла. (Docker назначит вам IP-адреса, а Docker Compose выберет имена контейнеров, но в этих значениях по умолчанию нет ничего плохого.)

(Многие вопросы этой формы также используют устаревшую links: функциональность; также безопасно удалять все links: блоки.)

Комментарии:

1. Спасибо, я проведу некоторое тестирование с этим позже. Не уверен, почему я не подумал об этом раньше, учитывая, что я делаю это с моими данными о подключении к базе данных

2. Отвечает на мой первоначальный вопрос, поэтому я отмечу его как принятый, однако из-за моего использования extra_hosts: это не сработало, поскольку я не смог успешно изменить использование этого ip на «loadbalancer»

3. Заменил extra_hosts на external_links, и по какой-то причине это работает так же хорошо. Надеюсь, это кому-то поможет