是否可以通过Linux上的iptables将端口映射分配给现有Docker容器?

时间:2019-07-07 16:17:05

标签: linux docker networking redis iptables

操作系统:ubuntu 16.04 LTS,这是我的问题。

最近,我正在构建依赖Redis(Docker)提供的数据服务的应用程序。创建新Redis服务的惯用方式如下:

docker pull redis:latest
docker run -d --name redis -p 6379:6379 redis:latest

假设我的WAN IP是201.201.201.201,那么就可以通过地址:201.201.201.201:6379访问Redis。

尽管这种方法将Redis服务器的端口暴露给公共网络,即使您可以给超级长密码设置密码,仍然存在潜在的安全隐患。

由于docker不支持在运行中的容器中更改端口映射,因此我需要关闭整个docker服务,这需要很长时间,几乎是不可能的。

然后,由于iptables的灵活性,我试图使用IP表映射而不是创建docker map,从理论上讲,它允许双方受益-从世界上其他任何地方(从zz边)加载文件,但也可以关闭

iptables -t nat -A PREROUTING -d 172.245.210.199 -p tcp --dport 6379 -j DNAT --to-destination 172.17.0.5:6379
iptables -t nat -A POSTROUTING -d 172.17.0.5 -p tcp --dport 6379 -j SNAT --to 172.17.0.1

但是它不起作用,我无法ping容器17.17.0.162 有谁知道解决方法,或者可以提出其他方法来实现此端口映射(例如nginx或caddy?)

谢谢!

1 个答案:

答案 0 :(得分:0)

我建议使用辅助容器,在此容器中为未进行端口映射的服务容器添加端口转发:

docker run -idt --link redis -p 6379:6379 alpine/socat TCP4-LISTEN:6379,fork,reuseaddr TCP4:redis:6379

上面的容器将使用--link redis,以便它可以解析您的redis container的名称,并且在收到主机6379的流量时,它将首先转发到辅助容器的6379,然后将使用{{1 }}将流量转发到socat的6379,因此尽管您的服务容器没有端口映射6379,它仍然可以工作。

redis container起已弃用,您还可以根据需要自定义网络:

--link