2014-02-12 2 views
2

boot2docker를 사용하여 Mac OS X에서 도커를 실행하려고합니다.Mac OS X에서 boot2docker로 도커 실행 중입니까?

모든 게 잘된 것처럼 보이지만 도커 이미지를 실행할 수 없습니다. 나는 명백한 것을 놓치고 있어야합니다.

가이드 내가 사용했습니다 :

NodeJs Web App
Docker on Mac OS X

내 고정 표시기 파일 : test.js의

@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 

내용 :

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 

도커 출력을 구축 :

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가 실행되고 :

[email protected] (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. 
[email protected] (master) ~/work/front-portal: 

을 그리고 내 노드가 파일을 test.js : 간단한 에코 작동

[email protected] (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. 
[email protected] (master) ~/work/front-portal: 

있지만 :

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

하지만 난이 고정 표시기를 시작할 수 없습니다 괜찮습니다 :

[email protected] (master) ~/work/front-portal: node test.js 
Running on http://localhost:8080 

[email protected] (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. 
[email protected] (master) ~/work/front-portal: 

답변

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

0

참조하십시오.

detached에 "-d"옵션을 추가하여 백그라운드에서 실행합니다. 그리고 이것이 작동하지 않는다면 다음을 실행하여 컨테이너에 bash를 시작할 수 있습니다 (참고로, dockerfile에서 ENTRYPOINT 대신 CMD를 사용하는 컨테이너를 재정의 할 수 있습니다.) 누군가가 ENTRYPOINT를 가지고 있으면 그것을 오버라이드하고 bash를 컨테이너로 시작). 당신이 당신의 서비스가 수신 될 포트를 공격 할 수 있도록하려면

 
docker run -i -t image_id /bin/bash 

또한, 일부 포트 포워딩을 수행해야합니다. 도커 파일의 expose 명령은 도커 호스트에서 실행중인 다른 컨테이너가 포트를 공격 할 수있게하지만 호스트 또는 boot2docker VM이 포트를 볼 수 없도록합니다. 나는 당신이 도커가 $ container_id를 검사하고 정확한 IP와 포트를 찾을 수있을 것이라고 생각하지만 포트 포워딩 설정이 더 쉽다는 것을 알게되었습니다.포트를 컨테이너에서 VM으로 전달하고 VM에서 호스트로 포워딩해야합니다. 이것은 당신의 boot2docker-VM에 0.0.0.0:80에 컨테이너에 8080을 전달합니다

 
docker run -p :80:8080 image_name 

: 호스트로 컨테이너에서 전달의 경우, -p 옵션을 사용합니다. 설정 전달하기 위해 VM에서 호스트로, 같은 규칙에 VirtualBox를 열고 입력 : 그 규칙은 로컬 컴퓨터의 포트 80에서 설정할 수 있습니다 포트 포워딩에 VM의 포트 80에서 전달하는

 
open_80 0.0.0.0 :80 _blank_ :80 

을 커맨드 라인 (Andy가 위에 지적한 것)과 비슷하지만 boot2docker를 중지해야합니다.