web-dev-qa-db-ja.com

HAProxy + KeepalivedでDockerを使用する方法

1台のマシンで複数のDockerコンテナーを使用して高可用性Webアプリケーションの作成を練習したいと思います。

Dockerコンテナー内でいくつかのWebサーバーを起動します。たとえば、rest1rest2rest3の3つのサーバーがあるとします。

私は127.0.0.1:80にバインドされ、クエリをrestサーバーにルーティングするHAProxyバランサーでDockerを使用しています。これにより、1つまたは2つのrestサーバーに障害が発生したときに、127.0.0.1:80にクエリを実行して正しい結果を受け取ることができるようになります。

悪い点は、HAProxyがダウンすると、Webアプリケーションがダウンすることです。

複数のHAProxy Dockerコンテナーを、各コンテナーでKeepalivedサービスと共に使用したいと思います。問題は、1つのIPと1つのポートをリッスンするために複数のDockerコンテナーが必要なことです。たとえば、haproxy1haproxy2があり、これらはKeepalivedを介してlocalhostにバインドされます。

現在のDockerコンテナーのIPではないHAProxy構成ファイルでIPを設定すると、HAProxyがこのIPとポートをリッスンできないというエラーが表示されます。

HAProxyとKeepalivedを使用して複数のDockerコンテナーを構成し、1つの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サブネットワークのメンバーであり、私のマシンでは予約されていません。

3
Charlie

Dockerホストで非ローカルバインディングを有効にする必要がある場合があります。

追加 net.ipv4.ip_nonlocal_bind=1の最後まで/etc/sysctl.confファイルを作成し、Sudo sysctl -pコマンド。

2
Dave