Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@devneko

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

環境

  • 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
1
Help us understand the problem. What are the problem?