我想运行一个 Docker 容器,该容器仅在所述主机上的 Docker 实例内部公开其端口。这意味着我不希望它公开。
如何从命令行执行此操作?下面的代码将其公开打开。
docker run -p 27017:27017 --name mongo mongo
答案1
如果你执行:
docker run -p 27017:27017 --name mongo mongo
然后docker将其解释为:
docker run -p 0.0.0.0:27017:27017 --name mongo mongo
这意味着该端口可从主机访问,也可从外部访问。
您可以通过从另一台机器运行nmap -p 27017 <host IP>
您的主机来验证这一点。端口 27017 应显示为“打开”。
如果你执行:
docker run -p 127.0.0.1:27017:27017 --name mongo mongo
那么该端口只能从主机访问。
您可以通过从另一台机器运行nmap -p 27017 <host IP>
您的主机来验证这一点。端口 27017 应显示为“已关闭”。
最后,如果你执行:
docker run --name mongo mongo
那么所有端口对于容器来说都将是本地的。
再次,您可以通过nmap
在主机上运行容器来验证这一点:nmap -p 27017 <container IP>
。端口 27017 应显示为“已关闭”。
答案2
--expose
Docker 命令的 -tag应该run
能提供你想要的内容。从文档:
发布或公开端口(-p,--expose)
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
这会将容器的端口 8080 绑定到主机 127.0.0.1 上的 TCP 端口 80。您还可以指定 udp 和 sctp 端口。Docker 用户指南详细说明了如何在 Docker 中操作端口。
$ docker run --expose 80 ubuntu bash
这会公开容器的 80 端口,而无需将该端口发布到主机系统的接口。
当您为容器公开端口时,它只能在容器的网络内访问(bridge
默认情况下)。这对于在网络中运行多个容器并让它们进行通信非常有用,而无需向外部发布它们的端口(例如出于安全原因)。
答案3
如果你跑
docker run --name mongo mongo
其他容器将能够访问 mongo,但前提是它们知道 mongo 容器的 ip,而不允许主机外部访问
以下内容还将阻止主机外的机器访问 mongo
docker run -p 127.0.0.1:27017:27017 --name mongo mongo
如果其他容器知道 IP,它们仍然可以访问它