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 上运行。

所以我尝试了以下建议:

  1. 将 DOCKER_OPTS 更改为以下内容(并重新启动 docker 服务):

    DOCKER_OPTS="--ip 127.0.0.1 --iptables=false"
    
  2. 将以下规则添加到我的 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>