Docker:123-125/tcp 和 0.0.0.0:123-125->123-125/tcp 符号之间的 docker ps 输出有何不同?

Docker: what is the difference in docker ps output between 123-125/tcp and 0.0.0.0:123-125->123-125/tcp notations?

使用标准命令启动 docker 容器后...

docker run -p 123-125:123-125 -it <container_name> "bin/bash" 

...并用 CTRL-P + CTRL-Q 退出,我注意到突然在 docker ps[=27 的端口列中看到 2 个块=] 输出:

100-102/tcp, 0.0.0.0:123-125:123-125/tcp

我从来没有为我的容器设置 100-102 端口。

我无法得到 2 个东西:

  1. docker ps 输出中的 100-102/tcp 和 0.0.0.0:123-125:123-125/tcp 这两个符号有什么区别?
  2. 如果我的 -p 参数只列出 123-125:123-125/tcp,为什么我在 docker ps 中有额外的 100-102/tcp 输出?

第一个参数是容器公开的端口。它们可能暴露在用于创建图像的 Dockerfile 中。它们只是一种 specification/documentation 告诉您您应该发布这些端口。

第二个参数是您绑定到主机系统的公开端口:这些端口链接到您主机的端口,并且它们对来自任何 IP 地址 (0.0.0.0) 的外部连接开放。这些端口 已发布 (因此 -p

如果您的容器 运行 具有 -P 选项,它将具有 published/bound 所有公开的端口(或端口范围,在您的情况下)。使用 -p 发布端口只会公开和绑定您使用该选项指定的端口。这就是你想要的。

这里举个例子更清楚:

  1. 我创建了一个Dockerfile。在其中我公开了端口范围 3000-3002
FROM node:current-alpine

EXPOSE 3000-3002/tcp

COPY . /app

WORKDIR /app

CMD ["node", "server.js"]

  1. 我构建的图像:docker build -t testing .
  2. 我运行一个容器:docker run testing

这是 docker ps 的结果:

CONTAINER ID   IMAGE     COMMAND                 [...] PORTS           NAMES
59b8a12a8d70   testing   "docker-entrypoint.s…"  [...] 3000-3002/tcp   amazing_gagarin

如您所见,我没有发布任何端口,但我可以在 docker ps

PORTS 部分看到我公开的端口
  1. 我尝试连接到 localhost:3000:没有任何效果 -> 端口未发布。

  2. 我用 docker run -p 3005-3007:3005-3007 testing 启动另一个容器。

这是 docker ps 的结果:

CONTAINER ID   IMAGE     COMMAND                 [...] PORTS                                             NAMES
d55dd52d94a3   testing   "docker-entrypoint.s…"  [...] 3000-3002/tcp, 0.0.0.0:3005-3007->3005-3007/tcp   agitated_boyd
  1. 我尝试连接到 localhost:3005:它有效! -> 我发布了我的端口,将它们绑定到我的主机端口,这样我就可以连接到它们(也是因为我的应用确实监听了 3000-3007 的端口)

  2. 我尝试连接到 localhost:3000:它仍然不起作用 -> 端口范围 3000-3002 仍未发布,但仍标记为已公开,告诉我我可能想使用这个范围。

-p选项的格式请见Docker ref
format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort

  1. 0.0.0.0 指定可以在主机上访问容器的 IP。 0.0.0.0 是默认值,表示所有 IP 地址(即连接到您的主机的每个人都可以通过暴露的端口 123-125 访问您的容器)。另一方面,127.0.0.1 意味着您只能从本地主机访问您的容器。

  2. 我假设附加端口可能会被您的基本映像公开(在您的 Dockerfile 中的 FROM 中定义)。

顺便说一句,我不确定您使用三个冒号的语法 0.0.0.0:123-125:123:125 是否正确。

发布选项 (-p) 不遵循任何允许的格式:

ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort

给定的 运行 命令有 3 个冒号 - 但第一部分不是 IP。所以,我认为 Docker 没有很好地执行您的命令。

正确的运行命令,如果要将容器端口123..125匹配到对应的主机portsm是:

docker run -p 123-125:123-125 -it <container_name> "bin/bash"