当我不在编写我的Dockerfile时暴露任何端口时,在运行docker run
时我也没有绑定任何端口,我仍然可以与在其中运行的应用程序进行交互容器。为什么?
我正在为我的Node应用程序编写Dockerfile。这很简单,看起来像这样:
FROM node:8
COPY . .
RUN yarn
RUN yarn run build
ARG PORT=80
EXPOSE $PORT
CMD yarn run serve
使用此Dockerfile,我能够使用docker build
$ cd ~/project/dir/
$ docker build . --build-arg PORT=8080
使用docker run
$ docker run -p 8080 <image-id>
然后我访问了在Docker容器内运行的应用程序,在http://172.17.0.12:8080/
这样的IP地址上运行。
但是,当我从Dockerfile中删除EXPOSE
指令并删除-p
中的docker run
选项时,该应用程序仍可正常运行!这就像Docker自动绑定我的端口
附加说明:
--no-cache
说明后尝试使用EXPOSE
重建我的图片,但此问题仍然存在。docker inspect
,我看不到Config.ExposedPorts
答案 0 :(得分:1)
Dockerfile中的EXPOSE
命令确实没有做太多事情,我认为读取Dockerfile的人更了解容器内运行的端口/服务。但是,当您使用大写EXPOSE
参数启动contianer时,-P
非常有用(-P, - publish - all将所有公开的端口发布到随机端口)
docker run -P my_image
但如果您使用小写-p
,则必须指定来源:目标端口...请参阅此thread
如果你不在Dockerfile中编写EXPOSE
,它对容器内的应用程序没有任何影响,它只适用于大写-P
参数....