我想练习在一台机器上使用多个 Docker 容器创建高可用性 Web 应用程序。
我在 Docker 容器内启动了多个 Web 服务器。比如说,三台服务器rest1
,rest2
和rest3
。
我使用带有 HAProxy 平衡器的 Docker,它绑定到服务器127.0.0.1:80
并将查询路由到rest
服务器。这样,我可以确保当一台或两台rest
服务器发生故障时,我能够进行查询127.0.0.1:80
并收到正确的结果。
糟糕的是:当 HAProxy 关闭时,Web 应用程序也会关闭。
我想使用多个 HAProxy Docker 容器,每个容器中都有 Keepalived 服务。问题是:我需要几个 Docker 容器来监听一个 IP 和一个 PORT。例如,我将拥有haproxy1
和haproxy2
,它们将通过 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
。