当前位置: 首页 > 面试题库 >

Docker端口未公开

司寇经亘
2023-03-14
问题内容

我在Docker中设置了一个简单的节点服务器

Docker文件

FROM node:latest
RUN apt-get -y update
ADD example.js .
EXPOSE 1337   
CMD node example.js

example.js

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n'+new Date);
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

现在建立图像

$ docker build -t node_server .

现在在容器中运行

$ docker run -p 1337:1337 -d node_server  
$ 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70

验证容器正在运行并且端口已映射:

$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
5909e87302ab        node_server         "/bin/sh -c 'node exa"   7 seconds ago       Up 6 seconds        0.0.0.0:1337->1337/tcp   grave_goldberg

现在,让我们附加到容器并验证服务器是否在其中运行:

$ docker exec -it 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70 /bin/bash

并在容器命令行中输入:

root@5909e87302ab:/# curl http://localhost:1337
Hello World
Mon Feb 15 2016 16:28:38 GMT+0000 (UTC)

看起来不错吧?

问题

当我在主机上执行相同的curl命令(或使用浏览器导航到http://
localhost:1337
)时,什么都看不到。

知道为什么容器和主机之间的端口映射不起作用吗?

我已经尝试过的事情:

  • 带着--expose 1337旗帜跑

问题答案:

端口正确暴露,但是服务器正在侦听127.0.0.1容器内部的连接:

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n'+new Date);
}).listen(1337, '127.0.0.1');

您需要像这样运行服务器:

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n'+new Date);
}).listen(1337, '0.0.0.0');

请注意0​​.0.0.0而不是127.0.0.1。



 类似资料:
  • 问题内容: 所以我有3个端口应该暴露在机器的接口中。使用Docker容器可以做到这一点吗? 问题答案: 要只暴露一个端口,这是您需要做的: 要公开多个端口,只需提供多个参数:

  • 我正在尝试创建一个Docker容器,它的作用就像一个完整的虚拟机。我知道我可以使用Dockerfile中的EXPOSE指令来公开端口,并且我可以使用标志和来分配端口,但是一旦容器实际运行,是否有命令来实时打开/映射其他端口? 例如,假设我有一个正在运行sshd的Docker容器。另一个使用容器SSH的人安装了httpd。有没有一种方法可以公开容器上的端口80,并将其映射到主机上的端口8080,这样

  • 我向主机公开contaners的docker端口 然后,我尝试显示所有侦听端口,以便使用netstat进行调试,例如: 奇怪的是netstat不会显示我的带有暴露端口的docker容器,尽管它们正在监听并回复浏览器。 如何让显示这些暴露的端口? 更新:我在Debian 8 Jessie上运行这个。我是这么做的: docker在此报告将容器端口转发到主机。此外,如果我停止工作流nginx容器,它将停

  • 我可以在Dockerfile中指定端口范围吗 并且在运行容器时将所有这些暴露的端口绑定到主机上的相同端口?

  • 问题内容: 我正在尝试创建一个行为像完整虚拟机的Docker容器。我知道我可以在Dockerfile中使用EXPOSE指令公开端口,并且可以使用标志来分配端口,但是一旦容器实际运行,是否有命令打开/映射其他端口? 例如,假设我有一个运行sshd的Docker容器。有人使用ssh容器安装了httpd。有没有办法公开容器上的端口80并将其映射到主机上的端口8080,以便人们可以访问容器中运行的Web服