#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 предоставляет вам сеть. Вы должны внести два изменения:
- В вашей конфигурации Apache замените явные IP-адреса на имя соответствующего сервисного блока в
docker-compose.yml
:http://support/support
, например. - Удалите все
networks:
иcontainer_name:
настройки вdocker-compose.yml
, поскольку они избыточны и ограничивают повторное использование файла. (Docker назначит вам IP-адреса, а Docker Compose выберет имена контейнеров, но в этих значениях по умолчанию нет ничего плохого.)
(Многие вопросы этой формы также используют устаревшую links:
функциональность; также безопасно удалять все links:
блоки.)
Комментарии:
1. Спасибо, я проведу некоторое тестирование с этим позже. Не уверен, почему я не подумал об этом раньше, учитывая, что я делаю это с моими данными о подключении к базе данных
2. Отвечает на мой первоначальный вопрос, поэтому я отмечу его как принятый, однако из-за моего использования extra_hosts: это не сработало, поскольку я не смог успешно изменить использование этого ip на «loadbalancer»
3. Заменил extra_hosts на external_links, и по какой-то причине это работает так же хорошо. Надеюсь, это кому-то поможет