Ubuntu/UFW: 如何告诉Docker不要暴露所有端口?
Ubuntu/UFW: How to tell Docker not to expose all ports?
我真的在这里苦苦挣扎并在谷歌上搜索了很多...到目前为止没有解决方案。
我 运行 几个 docker 容器(nodejs、mongodb、...)在我的 Ubuntu 机器上。不幸的是,Docker (v1.6) 将所有端口暴露给 public!由于我有一个 nginx 反向代理(也在 docker 容器中),我只希望端口 80 可以从外部访问 - UFW 在这种情况下不起作用,因为 Docker 在 iptables 上运行。
所以我尝试了以下建议:
将 DOCKER_OPTS 更改为以下内容(并重新启动 docker 服务):
DOCKER_OPTS="--ip 127.0.0.1 --iptables=false"
将以下规则添加到我的 iptables(对于 nodejs 端口 3001)
iptables -I PREROUTING 1 -t mangle ! -s 127.0.0.1 -p tcp --dport 3001 -j ACCEPT
iptables -I PREROUTING 2 -t mangle -p tcp --dport 3001 -j DROP
=> 两个更改都不起作用?
是否还有其他可能对您有所帮助的建议?
简而言之:我只想将端口 80(nginx docker 容器)暴露给 public...所有其他端口(例如 3001)在未从本地主机访问时应被拒绝!
更新:
我忘了提到我用“-p 3001:3000”启动容器(例如,对于 nodejs 应用程序)。
我不希望这个端口 (3001) 可以从网络访问...但只能从其他容器或 docker 主机系统访问。
非常感谢您。
你好,
萨沙
只需从 docker run
命令行中删除 -p
。
默认情况下,容器端口可用于系统上 运行 的其他容器,而无需使用 -p
。你只需要知道目标容器的 ip 地址。例如,如果我启动一个网络服务器:
$ docker run --name web -d larsks/mini-httpd
并获取 ip 地址:
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' web
172.17.0.3
然后从主机或任何其他容器我可以运行像这样:
# curl http://172.17.0.3/
如果我不想弄乱 ip 地址,我也可以使用容器 linking。比如上面的web
容器已经是运行ning了,我可以link它到一个新的容器:
$ docker run --link web:web -it alpine sh
然后按名称访问:
/ # wget -O- http://web/
<pre>
___ _ __ __ _
|_ _| |_ \ \ / /__ _ __| | _____
| || __| \ \ /\ / / _ \| '__| |/ / __|
| || |_ \ V V / (_) | | | <\__ \_
|___|\__| \_/\_/ \___/|_| |_|\_\___(_)
</pre>
我真的在这里苦苦挣扎并在谷歌上搜索了很多...到目前为止没有解决方案。
我 运行 几个 docker 容器(nodejs、mongodb、...)在我的 Ubuntu 机器上。不幸的是,Docker (v1.6) 将所有端口暴露给 public!由于我有一个 nginx 反向代理(也在 docker 容器中),我只希望端口 80 可以从外部访问 - UFW 在这种情况下不起作用,因为 Docker 在 iptables 上运行。
所以我尝试了以下建议:
将 DOCKER_OPTS 更改为以下内容(并重新启动 docker 服务):
DOCKER_OPTS="--ip 127.0.0.1 --iptables=false"
将以下规则添加到我的 iptables(对于 nodejs 端口 3001)
iptables -I PREROUTING 1 -t mangle ! -s 127.0.0.1 -p tcp --dport 3001 -j ACCEPT iptables -I PREROUTING 2 -t mangle -p tcp --dport 3001 -j DROP
=> 两个更改都不起作用?
是否还有其他可能对您有所帮助的建议?
简而言之:我只想将端口 80(nginx docker 容器)暴露给 public...所有其他端口(例如 3001)在未从本地主机访问时应被拒绝!
更新:
我忘了提到我用“-p 3001:3000”启动容器(例如,对于 nodejs 应用程序)。
我不希望这个端口 (3001) 可以从网络访问...但只能从其他容器或 docker 主机系统访问。
非常感谢您。
你好,
萨沙
只需从 docker run
命令行中删除 -p
。
默认情况下,容器端口可用于系统上 运行 的其他容器,而无需使用 -p
。你只需要知道目标容器的 ip 地址。例如,如果我启动一个网络服务器:
$ docker run --name web -d larsks/mini-httpd
并获取 ip 地址:
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' web
172.17.0.3
然后从主机或任何其他容器我可以运行像这样:
# curl http://172.17.0.3/
如果我不想弄乱 ip 地址,我也可以使用容器 linking。比如上面的web
容器已经是运行ning了,我可以link它到一个新的容器:
$ docker run --link web:web -it alpine sh
然后按名称访问:
/ # wget -O- http://web/
<pre>
___ _ __ __ _
|_ _| |_ \ \ / /__ _ __| | _____
| || __| \ \ /\ / / _ \| '__| |/ / __|
| || |_ \ V V / (_) | | | <\__ \_
|___|\__| \_/\_/ \___/|_| |_|\_\___(_)
</pre>