【问题标题】: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”不会改变容器内部配置(或其提供的服务)的任何内容。
您可以在三个不同的点配置端口
-
图像/容器中的服务本身(例如 nginx)
-
Dockerfile 中的EXPOSE xxxx(即在构建映像时)
-
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服务