【问题标题】:Docker container with Node and Express on Mac, not showing in browser?Mac 上带有 Node 和 Express 的 Docker 容器,未在浏览器中显示?
【发布时间】: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 的想法,但我无法让最简单的东西运行。谢谢!

【问题讨论】:

    标签: node.js macos localhost docker boot2docker


    【解决方案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 ...你为我破解了它!
    猜你喜欢
    • 2020-11-10
    • 2018-11-13
    • 1970-01-01
    • 2019-01-15
    • 2015-09-15
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多