Docker自动绑定端口

时间:2018-05-13 08:28:37

标签: node.js docker networking dockerfile

当我在编写我的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自动绑定我的端口

附加说明:

  1. another user似乎遇到了同样的问题
  2. 我在删除--no-cache说明后尝试使用EXPOSE重建我的图片,但此问题仍然存在。
  3. 使用docker inspect,我看不到Config.ExposedPorts
  4. 的条目

1 个答案:

答案 0 :(得分:1)

Dockerfile中的EXPOSE命令确实没有做太多事情,我认为读取Dockerfile的人更了解容器内运行的端口/服务。但是,当您使用大写EXPOSE参数启动contianer时,-P非常有用(-P, - publish - all将所有公开的端口发布到随机端口)

docker run -P my_image

但如果您使用小写-p,则必须指定来源:目标端口...请参阅此thread

如果你不在Dockerfile中编写EXPOSE,它对容器内的应用程序没有任何影响,它只适用于大写-P参数....