docker run "--publish" 和 "--publish-all" 之间的交互是什么?



我找不到这个记录。 假设我想将一个端口发布到已知位置,但有时发布所有其他"公开"端口以进行调试或测试。

一个简单的 Dockerfile

FROM alpine
CMD /bin/sleep 600
--

publish/-p 允许我将特定的主机端口绑定到容器端口。 --publish-all/-P 将所有容器端口绑定到随机端口,例如可以使用 docker ps 找到随机端口。

$ docker build -t foo .
<build prints>
$ docker run -d -p 8000:8000 -P -p 9000:9000 foo
<some id prints>
$ docker ps --format '{{.Command}} {{.Ports}}'
"/bin/sh -c '/bin/sl…" 0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp

但是假设我有一个这样的 Dockerfile,并将一个端口发布到已知端口,其余端口发布到随机分配的端口。

FROM alpine
EXPOSE 8000
# Various management ports or something
EXPOSE 8005
EXPOSE 8443
EXPOSE 8009
CMD /bin/sleep 600

定义的行为是什么

$ docker run -d -P -p 8000:8000 foo

正是这样做的行为似乎是"如预期的那样"。 显式端口绑定优先于--publish-all,与标志发生的位置无关。 在上面的示例中,结果为

$ docker ps --format '{{.Command}} {{.Ports}}'
"/bin/sh -c '/bin/sl…" 0.0.0.0:8000->8000/tcp, 0.0.0.0:32792->8005/tcp, 0.0.0.0:32791->8009/tcp, 0.0.0.0:32790->8443/tcp

发生显式请求的端口绑定,其他端口绑定到 OS 分配的未使用端口。

它也向我澄清了一些我不明白的事情。 我一直忽略了"EXPOSE",因为文档基本上说它实际上除了作为文档之外什么都不做,并且要实际"公开"端口,您应该明确发布它。 但--publish-all确实使用暴露的端口。 我一直天真地认为,通过执行--publish-all它会发布我启动的进程正在侦听的所有端口,但这些端口在容器初始化后打开。

最新更新