Назад | Перейти на главную страницу

Как использовать Docker с HAProxy + Keepalived?

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