gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:47:47 29 4
gpt4 key购买 nike

操作系统: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服务器的端口暴露给公网,即使你可以给一个 super 长的密码,潜在的安全隐患仍然存在。

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

然后我尝试使用 IP 表映射而不是创建 docker 映射,由于 iptables 的灵 active ,理论上它允许双方都受益 -- 从世界其他任何地方(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 -idt --link redis -p 6379:6379 alpine/socat TCP4-LISTEN:6379,fork,reuseaddr TCP4:redis:6379

上面的容器会使用--link redis 来解析你的redis container的名称,当收到主机6379的流量时,会先转发到assistant容器的6379,然后会使用socat将流量转发到redis容器的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

关于linux - 是否可以在 Linux 上通过 iptables 将端口映射分配给现有的 Docker 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56923950/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com