gpt4 book ai didi

Ubuntu/UFW : How to tell Docker not to expose all ports?

转载 作者:行者123 更新时间:2023-12-02 18:17:15 25 4
gpt4 key购买 nike

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

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

    更新:

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

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

    非常感谢您提前。

    问候,

    萨沙

    最佳答案

    只需删除 -p来自您的docker run命令行。

    默认情况下,容器端口将可供系统上运行的其他容器使用,而无需使用 -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>

    关于Ubuntu/UFW : How to tell Docker not to expose all ports?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30035206/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com