无法获取在Docker容器中运行的AngularJS站点

我有一个angular度的网站,我试图在docker集装箱运行(只能通过boot2docker现在)。

Dockerfile看起来如下所示:

 FROM ubuntu:14.04 RUN sudo apt-get update RUN sudo apt-get install -y npm # Set in what directory commands will run WORKDIR /home/app # Put all our code inside that directory that lives in the container ADD . /home/app RUN sudo npm install && \ sudo npm install -g grunt-cli #Need to do this for npm and bower RUN ln -s /usr/bin/nodejs /usr/bin/node # Install dependencies RUN sudo npm install -g bower && \ sudo npm install -g grunt-cli && \ sudo npm install && \ bower install --config.interactive=false --allow-root EXPOSE 9000 # The command to run our app when the container is run ENTRYPOINT ["npm","start"] 

当我运行docker build -t web-app . 图像生成良好。

我运行以下命令来为容器加星标

 docker run --name my-web-app -p 9000:9000 -d web-app 

如果我运行docker logs我可以看到它正在工作…

 > sb-admin@0.0.0 start /home/app > grunt serve Running "serve" task Running "clean:server" (clean) task Cleaning .tmp...OK Running "concurrent:server" (concurrent) task Running "copy:styles" (copy) task Copied 3 files Done, without errors. Execution Time (2015-07-27 05:04:02 UTC) loading tasks 2ms ▇▇▇▇▇▇▇▇▇ 18% copy:styles 9ms ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 82% Total 11ms Running "autoprefixer:dist" (autoprefixer) task File .tmp/styles/main.css created. File .tmp/styles/sb-admin-2.css created. File .tmp/styles/timeline.css created. Running "connect:livereload" (connect) task Started connect web server on http://localhost:9000 Running "watch" task Waiting... 

如果我手动运行npm start (不在容器中,只是在我的本地),该站点可在http://localhost:9000 ,但是当我导航到从IP=$(boot2docker ip)获得的IP地址时,得到连接拒绝。

同样的情况发生,如果我SSH进入容器,并运行以下任何:

 IP=$(docker inspect -f "{{ .NetworkSettings.IPAddress }}" my-web-app) curl -X GET $IP:9000 

我觉得我已经跑了像这样的容器hundres访问他们罚款,所以我不知道我在做什么错了。

在容器内而不是本地主机上工作时,应该将主机名设置为0.0.0.0

例如,我们使用docker来开发具有NPM,Bower&Grunt构build堆栈的Angular应用程序。 我们在开发时使用grunt serve任务。 为了使这个工作在一个容器中,我们在connect任务中创build了一个container目标,并覆盖默认设置。

它看起来像这样:

 connect: { options: { port: 9000, hostname: 'localhost', livereload: 35729 }, container: { options: { hostname: '0.0.0.0', open: true, middleware: function (connect) { return [ connect.static('.tmp'), connect().use( '/bower_components', connect.static('./bower_components') ), connect.static(appConfig.app) ]; } } }, ... } 

这里的container目标是livereload目标的副本,但hostname overriden。

根据您用于为应用程序提供服务的NPM模块,您可能可以configuration主机名,或者将在localhost上创build模块,或者在本地计算机上侦听所有IP地址: 0.0.0.0