在mac os x上使用boot2docker运行docker?

时间:2014-02-12 16:34:42

标签: macos node.js docker

尝试使用boot2docker在我的mac os x上运行docker。

一切似乎都很好,但我无法运行码头图像。我一定错过了一些明显的东西。

我用过的指南:

NodeJs Web App
Docker on Mac OS X

我的码头文件:

FROM    ubuntu:12.04

# Build dependencies
RUN apt-get -y update
RUN apt-get install build-essential -y
RUN apt-get install curl -y 
# Install NodeJS
RUN curl -L http://nodejs.org/dist/v0.10.22/node-v0.10.22.tar.gz | tar -xz
RUN cd /node-v0.10.22 && ./configure
RUN cd /node-v0.10.22 && make && make install && make clean
# Global NPM installs
RUN npm install --silent -g express lodash ejs forever

RUN mkdir /app
ADD server.js /app/server.js
ADD dist /app/dist
ADD lib /app/lib
Add test.js /app/test.js
CMD ["node", "/app/test.js"]
EXPOSE 8080

Docker构建输出:

@xp (master) ~/work/front-portal: docker build -t front-portal .
Uploading context 118.7 MB
Uploading context 
Step 0 : FROM    ubuntu:12.04
 ---> 9cd978db300e
Step 1 : RUN apt-get -y update
 ---> Using cache
 ---> ee9a4b864ffb
Step 2 : RUN apt-get install build-essential -y
 ---> Using cache
 ---> e7dd304d6f92
Step 3 : RUN apt-get install curl -y
 ---> Using cache
 ---> ded30df6d5c2
Step 4 : RUN curl -L http://nodejs.org/dist/v0.10.22/node-v0.10.22.tar.gz | tar -xz
 ---> Using cache
 ---> d132c9cdd09c
Step 5 : RUN cd /node-v0.10.22 && ./configure
 ---> Using cache
 ---> 9036f0ce77d2
Step 6 : RUN cd /node-v0.10.22 && make && make install && make clean
 ---> Using cache
 ---> c29bcfa1d058
Step 7 : RUN npm install --silent -g express lodash ejs forever
 ---> Using cache
 ---> d389052f5e49
Step 8 : RUN mkdir /app
 ---> Using cache
 ---> 33576951eb9b
Step 9 : ADD server.js /app/server.js
 ---> Using cache
 ---> 2a4aa2230170
Step 10 : ADD dist /app/dist
 ---> Using cache
 ---> 4350b786481c
Step 11 : ADD lib /app/lib
 ---> Using cache
 ---> 58b0a3850c01
Step 12 : Add test.js /app/test.js
 ---> Using cache
 ---> 441d63b47297
Step 13 : CMD ["node", "/app/test.js"]
 ---> Using cache
 ---> 013aaa78b0a5
Step 14 : EXPOSE 8080
 ---> Running in 8962747dd91a
 ---> 7410cc1bdbed
Successfully built 7410cc1bdbed

test.js的内容:

var express = require('express');

// Constants
var PORT = 8080;

// App
var app = express();
app.get('/', function (req, res) {
  res.send('Hello World\n');
});

app.listen(PORT)
console.log('Running on http://localhost:' + PORT);

Boot2docker正在运行:

g@xp (master) ~/work/front-portal: ./boot2docker status
[2014-02-12 18:32:50] boot2docker-vm is running.
g@xp (master) ~/work/front-portal: 

但是我无法启动docker:

g@xp (master) ~/work/front-portal: DEBUG=1 docker run front-portal

[debug] commands.go:2484 [hijack] End of stdout
[debug] commands.go:2079 End of CmdRun(), Waiting for hijack to finish.
g@xp (master) ~/work/front-portal: 

虽然简单的回声起作用:

g@xp (master) ~/work/front-portal: DEBUG=1 docker run front-portal echo "test"
test
[debug] commands.go:2484 [hijack] End of stdout
[debug] commands.go:2079 End of CmdRun(), Waiting for hijack to finish.
g@xp (master) ~/work/front-portal: 

我的节点test.js文件没问题:

g@xp (master) ~/work/front-portal: node test.js
Running on http://localhost:8080

g@xp (master) ~/work/front-portal: DEBUG=1 docker run front-portal ls -al /app/test.js
-rw-r--r-- 1 501 dialout 232 Feb 12  2014 /app/test.js
[debug] commands.go:2484 [hijack] End of stdout
[debug] commands.go:2079 End of CmdRun(), Waiting for hijack to finish.
g@xp (master) ~/work/front-portal: 

2 个答案:

答案 0 :(得分:5)

您需要明确启用NAT传递的端口。

The "docker" port is already configured this way, as is SSH.但是仍然需要启用特定于应用程序的端口。

您可以使用类似

的内容

VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port4000,tcp,,4000,,4000"

通过命令行添加新的转发规则。该示例添加了端口4000.或者您可以使用VirtualBox GUI执行相同的操作。

另见http://www.virtualbox.org/manual/ch06.html#natforward

答案 1 :(得分:0)

我认为你没有将正确的参数传递给run命令。

为分离添加“-d”选项以在后台运行它。如果这不起作用,你可以通过运行以下命令在容器上启动bash(注意,你的容器可以被覆盖,而你在dockerfile中使用CMD而不是ENTRYPOINT。如果某人有ENTRYPOINT,你将无法覆盖它并用容器启动bash。

docker run -i -t image_id /bin/bash

此外,如果您希望能够访问您的服务将要监听的端口,则需要执行一些端口转发。 docker文件中的expose命令将允许在docker主机上运行的其他容器能够访问该端口,但它不允许您的主机或boot2docker vm查看它。我想你可以做一个docker检查$ container_id并找到正确的ip和端口命中,但我发现设置端口转发更容易。您需要将端口从容器转发到vm,然后从vm转发到主机。要从容器转发到主机,请使用-p选项:

docker run -p :80:8080 image_name

这会将容器上的8080转发到boot2docker-vm上的0.0.0.0:80。要设置从虚拟机转发到主机的转发,请打开虚拟机并输入以下规则:

open_80 0.0.0.0 :80   _blank_ :80

该规则是从vm的端口80转发到本地计算机的端口80.可以从命令行设置端口转发(就像Andy上面指出的那样),但是你需要停止boot2docker。