簡體   English   中英

是否可以通過 Linux 上的 iptables 將端口映射分配給現有的 Docker 容器?

[英]Is it possible to assign port mapping to an existing Docker container by iptables on Linux?

操作系統: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 之外)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的流量時,它會先轉發到輔助容器的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM