Node.js Docker自动绑定端口
当我在编写Dockerfile时没有公开任何端口,也没有在运行Node.js Docker自动绑定端口,node.js,docker,networking,dockerfile,Node.js,Docker,Networking,Dockerfile,当我在编写Dockerfile时没有公开任何端口,也没有在运行docker run时绑定任何端口时,我仍然能够与容器内运行的应用程序进行交互。为什么? 我正在为我的节点应用程序编写Dockerfile。它非常简单,如下所示: FROM node:8 COPY . . RUN yarn RUN yarn run build ARG PORT=80 EXPOSE $PORT CMD yarn run serve 使用这个Dockerfile,我可以使用docker build $ cd ~
docker run
时绑定任何端口时,我仍然能够与容器内运行的应用程序进行交互。为什么?
我正在为我的节点应用程序编写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运行-p 8080
然后,我访问了运行在Docker容器中的应用程序,其IP地址类似于http://172.17.0.12:8080/
,它可以工作
但是,当我从docker文件中删除
EXPOSE
指令,并删除docker run
中的-p
选项时,应用程序仍然可以工作!就像Docker自动绑定我的端口一样
补充说明:
EXPOSE
指令后,我尝试使用--无缓存
重建图像,但此问题仍然存在docker inspect
,我没有看到Config.ExposedPorts
Dockerfile中的
EXPOSE
命令实际上没有什么作用,我认为阅读Dockerfile的人更应该了解容器中运行的端口/服务。但是,当您使用大写-P
参数(-P,--publish all publish all publish all exposed port to random port)启动contianer时,EXPOSE
是有用的
但是如果使用小写的-p
,则必须指定源:目标端口。。。看到这个了吗
如果您不在Dockerfile中编写
EXPOSE
,则它不会对容器内的应用程序产生任何影响,它仅用于大写的-p
参数….谢谢您的回答,但我也没有指定-p
或-p
标志,因此我没有将主机的端口绑定到容器。所以它不应该工作。好的,但是IP地址172.17.0.12
是容器的IP,所以它总是会成功。。。-p
或-p
绑定所有主机网络接口的端口我假设您使用默认docker网络,并且所有docker运行命令都使用默认docker网络,如果您不希望此行为,您必须从主机创建自己的docker网络
。示例:如果您创建-p 9000:8080
,您至少可以通过两个选项访问容器服务1)http://localhost:9000/
或2)http://172.17.0.12:8080
(或其他容器IP)对……现在这更有意义了,谢谢!我会多读一点关于网络的内容,然后再给你回复!非常感谢你!
docker run -P my_image