Docker 仅向本地主机公开一个端口
Docker expose a port only to localhost
我想限制我的数据库访问 127.0.0.1
,所以我执行了以下命令:
docker run -it mysql:5.5 -p 127.0.0.1:3306:3306 -name db.mysql
但是我有些困惑...
这里可以看到只会转发127.0.0.1
的端口:
; docker ps
mysql:5.5 127.0.0.1:3306->3306/tcp db.mysql
有趣的是,我在 iptables 中找不到这个限制:
; iptables -L
Chain FORWARD (policy DROP)
DOCKER all -- anywhere anywhere
Chain DOCKER (2 references)
target prot opt source destination
ACCEPT tcp -- anywhere 192.168.112.2 tcp dpt:mysql
这条规则的来源是anywhere
。
传入流量将如下:
Incoming package to host's network -> use ip tables to forward to container
而且,你的限制不在 iptables 中,它在主机的网络中,你只是在 127.0.0.1
上打开 3306
绑定,而不是 0.0.0.0
,所以你当然看不到任何东西在 iptables 中。 127.0.0.1:3306:3306
表示 hostIp:hostPort:containerPort
.
你可以用netstat -oanltp | grep 3306
确认没有0.0.0.0
在那里,所以没有外国主机可以访问你的主机,因此也不能访问你的容器。
我想限制我的数据库访问 127.0.0.1
,所以我执行了以下命令:
docker run -it mysql:5.5 -p 127.0.0.1:3306:3306 -name db.mysql
但是我有些困惑...
这里可以看到只会转发127.0.0.1
的端口:
; docker ps
mysql:5.5 127.0.0.1:3306->3306/tcp db.mysql
有趣的是,我在 iptables 中找不到这个限制:
; iptables -L
Chain FORWARD (policy DROP)
DOCKER all -- anywhere anywhere
Chain DOCKER (2 references)
target prot opt source destination
ACCEPT tcp -- anywhere 192.168.112.2 tcp dpt:mysql
这条规则的来源是anywhere
。
传入流量将如下:
Incoming package to host's network -> use ip tables to forward to container
而且,你的限制不在 iptables 中,它在主机的网络中,你只是在 127.0.0.1
上打开 3306
绑定,而不是 0.0.0.0
,所以你当然看不到任何东西在 iptables 中。 127.0.0.1:3306:3306
表示 hostIp:hostPort:containerPort
.
你可以用netstat -oanltp | grep 3306
确认没有0.0.0.0
在那里,所以没有外国主机可以访问你的主机,因此也不能访问你的容器。