【问题标题】:Docker expose port internalsDocker 公开端口内部结构
【发布时间】:2021-09-11 01:04:17
【问题描述】:

在 Docker 中,我们都知道如何公开端口、EXPOSE 指令发布和 -p 或 -P 选项在运行时公开。当我们使用“docker inspect”或“docker port”查看端口映射时,这些配置输出被拉到/var/lib/docker/containers/container-id/config.v2.json。

我得到的问题是,当我们公开端口时,Docker 如何实际更改容器中的端口,比如 Apache 或 Nginx,说我们可以在操作系统或文件路径中的任何位置进行安装,Docker 如何找到正确的 conf 文件(Apache /etc/httpd/conf/httpd.conf) 如果我认为 Docker 在 httpd.conf 文件中的“Listen 80”或 Listen“443”行上执行此操作,则进行更改。或者我对 Docker 的全部理解都处于危险之中:)

感谢任何帮助。

【问题讨论】:

    标签: docker docker-compose dockerfile


    【解决方案1】:

    “docker”不会改变容器内部配置(或其提供的服务)的任何内容。

    您可以在三个不同的点配置端口

    1. 图像/容器中的服务本身(例如 nginx)

    2. Dockerfile 中的EXPOSE xxxx(即在构建映像时)

    3. docker run -p 80:80(或docker compose 的相应等效项)(即在容器运行时)

    这三者(原则上)相互独立。即,您可以在每个值中具有完全不同的值。但在实践中,您必须将它们相互调整才能获得一个有效的系统。

    我们知道,dockerfile 中的EXPOSE xxxx 实际上并没有在运行时发布任何端口,而只是告诉 docker 服务,该特定容器将在运行时侦听端口 xxxx。您可以将其视为该图像的一种文档。因此,作为Dockerfile 的创建者,您有责任在此处提供正确的值。因为使用该图像的任何人都可能会依赖该值。

    但是不管你有什么端口EXPOSEd(或者没有,EXPOSE 是完全可选的)你仍然必须在运行容器时发布那个端口(例如当使用docker run 通过-p aaaa:xxxx )。

    现在让我们假设您有一个 nginx 映像,其中配置了 nginx 服务以侦听端口 8000。无论您使用EXPOSE-p aaaa:xxxx 定义什么,该 nginx 服务将始终只侦听端口 8000 而什么都不侦听否则。

    因此,如果您现在使用 docker run -p 80:80 运行容器,运行时会将主机的 80 端口绑定到容器的 80 端口。但是由于容器内没有服务在端口 80 上侦听,您根本无法在端口 80 上联系您的 nginx 服务。您也将无法连接到端口 8000 上的 nginx,因为它没有尚未发布。

    因此,在典型设置中,如果容器中的服务配置为侦听端口 8000,则还应在 dockerfile 中使用 EXPOSE 8000 并使用 docker run -p aaaa:8000 将主机的端口 aaaa 绑定到端口 8000你的容器,这样你就可以通过http://hostmachine:aaaa连接到nginx服务

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 2019-03-05
      • 2018-10-07
      • 2021-11-16
      • 2015-03-17
      • 1970-01-01
      • 2020-05-23
      • 2020-11-15
      • 1970-01-01
      相关资源
      最近更新 更多