我的虚拟机上运行着多个Docker容器。
其中一个使用HTTP服务器(django / python)公开了8000
端口。另一方面,已安装nginx,它监听80
端口并将代理传递给8000:
proxy_pass http://127.0.0.1:8000
它完美地工作。但是,如果我直接从浏览器连接到8000端口,例如:
http://example.com:8000/
它返回我来自内部docker处理程序的响应。
如何关闭8000端口而不损坏所有内容?
我尝试使用iptables
实用程序执行此操作,但似乎docker创建了很多自己的规则,并且我不是否要创建一个普通规则而不损害这些docker规则:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
DOCKER-USER all -- anywhere anywhere
DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER (2 references)
target prot opt source destination
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target prot opt source destination
DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere
DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-ISOLATION-STAGE-2 (2 references)
target prot opt source destination
DROP all -- anywhere anywhere
DROP all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
计划这样做:
iptables -A INPUT -p tcp --dport 8000 -j REJECT
可以吗?
答案 0 :(得分:0)
只有通过docker run -p
选项(或Docker Compose ports:
选项)明确发布的端口才能从其他主机访问。您无需仅在容器之间进行通信就可以使用此选项。同一Docker内部网络上的两个容器可以使用彼此的容器名称作为主机名以及容器内部端口进行通信,而无需任何“发布”或“公开”选项。
简而言之,从您的后端容器中删除-p
选项,它将无法从脱离主机直接访问。您无需手动更改iptables
规则。