Docker-контейнер обратного прокси-сервера к двум другим Docker-контейнерам, как иметь несколько экземпляров на одном компьютере - PullRequest
0 голосов
/ 29 марта 2019

В этом проекте у меня есть контейнер докера Apache (называемый loadbalancer), который указывает на один из двух контейнеров докера Apache.Если путь "/ support *", то он идет в контейнер поддержки, в противном случае он идет в веб-приложение.В настоящее время для достижения этой цели я жестко запрограммировал подсеть для создания сетей подсети и каждого контейнера IPv4-адрес.Затем файл Apache Conf просто указывает на эти жестко закодированные ips.Это прекрасно работает для локальных сред разработки.

Однако оно не работает для промежуточных серверов, на которых необходимо разместить несколько экземпляров проекта.Я не могу раскрутить более одного экземпляра этой сети, из-за жестко закодированных адресов подсети / 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

Ответы [ 2 ]

1 голос
/ 29 марта 2019

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:.)

0 голосов
/ 29 марта 2019

По умолчанию контейнер наследует настройки DNS Docker. демон, включая / etc / hosts и /etc/resolv.conf

https://docs.docker.com/config/containers/container-networking/

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

...