从Docker公开/发布端口

我有一个小的REST API在Docker容器中运行:

[2015-10-15 10:47:05] INFO WEBrick 1.3.1 [2015-10-15 10:47:05] INFO ruby 2.2.3 (2015-08-18) [x86_64-linux] [2015-10-15 10:47:05] INFO WEBrick::HTTPServer#start: pid=8 port=9292 

我有IP上的docker虚拟机:

 192.168.99.100 

我正在尝试发布/公开我的端口:

 docker run --publish 9292:9292 788a36b503e2 

泊坞窗ps显示:

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9d6b34469ebf 788a36b503e2 "/bin/sh -c 'rackup -" 45 seconds ago Up 44 seconds 0.0.0.0:9292->9292/tcp hopeful_bhaskara 

而我正在尝试打击REST API:

  curl 192.168.99.100:9292/auth/3/xyz 

但仍然出现错误:

  curl: (7) Failed to connect to 192.168.99.100 port 9292: Connection refused 

任何想法为什么? 谢谢

你之前这么说:

我有IP上的docker虚拟机:

192.168.99.100

如果您正在使用VirtualBox for VM,并且想要在本地计算机上访问此URL( http:// localhost:9292 ),则需要在VirtualBox上执行端口转发以访问VM。

警告:如果您的虚拟机具有防火墙(如ufw ),请将其禁用。 ( sudo ufw disable

按照以下步骤进行端口转发。

  1. 在本地机器上打开VirtualBox GUI。

  2. 在虚拟机列表中find您的虚拟机,然后从顶部导航栏中select设置

  3. 点击顶部导航栏上的networking图标

  4. select端口转发

  5. 点击右上angular的添加规则图标,然后填写您的主机端口9292和您的来宾端口9292

  6. 单击确定,然后确定,并设置前进。

现在,您可以访问本地机器上的http:// localhost:9292 。

有点更多的信息是需要的 –
你可以在容器 curl localhost:9292吗?
如果是这样,从运行容器的主机,你可以curl的URL(curl192.168.99.100:9292)?
如果是这样,REST服务器可能closures或错误configuration。

您是否使用标准图像(来自Docker集线器的d / l)? 如果是这样 – 请发送一个链接,这样就可以重新创build。

在一天结束的时候,我从来没有发现我做错了什么。 我采取了不同的方法解决问题,并通过使用Forman和Thin来解决。

我的Dockerfile:

 FROM buildpack-deps:jessie ENV RUBY_MAJOR 2.2 ENV RUBY_VERSION 2.2.3 ENV RUBY_DOWNLOAD_SHA256 df795f2f99860745a416092a4004b016ccf77e8b82dec956b120f18bdc71edce ENV RUBYGEMS_VERSION 2.4.8 # skip installing gem documentation RUN echo 'install: --no-document\nupdate: --no-document' >> "$HOME/.gemrc" # some of ruby's build scripts are written in ruby # we purge this later to make sure our final image uses what we just built RUN apt-get update \ && apt-get install -y bison libgdbm-dev ruby \ && rm -rf /var/lib/apt/lists/* \ && mkdir -p /usr/src/ruby \ && curl -fSL -o ruby.tar.gz "http://cache.ruby-lang.org/pub/ruby/$RUBY_MAJOR/ruby-$RUBY_VERSION.tar.gz" \ && echo "$RUBY_DOWNLOAD_SHA256 *ruby.tar.gz" | sha256sum -c - \ && tar -xzf ruby.tar.gz -C /usr/src/ruby --strip-components=1 \ && rm ruby.tar.gz \ && cd /usr/src/ruby \ && autoconf \ && ./configure --disable-install-doc \ && make -j"$(nproc)" \ && make install \ && apt-get purge -y --auto-remove bison libgdbm-dev ruby \ && gem update --system $RUBYGEMS_VERSION \ && rm -r /usr/src/ruby # install things globally, for great justice ENV GEM_HOME /usr/local/bundle ENV PATH $GEM_HOME/bin:$PATH ENV BUNDLER_VERSION 1.10.6 RUN gem install bundler --version "$BUNDLER_VERSION" \ && bundle config --global path "$GEM_HOME" \ && bundle config --global bin "$GEM_HOME/bin" # don't create ".bundle" in all our apps ENV BUNDLE_APP_CONFIG $GEM_HOME COPY app /auth_app WORKDIR /auth_app RUN bundle install CMD ["foreman","start","-d","/auth_app"] EXPOSE 4567 

我的Gemfile:

 source 'https://rubygems.org' gem 'sinatra' gem 'foreman' gem 'nori' gem 'thin' gem 'rack' gem 'rack-test' 

我的Procfile:

 web: bundle exec rackup --env dev config.ru -p 4567 -s thin -o 0.0.0.0 

我的docker命令运行它:

 docker run -p 4567:4567 -d auth_app 

我没有改变应用程序内的任何代码,只是docker部署设置,它像一个魅力然后。 感谢你的答案,他们至less帮助我把注意力集中到正确的问题上,并提出正确的问题来解决问题。

如果你正在跑步

 docker run --publish 9292:9292 788a36b503e2 

您将9292容器的端口与主机上的同一端口绑定。 所以跑步

  curl localhost:9292/auth/3/xyz 

从主持人应该工作。

你的Dockerfile是什么样的?

您必须在EXPOSE docker run命令EXPOSE的端口用-p标志显示出来。