如何将 Docker 与 HAProxy+Keepalived 结合使用?

Cha*_*lie 4 high-availability haproxy failovercluster keepalived docker

我想练习在一台机器上使用多个 Docker 容器创建高可用的 Web 应用程序。

我在 Docker 容器中启动了多个 Web 服务器。比如说,三台服务器rest1rest2rest3

我将 Docker 与 HAProxy 平衡器结合使用,该平衡器绑定到服务器127.0.0.1:80并将查询路由到rest服务器。这使我可以确定,当一两台rest服务器发生故障时,我将能够进行查询127.0.0.1:80并收到正确的结果。

坏事是:当 HAProxy 关闭时,Web 应用程序也会关闭。

我想使用多个 HAProxy Docker 容器,每个容器中都带有 Keepalived 服务。问题是:我需要几个Docker容器来监听一个IP和一个PORT。例如,我将拥有haproxy1和,它将通过 Keepalivedhaproxy2绑定到。localhost

当我在 HAProxy 配置文件中设置 IP(不是当前 Docker 容器的 IP)时,它显示一个错误,HAProxy 无法侦听此 IP 和端口。

是否可以使用HAProxy和Keepalived配置多个Docker容器来监听一个IP和PORT?

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
Run Code Online (Sandbox Code Playgroud)

因错误而失败

Starting frontend http-in: cannot bind socket [172.17.0.10:80]
Run Code Online (Sandbox Code Playgroud)

172.17.0.10 是 Docker 子网的成员,在我的机器上未保留。

小智 5

您可能需要在 docker 主机上启用非本地绑定。

添加net.ipv4.ip_nonlocal_bind=1到文件末尾/etc/sysctl.conf并使用命令强制重新加载文件sudo sysctl -p