【发布时间】:2019-11-17 07:42:33
【问题描述】:
操作系统: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 ,那么通过地址访问 Redis 应该没问题:201.201.201.201:6379。
但是这种方法将redis服务器的端口暴露给公网,即使你可以提供超长的密码,潜在的安全隐患仍然存在。
由于 docker 不支持在运行的容器中更改端口映射,我需要关闭整个 docker 服务,这需要很长时间,几乎是不可能的。
然后我尝试使用 IP 表映射而不是创建 docker 映射,由于 iptables 的灵活性,理论上它可以让双方受益——从世界其他任何地方(外部 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?)
谢谢!
【问题讨论】:
-
您可以使用
docker run -p 127.0.0.1:6379:6379 redis使其只能从同一物理主机访问,或者完全放弃-p选项以使其只能从其他Docker 容器访问(您可能需要@987654325 @ 并在同一个--net上运行所有容器。这确实需要删除并重新创建您的容器。如果很长的启动时间是个问题,我建议单独解决这个问题。
标签: linux docker networking redis iptables