LoginSignup
1
1

More than 5 years have passed since last update.

NginxのTCPロードバランサーを使ってdocker runのIPバインドで接続先の振り分けができない謎事象を無理矢理解決

Posted at

環境

  • AWS EC2
  • ネットワークインタフェースを2つもっている

最初にやりたかったこと

同一マシン上にDockerで2つのRedisインスタンスを立ち上げ、
外部から接続するときに、IPでそのどちらに接続するかを決められるようにしたい。
(Dockerを使っていなければredis-serverのバインドIPを変えるだけ済む話し)

docker runの-pで試してみる

どうやらdocker runの-pオプションでIPバインドできるらしいことがわかった。

そこで、一方のRedisインスタンスを
-p IP1:6379:6379
もう一方を
-p IP2:6379:6379
のようにして起動した。

これで解決かとおもいきや、IP2(セカンダリのプライベートIP)でredisに繋がらない。
ネットワークの知識が乏しいため、Dockerの問題なのか、AWSの問題なのかも切り分けができなかった。
(誰か同じような経験のある方がいたら教えてください・・・)

NginxのTCPロードバランサーを使って無理矢理解決

もうわけがわからなかったため、NginxのTCPロードバランサーで切り分けることにしてみた。
TCPロードバランサーはNginxの比較的最近のバージョン(1.9あたり)から入った機能で、TCPレベルでのリバースプロキシを実装できる。

準備として、/etc/hostsに予めdocker inspectで取得したコンテナのIPを設定しておく。

etc/hosts
~
172.17.1.10  redis1
172.17.1.11  redis2

Nginxはこんな感じの設定。

nginx.conf
stream {
        upstream stream_redis1 {
                server redis1:6379;
        }

        upstream stream_redis2 {
                server redis2:6379;
        }

        server {
                listen (IP1):6379;
                proxy_pass stream_redis1;
        }
        server {
                listen (IP2):6379;
                proxy_pass stream_redis2;
        }
}

これらの設定を行うとどちらのIPにも正しく接続するようにできた。
コンテナのIPが変わるたびに/etc/hostsを編集しないといけないのがダサすぎるという問題はあるものの、
とりあえずIPバインドによる接続の振り分けを実現することができた。

これで解決したということは、docker -pでうまくいかなかったのはDockerの問題である可能性が高いと思われるが
原因はさっぱりわからないままだ。

詳しい人がいたらぜひ教えてくださいm(__)m

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1