【问题标题】:Does docker EXPOSE refer to the container port or the host port?docker EXPOSE 是指容器端口还是主机端口?
【发布时间】:2019-01-28 22:45:27
【问题描述】:
Dockerfile 命令EXPOSE 和docker run 参数--expose 告诉docker 必须公开端口。
使用-p 发布端口时,您可以将外部主机端口映射到不同的内部容器端口,例如docker run -p 8080:80,其中8080 是主机端口,80 是容器端口。
我的问题是,EXPOSE 是指内部容器端口还是外部主机端口?
【问题讨论】:
标签:
docker
dockerfile
port
【解决方案1】:
Dockerfile 中的EXPOSE 指令指的是容器端口。
【解决方案2】:
EXPOSE 指令记录了容器内的应用程序预期监听的端口。重要的词是“文件”。它不会改变 docker 运行容器的行为,不会发布端口,也不会影响容器之间的连接能力。
无论是否暴露端口,都需要单独发布端口才能从容器网络外部访问。并且无论你是否暴露端口,你都可以在同一个 docker 网络上的容器之间进行连接。
有多种工具可以使用此图像元数据自动发现您的应用程序。这包括-P 标志,用于在随机高编号主机端口上发布所有容器端口。您还将看到反向代理(如 traefik)在查询 docker 引擎以确定要用于容器的默认端口时使用它。
【解决方案3】:
EXPOSE 仅表示当前容器的那些公开端口对同一网络中的所有容器可用/公开。
【解决方案4】:
根据documentation,EXPOSE指令通知Docker容器在运行时监听指定的网络端口。所以它指的是内部的容器。
EXPOSE 允许容器与同一网络中的其他容器之间进行通信。但它不允许与主机或另一个网络中的容器通信!为了允许这样做,您需要使用-p 选项发布端口。