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



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

最近,我正在构建一个应用程序,依赖于Redis(Docker(提供的数据服务。创建新的REDIS服务的一种习惯方法是这样的:

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

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

但是,这种方法将Redis服务器的端口暴露到公共网络,即使您可以提供晚餐长密码,仍然存在安全隐患。

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

然后,我正在尝试使用IP表映射而不是创建Docker地图,这是由于Iptables的灵活性,从理论上讲,它允许双方受益 - 来自世界其他任何地方(外面ZZ(的Uoload文件,但也可以关闭此

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?(

谢谢!

我建议使用助手容器,在此容器中为您的服务容器添加端口,该容器不做端口映射:

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

上面的容器将使用--link redis,以便可以解决您的redis container的名称,并且当收到主机6379的流量时,它将首先转发到Assistant Container的6379,然后将使用socat将流量转发到redis container'S 6379,尽管您的服务容器没有端口映射6379。

由于 --link被弃用,您也可以按照自己的方式自定义网络:

docker network create my_network
docker network connect my_network redis
docker run -idt --network my_network -p 6379:6379 alpine/socat TCP4-LISTEN:6379,fork,reuseaddr TCP4:redis:6379

最新更新