我正在尝试使用Dockerfiles,我想我理解大部分逻辑.但是,我没有看到在这种情况下"暴露"和"发布"端口之间的区别.
我首先看到的所有教程都包含EXPOSEDockerfile中的命令:
...
EXPOSE 8080
...
Run Code Online (Sandbox Code Playgroud)
然后他们从这个Dockerfile构建一个图像:
$ docker build -t an_image - < Dockerfile
Run Code Online (Sandbox Code Playgroud)
然后在运行映像时发布与上面相同的端口:
$ docker run -d -p 8080 an_image
Run Code Online (Sandbox Code Playgroud)
或使用发布所有端口
$ docker run -d -P an_image
Run Code Online (Sandbox Code Playgroud)
暴露Dockerfile中的端口有什么意义,如果它仍然会被发布?是否需要首先公开一个端口,而不是稍后发布它?实际上,我想在创建映像时指定我将在Dockerfile中使用的所有端口,然后再不打扰它们,只需运行它们:
$ docker run -d an_image
Run Code Online (Sandbox Code Playgroud)
这可能吗?
Gol*_*den 659
基本上,您有三种选择:
EXPOSE也没有-pEXPOSEEXPOSE和-p1)如果您既未指定EXPOSEnor -p,则只能从容器内部访问容器中的服务.
2)如果你EXPOSE是一个端口,容器中的服务不能从Docker外部访问,而是从其他Docker容器内部访问.所以这对于容器间通信很有用.
3)如果你EXPOSE和-p一个端口,容器中的服务可以从任何地方访问,甚至可以在Docker外部访问.
两者分开的原因是恕我直言,因为:
该文件明确规定:
该
EXPOSE指令公开了在链接中使用的端口.
它还指出了如何链接容器,这基本上是我所谈到的容器间通信.
PS:如果你这样做-p,但不这样做EXPOSE,Docker会暗示EXPOSE.这是因为如果一个端口对公众开放,它也会自动向其他Docker容器开放.因此-p包括EXPOSE.这就是为什么我没有把它作为第四种情况列在上面.
tgo*_*gos 124
EXPOSE是的方式记录--publish(或-p)是一种方式映射一个主机端口到正在运行的容器口请注意以下内容:
EXPOSE与Dockerfiles(记录)有关--publish与docker run ...(执行/运行时)有关公开和发布端口
在Docker网络中,有两种不同的机制直接涉及网络端口:公开和发布端口.这适用于默认桥接网络和用户定义的桥接网络.
您使用
EXPOSEDockerfile中的关键字或docker--exposerun标志公开端口.公开端口是记录使用哪些端口但实际上不映射或打开任何端口的方法.公开端口是可选的.您使用
--publish或--publish-all标记来发布端口docker run.这告诉Docker在容器的网络接口上打开哪些端口.发布端口时,它将映射到30000主机上可用的高位端口(高于),除非您在运行时指定要在主机上映射到的端口.在构建映像时(在Dockerfile中),无法指定要在主机上映射到的端口,因为无法保证端口在运行映像的主机上可用.来自:Docker容器网络
也,
暴露
...
--publish指令实际上没有发布端口.它在构建映像的人和运行容器的人之间起到一种文档的作用,关于哪些端口要发布.from:Dockerfile引用
-p/ EXPOSE未定义时的服务访问:在@Golo Roden的回答中说明::
"如果你没有指定任何一个,那么容器中的服务将无法从容器内部的任何地方访问."
也许这是在答案被写入时的情况,但现在看来,即使你不使用EXPOSE或者--publish,在EXPOSE和其他--publish同网络将能够访问你可能是容器内启动服务.
我使用了以下内容host.基本上,我从ubuntu开始并安装一个小型的Web服务器:
FROM ubuntu
RUN apt-get update && apt-get install -y mini-httpd
Run Code Online (Sandbox Code Playgroud)
我containers将图像作为"testexpose"和Dockerfile一个新容器:
docker run --rm -it testexpose bash
Run Code Online (Sandbox Code Playgroud)
在容器内部,我启动了几个实例build:
root@fb8f7dd1322d:/# mini_httpd -p 80
root@fb8f7dd1322d:/# mini_httpd -p 8080
root@fb8f7dd1322d:/# mini_httpd -p 8090
Run Code Online (Sandbox Code Playgroud)
然后我可以使用run主机或其他容器来获取主页mini-httpd.
将EXPOSE允许你定义私有(容器)和公共(主机)端口,在图像生成时揭露,容器运行时.公共端口是可选的,如果未指定公共端口,则docker将在主机上选择随机端口以在Dockerfile上公开指定的容器端口.
一个好的实践是不指定公共端口,因为它每个主机只限制一个容器(第二个容器将抛出已经在使用的端口).
您可以使用-pin docker run来控制暴露的容器端口可连接的公共端口.
无论如何,如果你不使用EXPOSE也-p不会暴露任何端口.
如果你总是使用-p在docker run你不需要EXPOSE,但如果你用EXPOSE你的docker run命令可能会更简单,EXPOSE如果你不关心什么端口将主机被暴露,或者如果你确信只有一个容器将被加载是有用的.
| 归档时间: |
|
| 查看次数: |
169867 次 |
| 最近记录: |