如何将 Docker 与 HAProxy+Keepalived 一起使用?

如何将 Docker 与 HAProxy+Keepalived 一起使用?

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

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

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

糟糕的是:当 HAProxy 关闭时,Web 应用程序也会关闭。

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

当我在 HAProxy 配置文件中设置 IP(该 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

出现错误

Starting frontend http-in: cannot bind socket [172.17.0.10:80]

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

答案1

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

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

相关内容