3

我正在研究 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 的想法,但我无法让最简单的东西运行。谢谢!

4

1 回答 1

4

boot2docker 有一个额外的网络

有一层额外的网络阻碍。请记住,boot2docker 有它自己的操作系统和额外的网络 IP,所以url=http://$(boot2docker ip):3001;curl -v "${url}"从你的 mac 上的终端尝试,看看它是否从你的 express 应用程序返回 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 连接到它。

于 2014-08-05T17:05:07.680 回答