gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:27:50 28 4
gpt4 key购买 nike

我找不到这个记录。假设我想将一个端口发布到一个已知的地方,但有时会发布所有其他“暴露”的端口以进行调试或测试。

一个简单的 Dockerfile

FROM alpine
CMD /bin/sleep 600

--publish/-p 允许我将特定主机端口绑定(bind)到容器端口。 --publish-all/-P 将所有容器端口绑定(bind)到随机端口,可以使用例如 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

最佳答案

正是这样做的行为似乎是“如预期的那样”。显式端口绑定(bind)优先于 --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

显式请求端口绑定(bind)发生,其他端口绑定(bind)到操作系统分配的未使用端口。

它还向我澄清了一些我不明白的事情。我总是忽略“EXPOSE”,因为文档基本上说它实际上除了作为文档之外没有做任何事情,并且要真正“公开”一个端口,你应该明确地发布它。但是 --publish-all确实使用暴露的端口。我一直天真地认为通过做 --publish-all它会发布我启动的进程正在监听的所有端口,但这些端口在容器已经初始化后打开。

关于docker - docker run "--publish"和 "--publish-all"之间的交互是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57056217/

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