通过使用Nginx的TCP负载均衡器,强制解决了无法通过docker run的IP绑定实现连接目标的分配的神秘问题

环境

    • AWS EC2

 

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

最初想要做的事情

希望在同一台机器上使用Docker启动两个Redis实例,以便在外部连接时可以根据IP来决定要连接的是哪个实例。(如果不使用Docker,只需更改redis-server的绑定IP即可)。

尝试使用Docker运行命令中的”-p”参数进行测试。

看起来我了解到通过docker run命令的-p选项可以进行IP绑定。

因此,我們啟動了一個Redis實例,使用以下方式:
-p IP1:6379:6379的參數設置,
同時啟動了第二個Redis實例,使用以下方式:
-p IP2:6379:6379的參數設置。

想以此解決,但是在IP2(次要私人IP)上无法连接到redis。
由于网络知识有限,无法确定是Docker的问题还是AWS的问题。
(如果有人有类似经验,请告诉我…)

使用Nginx的TCP负载均衡器以强行解决。

因为已经不知道什么原因了,所以试着在Nginx的TCP负载均衡器中进行分流。
TCP负载均衡器是从Nginx相对较新的版本(大约是1.9版本)开始引入的功能,可以在TCP层面上实现反向代理。

作为准备,可以事先将通过docker inspect获取的容器IP设置在/etc/hosts中。

~
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

广告
将在 10 秒后关闭
bannerAds