尝试使用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:
答案 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执行相同的操作。
答案 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。