通过使用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