Я хочу попрактиковаться в создании высокодоступных веб-приложений с использованием нескольких контейнеров Docker на одной машине.
Я запускаю несколько веб-серверов в контейнерах Docker. Скажем, три сервера rest1
, rest2
и rest3
.
Я использую Docker с балансировщиком HAProxy, который привязан к 127.0.0.1:80
и направляет запросы в rest
серверы. Это позволяет мне быть уверенным, что когда один или два rest
серверы вышли из строя, я могу отправлять запросы 127.0.0.1:80
и получите правильные результаты.
Плохо то, что когда HAProxy не работает, веб-приложение не работает.
Я хочу использовать несколько контейнеров HAProxy Docker со службой Keepalived в каждом контейнере. Проблема в том, что мне нужно несколько контейнеров Docker для прослушивания одного IP и одного ПОРТА. Например, у меня будет haproxy1
и haproxy2
, который будет привязан к localhost
через Keepalived.
Когда я устанавливаю IP-адрес в файле конфигурации HAProxy, который не является IP-адресом текущего контейнера Docker, он показывает мне ошибку, что HAProxy не может прослушивать этот IP-адрес и ПОРТ.
Можно ли настроить несколько контейнеров Docker с HAProxy и Keepalived для прослушивания одного IP и ПОРТА?
Конфигурация HAProxy:
defaults
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
mode http
bind 172.17.0.10:80
default_backend BACKEND
backend BACKEND
option httpchk
server rest1 rest1:8080 maxconn 32 check
server rest2 rest2:8080 maxconn 32 check
server rest3 rest3:8080 maxconn 32 check
выходит из строя с ошибкой
Starting frontend http-in: cannot bind socket [172.17.0.10:80]
172.17.0.10 является членом подсети Docker и не зарезервирован на моей машине.
Возможно, вам потребуется включить нелокальную привязку на хосте докеров.
Добавить net.ipv4.ip_nonlocal_bind=1
до конца /etc/sysctl.conf
файл и принудительно перезагрузите файл с sudo sysctl -p
команда.