dockerfile 中的 EXPOSE 和服务 YAML 中的 TARGETPORT 与 Pod 中实际运行的端口有什么关系?
在我的 dockerfile 中
expose 8080
Run Code Online (Sandbox Code Playgroud)
在我的部署中
ports:
- containerPort: 8080
Run Code Online (Sandbox Code Playgroud)
在我的服务
apiVersion: v1
kind: Service
metadata:
name: xtys-web-admin
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
selector:
app: xtys-web-admin
Run Code Online (Sandbox Code Playgroud)
在我的豆荚里
kubectl exec xtys-web-admin-7b79647c8d-n6rhk -- ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 *:8332 *:*
Run Code Online (Sandbox Code Playgroud)
因此,在 pod 中实际运行 8332(来自某个配置文件)。我的问题是它如何仍然有效?它有效,但我怀疑它,有人可以澄清它吗?
BMi*_*tch 12
在 Dockerfile 中,EXPOSE
是图像创建者向运行图像的人提供的有关他们如何配置图像的文档。它在您可以检查的图像中设置元数据,但不会影响 docker 如何配置容器之间的网络。(很多人会混淆在主机上发布端口,这与公开端口非常不同。在 docker 中发布端口实际上是创建了一个映射,允许外部访问容器。)
的值containerPort
是运行时等效EXPOSE
于公开未在映像中指定的端口。同样,这只是文档,但可以被其他工具使用,这些工具检查正在运行的图像以进行自我配置。如果您没有指定要连接的端口,我主要看到反向代理默认使用暴露的端口。
有人可以将图像配置为侦听与在他们的EXPOSE
. 例如,nginx 映像将记录它使用默认配置侦听端口 80,但您可以提供自己的nginx.conf
文件并重新配置它以侦听容器内的端口 8080(例如,如果您不想以 root 身份运行 nginx )。
现在对于服务端:
targetPort
Kubernetes 服务中的值需要引用正在运行的容器实际侦听的端口。通常,这与公开的端口相同,但如果您像上面的示例一样重新配置应用程序,您将设置targetPort
为 8080 而不是 80。
port
Kubernetes 服务中的值是服务本身侦听的端口。对于容器间的通信,需要连接到这个端口上,通常会和 相同,targetPort
以减少混淆。
最后,nodePort
Kubernetes 服务中的值是在节点上发布的端口,供您从外部访问容器。默认情况下,这在从 30000 开始的临时端口范围内。
由于明显的安全原因,Docker 默认不公开任何端口。因此,默认情况下您无法访问在 docker 容器中运行的任何应用程序。
通过在 Docker 中公开端口,您可以让用户(将使用您的图像的任何人)能够通过公开端口访问您的应用程序。
假设您使用运行在端口 8080 上的应用程序和运行在端口 3306 上的 MySQL 数据库构建 docker 映像。您不希望任何用户直接访问 MySQL 数据库。因此,您只会暴露端口 8080。
然后,用户可以通过以下方式将本地端口映射到公开端口 docker run -p 80:8080 your-image:tag
这会将本地端口 80 映射到容器的端口 8080(您的应用程序在其上运行。)。因此,对 localhost:80 (localhost) 发出的任何请求都将提供来自您的应用程序的数据。
当您在 deployment.yaml 文件中使用 port 和 targerPort 时,它的作用与上述命令(docker run)相同。
当您使用 port 和 targetPort 时,它将转发service:port
到container:targetPort
.
请查看Docker 文档以了解端口转发。
这个Connect 应用程序与服务可能是一个很好的阅读资源。
PS:我认为,使用type: NodePort
.
哈。
归档时间: |
|
查看次数: |
2834 次 |
最近记录: |