[英]What container interface(s) does Docker port mapping (`-p <host-port>:<container-port>`) apply to?
[英]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.