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

Mar*_*vin 5 docker

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

\n\n

一个简单的 Dockerfile

\n\n
FROM alpine\nCMD /bin/sleep 600\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
$ docker build -t foo .\n<build prints>\n$ docker run -d -p 8000:8000 -P -p 9000:9000 foo\n<some id prints>\n$ docker ps --format \'{{.Command}} {{.Ports}}\'\n"/bin/sh -c \'/bin/sl\xe2\x80\xa6" 0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
FROM alpine\nEXPOSE 8000\n# Various management ports or something\nEXPOSE 8005\nEXPOSE 8443\nEXPOSE 8009\nCMD /bin/sleep 600\n
Run Code Online (Sandbox Code Playgroud)\n\n

定义的行为是什么

\n\n
$ docker run -d -P -p 8000:8000 foo\n
Run Code Online (Sandbox Code Playgroud)\n

Mar*_*vin 3

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

\n\n
$ docker ps --format \'{{.Command}} {{.Ports}}\'\n"/bin/sh -c \'/bin/sl\xe2\x80\xa6" 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n