Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Docker自动绑定端口_Node.js_Docker_Networking_Dockerfile - Fatal编程技术网

Node.js Docker自动绑定端口

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 ~

当我在编写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 ~/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