【问题标题】:Ubuntu/UFW: How to tell Docker not to expose all ports?Ubuntu/UFW:如何告诉 Docker 不要公开所有端口?
【发布时间】:2015-07-14 03:19:18
【问题描述】:

我在这里真的很挣扎,用谷歌搜索了很多......到目前为止没有任何解决方案。

我在我的 Ubuntu 机器上运行了几个 docker 容器(nodejs、mongodb、...)。不幸的是,Docker (v1.6) 将所有端口公开!由于我有一个 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 容器)公开...所有其他(例如 3001)在不从 localhost 访问时都应该被拒绝!

更新:

我忘了提到我用“-p 3001:3000”启动容器(例如,对于 nodejs 应用程序)。

我不希望此端口 (3001) 可从网络访问...但只能从其他容器或 docker 主机系统访问)。

非常感谢您。

问候,

萨沙

【问题讨论】:

  • "Docker (v1.6) 公开所有端口": docker 默认不公开任何端口。
  • 除非你用--net="host"启动你的容器
  • 感谢您的 cmets...您是对的...默认情况下它不公开任何内容...但是当我使用 -p 3001:3000 启动它时,它会公开端口 3001。 ..我找不到拒绝任何外部请求的方法。

标签: ubuntu nginx docker port iptables


【解决方案1】:

只需从您的docker run 命令行中删除-p

默认情况下,容器端口将可供系统上运行的其他容器使用,而无需使用-p。您只需要知道目标容器的 ip 地址。例如,如果我启动一个 Web 服务器:

$ 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 地址,我也可以使用容器链接。例如,如果上面的web 容器已经在运行,我可以将它链接到一个新容器:

$ docker run --link web:web -it alpine sh

然后按名称访问它:

/ # wget -O- http://web/
<pre>
 ___ _    __        __         _          
|_ _| |_  \ \      / /__  _ __| | _____   
 | || __|  \ \ /\ / / _ \| '__| |/ / __|  
 | || |_    \ V  V / (_) | |  |   <\__ \_ 
|___|\__|    \_/\_/ \___/|_|  |_|\_\___(_)

</pre>

【讨论】:

  • 通过“-p”在不指定端口的情况下链接解决了...非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 2019-03-05
  • 1970-01-01
  • 2019-12-22
相关资源
最近更新 更多