公开和发布 Docker 端口有什么区别?

Exposed 和 Published 容器端口是 Docker 中两个不同但相关的概念。暴露的端口在 Dockerfile 中定义为简单的元数据。如果要启用外部访问,则必须在容器启动时发布它们。

暴露端口

端口通过EXPOSE镜像的 Dockerfile 中的指令公开:

EXPOSE 80

但是,公开端口不会立即产生任何影响。该语句仅表示容器内的应用程序侦听端口80。它不会向世界开放该端口或明确提供对任何其他容器的访问。

作为镜像作者,列出工作负载使用的EXPOSE端口有助于用户在启动容器时配置适当的端口转发规则。这在使用非标准端口时尤为重要:虽然可以预期 Web 服务器侦听端口 80,但用户将无法猜测自定义套接字服务器使用的端口。

当您使用 列出容器时,暴露的端口是可见的docker ps。它们将显示在PORTS列中,即使它们实际上无法在容器外访问。这为您提供了一种简单的方法来检查容器内的软件正在侦听哪些端口。

您可以使用docker inspect. 替换您图片的标签或 ID,而不是demo-image:

docker inspect --format="{{json .Config.ExposedPorts}}" demo-image

发布端口

发布端口使其可以从容器外部访问。它允许您获取通过EXPOSE指令发现的端口,然后将主机端口绑定到它。

端口与命令的-p标志一起公开docker run:

docker run -d -p 8080:80 httpd:latest

此命令将8080Docker 主机上的端口绑定到80新容器内。现在您可以访问http://localhost:8080以访问容器的端口。如果您运行docker ps,您将看到该PORTS列现在显示此映射。暴露的容器端口80已发布到主机。

-p可以在不指定要绑定到的端口的情况下使用该标志:

docker run -d -p 80 httpd:latest

此变体将容器中的端口 80 绑定到主机上的随机端口。您可以通过运行来检查已分配的端口docker ps。

-p 还支持将端口发布到特定网络接口:

docker run -d -p 127.0.0.1:8080:80 httpd:latest

这里容器端口 80 只能通过主机本地环回地址上的端口 8080 访问。这可以保护您的容器免受其他设备的网络调用。

发布所有暴露的端口

您可以使用该–publish-all标志启动一个容器,让 Docker 自动发布映像的 Dockerfile 中列出的所有公开端口:

docker run -d --publish-all httpd:latest

这会将主机上的随机空闲端口分配给容器中的每个公开端口。使用该docker ps命令查看已进行的端口分配。这简化了从需要打开多个非标准端口的映像启动新容器的过程。

您可以结合–publish-all显式-p映射。在这种情况下,由-p标志创建的映射将覆盖由 分配的随机端口–publish-all。

当您不需要发布端口时

p如果您想从 Docker 主机或物理网络上的其他设备访问它们,您只需要发布容器端口。Docker 网络是容器间流量的首选替代方法。

共享网络的容器始终可以相互通信,即使它们的端口尚未明确发布。

docker network create demo-network docker run -d --network demo-network --name web web:latest docker run -d --network demo-network --name database database:latest

在此示例中,web容器可以database使用该database:3306地址连接到运行在容器中端口 3306 上的 MySQL 服务器。Docker 会自动为网络中的容器名称设置路由表。

使用端口范围

当您需要多个可用端口时,Docker 可以公开和发布整个端口范围:

EXPOSE 8000-8100

docker run --publish-all
docker run -p 6000-6100:8000-8100

在第一种情况下,–publish-all将在您的主机上分配 100 个随机端口并将它们映射到容器的范围内。第二种形式正常地将主机范围显式绑定到容器范围。如果您使用大量端口,则性能可能会受到影响,因为iptables将为每个端口创建一个规则。

概括

公开的端口是元数据片段,用于定义容器映像内的软件侦听的端口。除非您手动发布它们,否则暴露端口的存在不会使它们可访问。从这个意义上说,动词“expose”用词不当,因为许多人认为它是一个主动动作,而实际上它是一个信息陈述。EXPOSE 应该被视为文档,而-p标志创建了一个功能性的端口映射。

Docker 确实根据EXPOSE指令提供了一些额外的行为。您可以查看容器的公开端口,docker ps而不管它们是否已发布。还有一个–publish-all标志将图像的公开端口发布到随机主机端口。

当您想从 Docker 网络外部访问容器时,您只需要发布端口。同一网络中的容器之间的通信始终不受限制,无论所涉及的端口是否已公开或发布。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mikes zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值