【问题标题】:Is it possible to assign port mapping to an existing Docker container by iptables on Linux?是否可以通过 Linux 上的 iptables 将端口映射分配给现有的 Docker 容器?
【发布时间】: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


【解决方案1】:

我的建议是使用一个辅助容器,在这个容器中为你没有做端口映射的服务容器添加端口转发:

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

上面的容器会使用--link redis,所以它可以解析你的redis container的名字,当收到来自主机6379的流量时,它会先转发到助手容器的6379,然后再使用socat转发流量到redis container的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

【讨论】:

  • 请注意--link 已被弃用,最好使用networks 代替
猜你喜欢
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 2016-10-08
  • 1970-01-01
  • 2015-02-15
相关资源
最近更新 更多