Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

環境

  • 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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした