dockerfile 中的 EXPOSE 和服务 YAML 中的 TARGETPORT 与 Pod 中实际运行的端口有什么关系?

adr*_*ing 4 kubernetes

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 )。


现在对于服务端:

targetPortKubernetes 服务中的值需要引用正在运行的容器实际侦听的端口。通常,这与公开的端口相同,但如果您像上面的示例一样重新配置应用程序,您将设置targetPort为 8080 而不是 80。

portKubernetes 服务中的值是服务本身侦听的端口。对于容器间的通信,需要连接到这个端口上,通常会和 相同,targetPort以减少混淆。

最后,nodePortKubernetes 服务中的值是在节点上发布的端口,供您从外部访问容器。默认情况下,这在从 30000 开始的临时端口范围内。


Nir*_*rav 5

由于明显的安全原因,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:portcontainer:targetPort.

请查看Docker 文档以了解端口转发。

这个Connect 应用程序与服务可能是一个很好的阅读资源。

PS:我认为,使用type: NodePort.

一个很好的阅读资源

哈。

  • 但我们要明确的是,不要在同一个容器中使用您的应用程序和 MySQL 构建 docker 镜像。 (2认同)