我找不到这个文档。假设我想要将一个端口发布到一个已知的位置,但有时会发布所有其他“公开”的端口以进行调试或测试。
一个简单的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发布于 2019-07-16 19:27:44
这样做,行为似乎是“如预期的”。显式端口绑定优先于--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,它将发布我启动的进程正在侦听的所有端口,但这些端口是在容器初始化后打开的。
https://stackoverflow.com/questions/57056217
复制相似问题