在安装了 docker 的机器上,我正在执行sudo iptables -L
,并得到:
root@dockertest:~# iptables -nvL
Chain INPUT (policy ACCEPT 8364 packets, 729K bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 7868 packets, 515K bytes)
pkts bytes target prot opt in out source destination
Chain DOCKER (1 references)
pkts bytes target prot opt in out source destination
我在这里看到的是我机器的正确 ipTables 吗?或者如何编辑物理机 iptables?
我想让 22000 从外部通过,目前它似乎被关闭了:
nmap -sV -p 22000 1.2.3.4
Host is up (0.038s latency).
PORT STATE SERVICE VERSION
22000/tcp closed unknown
Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 0.73 seconds
上面不是和iptable矛盾吗?
总结我需要将 22000 转发到 Docker 容器。本质上,来自外部世界的客户端必须通过物理机的 iptables,然后通过 Docker 正在运行的任何防火墙
答案1
Docker 不是“运行防火墙”它本身使用主机 iptables 并且其规则绑定到 docker 桥接接口(docker0
默认)。
当你想将主机的端口转发到docker容器时,你不需要编辑iptables规则,docker run
提供选择 -p hostPort:containerPort
执行此操作并将自行处理所有 iptables 规则。
集装箱港口必须在 Dockerfile 中暴露给 Docker Bridge。
例如,假设您要运行一个 nginx 容器并将其端口 80 公开到主机的端口 20000,那么您将运行:
docker run -d -p 20000:80 nginx:latest