1台のマシンで複数のDockerコンテナーを使用して高可用性Webアプリケーションの作成を練習したいと思います。
Dockerコンテナー内でいくつかのWebサーバーを起動します。たとえば、rest1
、rest2
、rest3
の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コンテナーが必要なことです。たとえば、haproxy1
とhaproxy2
があり、これらは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サブネットワークのメンバーであり、私のマシンでは予約されていません。
Dockerホストで非ローカルバインディングを有効にする必要がある場合があります。
追加 net.ipv4.ip_nonlocal_bind=1
の最後まで/etc/sysctl.conf
ファイルを作成し、Sudo sysctl -p
コマンド。