docker 端口映射的一些疑问

在docker里我pull了一个node镜像,然后创建了一个容器,挂载了我本地的一个文件夹,将本地的10086端口映射到我即将在容器里运行的node服务的9000端口
clipboard.png

以下是node那个文件的代码

var http = require('http')
http.createServer((req,res)=>{
    res.writeHead(200,{'Content-Type':'text/plain'})
    res.end('hello world\n')
}).listen(9000,'127.0.0.1');

当我加上host:127.0.0.1,那我从宿主机的127.0.0.1:10086端口并不能访问到这个服务
当我删除host配置,我就可以访问到,看node是说不填就是默认host:0.0.0.0

这时候我就有疑问了,我在虚拟机的容器里运行node,使用127.0.0.1不是指的当前的运行环境(虚拟机)?
如果127.0.0.1指向的是容器,那我的node应该就是放在容器的9000端口,那为什么外部的端口映射到容器的9000无法访问

这时候我想是不是127.0.0.1不是指的本身,我同学让我看etc/hosts,然后发现没有,是不是指因为没有配置所以127.0.0.1并不是指向自己

中间ipconfig看docker的虚拟网卡的地址,我另一个朋友说 实际上是宿主机的127.0.0.1:10086指向的是172.?.?.? 容器的端口,这时候我就晕了,这里面到是什么问题

下图是ipconfig看到的docker用的局域网地址
clipboard.png

阅读 4.1k
2 个回答

127.0.0.1 是一个特殊的 ip ,每台机器的 127.0.0.1 都是它自己,宿主机的 127.0.0.1 是宿主机,容器的 127.0.0.1 是容器。

端口转发的过程中会重写目标 IP ,因为是要把包发往一个不同机器(宿主机跟容器逻辑上是两台不同的机器)。你在容器里的 9000 端口收到的连接不是发往 127.0.0.1 的(地址已经被改写了)。于是不匹配。

listen 在 127.0.0.1 的端口,只能接受来自本机的连接,其它地方来的一律是连不上的。使用 docker ,宿主机跟容器逻辑上是两台不同机器,连不上很正常。

容器分配的ip才是你的目的ip,宿主机的127.0.0.1只是源ip

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题