【问题标题】:Docker port exposed to outside world对外暴露的 Docker 端口
【发布时间】:2025-07-02 17:20:01
【问题描述】:

我已经在一个在互联网上公开可用的虚拟机中安装了 docker。我已经在 VM 的 docker 容器中安装了 mongodb。Mongodb 正在侦听27017 端口。 我已经使用以下步骤安装了

 docker run -p 27017:27017 --name da-mongo -v ~/mongo-data:/data/db -d mongo 

使用-p 标志将来自容器的端口重定向到主机。但是端口27017 暴露在互联网上。我不希望它发生。

有什么办法可以解决吗?

【问题讨论】:

    标签: docker networking network-programming dockerfile


    【解决方案1】:

    好吧,如果您希望它可用于某些主机,那么您需要防火墙。但是,如果您只需要它在 localhost(您的 VM 机器)上工作,那么您不需要将端口与主机公开/绑定。我建议你在没有 -p 选项的情况下运行容器,然后运行以下命令:

    docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' your_container_id_or_name
    

    之后,它会显示一个 IP,它是您刚刚运行的容器的 IP(是的,docker 使用某种内部虚拟网络连接您的容器和它们之间的主机)。

    之后,您可以使用 IP 和端口组合连接到它,例如:

    172.17.0.2:27017
    

    【讨论】:

    • 如果我将 IP 硬编码到应用程序逻辑中,如果容器停止并再次启动,IP 会保持不变吗?
    • 是的,容器运行时,只要不删除,IP就保持不变。或者,你也可以编辑你的主机文件并为你的容器 IP 添加一个名称,然后你只需要使用它的给定名称而不是它的 IP,如果以后发生变化,那么你只需要修改你的主机文件
    【解决方案2】:

    发布端口时,您可以选择要在哪个主机接口上发布:

    docker run -p 127.0.0.1:27017:27017 --name da-mongo \
      -v ~/mongo-data:/data/db -d mongo 
    

    这会将容器端口 27017 发布到主机接口 127.0.0.1 端口 27017。您只能将接口添加到主机端口,容器本身仍然必须绑定到 0.0.0.0。

    【讨论】: