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 个东西:
- docker ps 输出中的 100-102/tcp 和 0.0.0.0:123-125:123-125/tcp 这两个符号有什么区别?
- 如果我的 -p 参数只列出 123-125:123-125/tcp,为什么我在 docker ps 中有额外的 100-102/tcp 输出?
第一个参数是容器公开的端口。它们可能暴露在用于创建图像的 Dockerfile 中。它们只是一种 specification/documentation 告诉您您应该发布这些端口。
第二个参数是您绑定到主机系统的公开端口:这些端口链接到您主机的端口,并且它们对来自任何 IP 地址 (0.0.0.0) 的外部连接开放。这些端口 已发布 (因此 -p
)
如果您的容器 运行 具有 -P
选项,它将具有 published/bound 所有公开的端口(或端口范围,在您的情况下)。使用 -p
发布端口只会公开和绑定您使用该选项指定的端口。这就是你想要的。
这里举个例子更清楚:
- 我创建了一个
Dockerfile
。在其中我公开了端口范围 3000-3002
FROM node:current-alpine
EXPOSE 3000-3002/tcp
COPY . /app
WORKDIR /app
CMD ["node", "server.js"]
- 我构建的图像:
docker build -t testing .
- 我运行一个容器:
docker run testing
这是 docker ps
的结果:
CONTAINER ID IMAGE COMMAND [...] PORTS NAMES
59b8a12a8d70 testing "docker-entrypoint.s…" [...] 3000-3002/tcp amazing_gagarin
如您所见,我没有发布任何端口,但我可以在 docker ps
的 PORTS
部分看到我公开的端口
我尝试连接到 localhost:3000
:没有任何效果 -> 端口未发布。
我用 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
我尝试连接到 localhost:3005
:它有效! -> 我发布了我的端口,将它们绑定到我的主机端口,这样我就可以连接到它们(也是因为我的应用确实监听了 3000-3007 的端口)
我尝试连接到 localhost:3000
:它仍然不起作用 -> 端口范围 3000-3002 仍未发布,但仍标记为已公开,告诉我我可能想使用这个范围。
-p
选项的格式请见Docker ref:
format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort
0.0.0.0
指定可以在主机上访问容器的 IP。 0.0.0.0
是默认值,表示所有 IP 地址(即连接到您的主机的每个人都可以通过暴露的端口 123-125 访问您的容器)。另一方面,127.0.0.1
意味着您只能从本地主机访问您的容器。
我假设附加端口可能会被您的基本映像公开(在您的 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"
使用标准命令启动 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 个东西:
- docker ps 输出中的 100-102/tcp 和 0.0.0.0:123-125:123-125/tcp 这两个符号有什么区别?
- 如果我的 -p 参数只列出 123-125:123-125/tcp,为什么我在 docker ps 中有额外的 100-102/tcp 输出?
第一个参数是容器公开的端口。它们可能暴露在用于创建图像的 Dockerfile 中。它们只是一种 specification/documentation 告诉您您应该发布这些端口。
第二个参数是您绑定到主机系统的公开端口:这些端口链接到您主机的端口,并且它们对来自任何 IP 地址 (0.0.0.0) 的外部连接开放。这些端口 已发布 (因此 -p
)
如果您的容器 运行 具有 -P
选项,它将具有 published/bound 所有公开的端口(或端口范围,在您的情况下)。使用 -p
发布端口只会公开和绑定您使用该选项指定的端口。这就是你想要的。
这里举个例子更清楚:
- 我创建了一个
Dockerfile
。在其中我公开了端口范围 3000-3002
FROM node:current-alpine
EXPOSE 3000-3002/tcp
COPY . /app
WORKDIR /app
CMD ["node", "server.js"]
- 我构建的图像:
docker build -t testing .
- 我运行一个容器:
docker run testing
这是 docker ps
的结果:
CONTAINER ID IMAGE COMMAND [...] PORTS NAMES
59b8a12a8d70 testing "docker-entrypoint.s…" [...] 3000-3002/tcp amazing_gagarin
如您所见,我没有发布任何端口,但我可以在 docker ps
PORTS
部分看到我公开的端口
我尝试连接到
localhost:3000
:没有任何效果 -> 端口未发布。我用
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
我尝试连接到
localhost:3005
:它有效! -> 我发布了我的端口,将它们绑定到我的主机端口,这样我就可以连接到它们(也是因为我的应用确实监听了 3000-3007 的端口)我尝试连接到
localhost:3000
:它仍然不起作用 -> 端口范围 3000-3002 仍未发布,但仍标记为已公开,告诉我我可能想使用这个范围。
-p
选项的格式请见Docker ref:
format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort
0.0.0.0
指定可以在主机上访问容器的 IP。0.0.0.0
是默认值,表示所有 IP 地址(即连接到您的主机的每个人都可以通过暴露的端口 123-125 访问您的容器)。另一方面,127.0.0.1
意味着您只能从本地主机访问您的容器。我假设附加端口可能会被您的基本映像公开(在您的 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"