简短答案:
EXPOSE
是的一种方式文档化
--publish
(或-p
)是一种方式映射一个主机端口到正在运行的容器口
请注意以下几点:
EXPOSE
与Dockerfiles
(记录)有关
--publish
与docker run ...
(执行/执行阶段)有关
公开和发布端口
在Docker网络中,有两种直接涉及网络端口的不同机制:公开端口和发布端口。这适用于默认桥接网络和用户定义的桥接网络。
您可以使用EXPOSE
Dockerfile中的关键字或docker run的--expose
标志公开端口。公开端口是一种记录使用了哪些端口的方式,但实际上并没有映射或打开任何端口。公开端口是可选的。
您可以使用--publish
或--publish-all
标志发布端口docker run
。这告诉Docker在容器的网络接口上打开哪些端口。发布端口后30000
,除非您在运行时指定要映射到主机上的端口,否则它将映射到主机上可用的高阶端口(高于)。在构建映像时(在Dockerfile中),您无法指定要映射到主机上的端口,因为无法保证端口将在运行映像的主机上可用。
来自:Docker容器网络
2019年10月更新:以上文本不再在文档中,而是此处的存档版本:docs.docker.com/v17.09/engine/userguide/networking/#exposed-and-publishing-ports
也许当前文档如下:
发布的端口
默认情况下,创建容器时,它不会将其任何端口发布到外界。要使端口可用于Docker外部的服务或未连接到容器网络的Docker容器,请使用--publish
或-p
标志。这将创建一个防火墙规则,该规则将容器端口映射到Docker主机上的端口。
并可以在这里找到:docs.docker.com/config/containers/container-networking/#published-ports
也,
暴露
...该EXPOSE
指令实际上并未发布端口。它充当构建映像的人员和运行容器的人员之间的一种文档类型,有关打算发布哪些端口的信息。
来自:Dockerfile参考
未定义EXPOSE
/ 时的服务访问权限--publish
:
在@Golo罗登的回答更说明::
“如果不指定任何内容,则只能从容器本身内部访问任何地方的容器中的服务。”
也许这是在答案被写入时的情况,但现在看来,即使你不使用EXPOSE
或者--publish
,在host
和其他containers
同网络将能够访问你可能是容器内启动服务。
如何测试:
我已经使用了以下内容Dockerfile
。基本上,我从ubuntu开始并安装一个小型Web服务器:
FROM ubuntu
RUN apt-get update && apt-get install -y mini-httpd
我build
将图像显示为“ testexpose”,并添加run
了一个新容器:
docker run --rm -it testexpose bash
在容器内,我启动了以下几个实例mini-httpd
:
root@fb8f7dd1322d:/# mini_httpd -p 80
root@fb8f7dd1322d:/# mini_httpd -p 8080
root@fb8f7dd1322d:/# mini_httpd -p 8090
然后,我就可以curl
从主机或其他容器中使用来获取的主页mini-httpd
。