Mac 上带有 Node 和 Express 的 Docker 容器,未在浏览器中显示?

Posted

技术标签:

【中文标题】Mac 上带有 Node 和 Express 的 Docker 容器,未在浏览器中显示?【英文标题】:Docker container with Node and Express on Mac, not showing in browser? 【发布时间】:2014-09-28 10:31:17 【问题描述】:

我正在深入研究 Docker,我正在努力思考为什么这对我不起作用。我已经阅读了很多关于如何设置它的文章和教程,我似乎已经准备好了一切,但我的实际应用程序没有显示在浏览器中 (localhost:3001)。我在我的 Mac 上使用最新版本的 Docker,运行 Mavericks,使用 boot2docker。我确实让 boot2docker 运行,因为 docker 命令运行良好,并且没有出现任何相关的错误。

超级简单的项目是这样的:

src/
..index.js
..package.json
Dockerfile

src/index.js 文件如下所示:

var express = require('express'),
    app = express();

app.get('/', function(req, res)
  res.send('Hello world!');
);

app.listen(3001);

src/package.json 文件如下所示:


  "name": "node-docker-example",
  "version": "0.0.1",
  "description": "A NodeJS webserver to run inside a docker container",
  "main": "index.js",
  "dependencies": 
     "express": "*"
  

Dockerfile 文件如下所示:

FROM ubuntu:14.04

# make sure apt is up to date
RUN apt-get update

# install nodejs and npm
RUN apt-get install -y nodejs npm git git-core

# add source files
ADD /src /srv

# set the working directory to run commands from
WORKDIR /srv

# install the dependencies
RUN npm install

# expose the port so host can have access
EXPOSE 3001

# run this after the container has been instantiated
CMD ["nodejs", "index.js"]

所有这些都到位后,我就在本地构建它:

$ docker build -t me/foo .

没问题...然后我尝试了一些其他方法让它运行,但是这些都不起作用并且我在浏览器中查看时看不到任何响应 (localhost:3001 )

$ docker run -i -t me/foo
$ docker run -i -t -p 3001:3001 me/foo
$ docker run -i -t -p 127.0.0.1:3001:3001 me/foo

似乎没有任何效果,没有错误出现...好吧,除了浏览器中的localhost:3001完全没有任何作用

请帮帮我!我喜欢 docker 的想法,但我无法让最简单的东西运行。谢谢!

【问题讨论】:

【参考方案1】:

boot2docker 有一个额外的网络

还有一层额外的网络阻碍。请记住,boot2docker 有它自己的操作系统和额外的网络 IP,所以请从您的 Mac 上的终端尝试url=http://$(boot2docker ip):3001;curl -v "$url",看看它是否从您的快速应用程序返回 html。如果是这样,您可以使用open "$url" 浏览到您的应用。

我能够获取您的文件(感谢您发布完整文件!)并在本地构建和运行您的图像。

像这样构建、运行和测试它

docker build -t foo .
docker run -i -t -p 3001:3001 foo

我认为要注意的关键是docker build-t 参数表示“标签”,但docker run 表示“分配一个tty”。

像这样测试它(在与它交互运行的单独终端中)

curl -s "$(boot2docker ip):3001"

这就是你出错的地方

或者至少是我的猜测:

$ docker run -i -t me/foo

不映射任何端口

$ docker run -i -t -p 3001:3001 me/foo

我认为理论上这个变体应该可以工作。如果不是,我很确定这是 IP 层上特定于 boot2docker 的网络问题。

$ docker run -i -t -p 127.0.0.1:3001:3001 me/foo

这是告诉 docker 绑定到 docker 服务器上的环回,而不是你的 mac,所以你永远无法从你的 mac 连接到它。

【讨论】:

嗨,彼得,感谢您的回复。我尝试了你建议的第一个命令,但我得到了这个:*即将连接()到 192.168.59.103 端口 3001(#0)*尝试 192.168.59.103...*添加句柄:conn:0x7fd0e1804000*添加句柄:发送: 0 * 添加句柄:recv:0 * Curl_addHandleToPipeline:长度:1 * - Conn 0 (0x7fd0e1804000) send_pipe: 1, recv_pipe: 0 * 连接到 192.168.59.103:3001 失败; Connection denied * Closing connection 0 curl: (7) Failed connect to 192.168.59.103:3001;连接被拒绝 试试CMD ["node", "index.js"]。我认为您的 express 应用程序尚未成功启动和运行,这就是我对原因的猜测。 再次您好...它必须是 nodejs,因为这就是 node 与特定版本的 Ubuntu 一起安装的方式。我通常会将它符号链接为“节点”,但为了简单起见,我没有在这种情况下。无论如何我都试过了,可惜没有运气。 好的,我在本地构建并运行了您的应用程序,并发表了我的想法。也许这会让你继续前进。 谢谢@PeterLyons ...你为我破解了它!

以上是关于Mac 上带有 Node 和 Express 的 Docker 容器,未在浏览器中显示?的主要内容,如果未能解决你的问题,请参考以下文章

mac下配置Node.js开发环境express安装创建项目

静态文件,带有 Node.js 和 Express 的样式表

在带有 Node 和 Express 的 IE10 中使用 CORS 的安全错误

带有 Express 异步 API 调用的 Node.JS

带有 express-unless 的 Node.js express-jwt 给出警告“对象可能是'未定义'”

带有 Express 框架的 Node.js 中的自定义事件