環境
- 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を設定しておく。
~
172.17.1.10 redis1
172.17.1.11 redis2
Nginxはこんな感じの設定。
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